ฉันคิดว่าทิมพูดได้ค่อนข้างดีแต่ลองย้อนกลับไป:
องค์ประกอบ DOM เป็นวัตถุสิ่งหนึ่งในหน่วยความจำ เช่นเดียวกับวัตถุมากที่สุดใน OOP ก็มีคุณสมบัติ นอกจากนี้ยังแยกแผนที่ของแอตทริบิวต์ที่กำหนดไว้ในองค์ประกอบ (โดยปกติจะมาจากมาร์กอัพที่เบราว์เซอร์อ่านเพื่อสร้างองค์ประกอบ) บางส่วนขององค์ประกอบของคุณสมบัติได้รับของพวกเขาเริ่มต้นค่าจากคุณลักษณะที่มีชื่อเดียวกันหรือคล้ายกัน ( value
ได้รับค่าเริ่มต้นจากแอตทริบิวต์ "ค่า"; href
ได้รับค่าเริ่มต้นจากแอตทริบิวต์ "href" แต่ก็ไม่ได้ว่าค่าเดียวกัน; className
จาก แอตทริบิวต์ "class") คุณสมบัติอื่น ๆ จะได้รับค่าเริ่มต้นด้วยวิธีอื่น: ตัวอย่างเช่นparentNode
คุณสมบัติจะได้รับค่าตามสิ่งที่องค์ประกอบหลักคือstyle
ไม่ว่าจะมีคุณสมบัติ "สไตล์" หรือไม่
ลองพิจารณาจุดยึดนี้ในหน้าที่http://example.com/testing.html
:
<a href='foo.html' class='test one' name='fooAnchor' id='fooAnchor'>Hi</a>
ศิลปะ ASCII ที่ไม่ต้องเสียค่าใช้จ่าย (และทิ้งอะไรมากมาย):
+ + -------------------------------------------
| HTMLAnchorElement |
+ + -------------------------------------------
| href: "http://example.com/foo.html" |
| ชื่อ: "fooAnchor" |
| id: "fooAnchor" |
| className: "test one" |
| คุณสมบัติ: |
| href: "foo.html" |
| ชื่อ: "fooAnchor" |
| id: "fooAnchor" |
| คลาส: "ทดสอบหนึ่ง" |
+ + -------------------------------------------
โปรดทราบว่าคุณสมบัติและคุณสมบัตินั้นแตกต่างกัน
ตอนนี้แม้ว่าพวกเขาจะแตกต่างกันเพราะทั้งหมดนี้วิวัฒนาการมาแทนที่จะถูกออกแบบมาจากพื้นดินขึ้นจำนวนของคุณสมบัติเขียนกลับไปที่คุณลักษณะที่พวกเขาได้รับจากถ้าคุณตั้งพวกเขา แต่ไม่ทั้งหมดทำและอย่างที่คุณเห็นจากhref
ด้านบนการทำแผนที่ไม่ใช่ "ส่งผ่านค่าใน" เสมอบางครั้งก็มีการตีความที่เกี่ยวข้อง
เมื่อฉันพูดถึงคุณสมบัติที่เป็นคุณสมบัติของวัตถุฉันไม่ได้พูดในเชิงนามธรรม นี่คือโค้ดที่ไม่ใช่ jQuery:
var link = document.getElementById('fooAnchor');
alert(link.href); // alerts "http://example.com/foo.html"
alert(link.getAttribute("href")); // alerts "foo.html"
(ค่าเหล่านั้นตามเบราว์เซอร์ส่วนใหญ่มีการเปลี่ยนแปลงบางอย่าง)
link
วัตถุเป็นสิ่งที่จริงและคุณสามารถเห็นว่ามีความแตกต่างจริงระหว่างการเข้าถึงสถานที่ให้บริการในนั้นและเข้าถึงแอตทริบิวต์
ดังที่ทิมกล่าวว่าส่วนใหญ่แล้วเราต้องการทำงานกับอสังหาริมทรัพย์ ส่วนหนึ่งเป็นเพราะค่าของพวกเขา (แม้แต่ชื่อ) มีแนวโน้มที่จะสอดคล้องกันมากขึ้นในเบราว์เซอร์ เราส่วนใหญ่ต้องการทำงานกับคุณลักษณะเฉพาะเมื่อไม่มีคุณสมบัติที่เกี่ยวข้อง (คุณสมบัติที่กำหนดเอง) หรือเมื่อเรารู้ว่าสำหรับคุณลักษณะเฉพาะนั้นแอตทริบิวต์และคุณสมบัตินั้นไม่ใช่ 1: 1 (เช่นเดียวกับhref
"href" ด้านบน) .
คุณสมบัติมาตรฐานถูกจัดวางในข้อกำหนดต่างๆของ DOM:
สเปคเหล่านี้มีดัชนีที่ยอดเยี่ยมและฉันแนะนำให้เก็บลิงค์ไว้ในที่มีประโยชน์ ฉันใช้พวกเขาตลอดเวลา
ตัวอย่างเช่นแอตทริบิวต์ที่กำหนดเองรวมถึงdata-xyz
แอตทริบิวต์ใด ๆ ที่คุณอาจใส่ไว้ในองค์ประกอบต่างๆเพื่อให้ meta-data แก่โค้ดของคุณ (ตอนนี้สามารถใช้งานได้กับ HTML5 ตราบใดที่คุณยึดติดกับdata-
คำนำหน้า) (jQuery รุ่นล่าสุดให้คุณเข้าถึงdata-xyz
องค์ประกอบผ่านdata
ฟังก์ชั่น แต่ฟังก์ชั่นนี้ไม่ได้เป็นเพียงแค่ accessor สำหรับdata-xyz
คุณสมบัติ [มันทำทั้งมากและน้อยกว่านั้น]; เว้นแต่คุณจะต้องการคุณสมบัติจริง ๆ ฉันจะใช้attr
ฟังก์ชันเพื่อโต้ตอบ ด้วยdata-xyz
คุณลักษณะ.)
attr
ฟังก์ชั่นที่ใช้ในการมีเหตุผลที่ซับซ้อนบางรอบรับสิ่งที่พวกเขาคิดว่าคุณอยากมากกว่าแท้จริงได้รับแอตทริบิวต์ มันทำให้แนวคิดแตกต่าง การย้ายไปที่prop
และattr
ตั้งใจจะยกเลิกการพูดคุยกัน สั้น ๆ ใน v1.6.0 jQuery ไปไกลเกินไปในเรื่องที่ แต่การทำงานถูกเพิ่มเข้ามาอย่างรวดเร็วกลับไปattr
จัดการกับสถานการณ์ทั่วไปที่ผู้คนใช้เมื่อในทางเทคนิคก็ควรใช้attr
prop