Saya pikir Tim mengatakannya dengan cukup baik , tapi mari kita mundur:
Elemen DOM adalah objek, benda di memori. Seperti kebanyakan objek di OOP, ia memiliki properti . Ini juga, secara terpisah, memiliki peta atribut yang ditentukan pada elemen (biasanya berasal dari markup yang dibaca browser untuk membuat elemen). Beberapa properti elemen mendapatkan nilai awal mereka dari atribut dengan nama yang sama atau mirip ( value
mendapatkan nilai awal dari atribut "nilai"; href
mendapatkan nilai awal dari atribut "href", tetapi itu bukan nilai yang sama persis; className
dari atribut "class"). Properti lain mendapatkan nilai awalnya dengan cara lain: Misalnya, parentNode
properti mendapatkan nilainya berdasarkan elemen induknya;style
properti, apakah itu memiliki atribut "style" atau tidak.
Mari kita pertimbangkan jangkar ini di halaman di http://example.com/testing.html
:
<a href='foo.html' class='test one' name='fooAnchor' id='fooAnchor'>Hi</a>
Beberapa seni ASCII gratis (dan meninggalkan banyak hal):
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− +
| HTMLAnchorElement |
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− +
| href: "http://example.com/foo.html" |
| nama: "fooAnchor" |
| id: "fooAnchor" |
| className: "test one" |
| atribut: |
| href: "foo.html" |
| nama: "fooAnchor" |
| id: "fooAnchor" |
| class: "test one" |
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− +
Perhatikan bahwa sifat dan atributnya berbeda.
Sekarang, meskipun mereka berbeda, karena semua ini berkembang alih-alih dirancang dari bawah ke atas, sejumlah properti menulis kembali ke atribut yang mereka berasal dari jika Anda mengaturnya. Tetapi tidak semua melakukannya, dan seperti yang Anda lihat dari href
atas, pemetaan tidak selalu berupa "meneruskan nilai", terkadang ada interpretasi yang terlibat.
Ketika saya berbicara tentang properti yang merupakan properti dari suatu objek, saya tidak berbicara secara abstrak. Ini beberapa kode non-jQuery:
var link = document.getElementById('fooAnchor');
alert(link.href); // alerts "http://example.com/foo.html"
alert(link.getAttribute("href")); // alerts "foo.html"
(Nilai-nilai itu sesuai dengan kebanyakan browser; ada beberapa variasi.)
The link
objek adalah hal yang nyata, dan Anda dapat melihat ada perbedaan nyata antara mengakses properti di atasnya, dan mengakses sebuah atribut .
Seperti yang dikatakan Tim, sebagian besar waktu, kami ingin bekerja dengan properti. Sebagian karena nilai-nilai mereka (bahkan nama mereka) cenderung lebih konsisten di seluruh browser. Kami sebagian besar hanya ingin bekerja dengan atribut ketika tidak ada properti yang terkait dengannya (atribut khusus), atau ketika kami tahu bahwa untuk atribut tertentu, atribut dan properti bukan 1: 1 (seperti dengan href
dan "href" di atas) .
Properti standar disajikan dalam berbagai spesifikasi DOM:
Spesifikasi ini memiliki indeks yang sangat baik dan saya sarankan menyimpan tautan ke dalamnya; Saya menggunakannya sepanjang waktu.
Atribut khusus akan mencakup, misalnya, data-xyz
atribut apa pun yang mungkin Anda masukkan ke elemen untuk memberikan meta-data ke kode Anda (sekarang itu berlaku pada HTML5, selama Anda tetap menggunakan data-
awalan). (Versi terbaru jQuery memberi Anda akses ke data-xyz
elemen melalui data
fungsi, tetapi fungsi itu bukan hanya pengakses untuk data-xyz
atribut [ia melakukan keduanya lebih banyak dan lebih sedikit dari itu]; kecuali jika Anda benar-benar membutuhkan fitur-fiturnya, saya akan menggunakan attr
fungsi untuk berinteraksi dengan data-xyz
atribut.)
The attr
fungsi yang digunakan untuk memiliki beberapa berbelit-belit logika sekitar mendapatkan apa yang mereka pikir Anda inginkan, bukan secara harfiah mendapatkan atribut. Itu menyatukan konsep. Pindah ke prop
dan attr
dimaksudkan untuk menghapus konfigurasi mereka. Sebentar di v1.6.0 jQuery pergi terlalu jauh dalam hal itu, tapi fungsi dengan cepat ditambahkan kembali ke attr
untuk menangani situasi umum di mana orang menggunakan attr
ketika teknis mereka harus menggunakan prop
.