Sudahkah praktik terbaik seputar penggunaan setAttribute
alih-alih .
notasi atribut dot ( ) telah dikembangkan?
Misalnya:
myObj.setAttribute("className", "nameOfClass");
myObj.setAttribute("id", "someID");
atau
myObj.className = "nameOfClass";
myObj.id = "someID";
javascript
attributes
setattribute
Francisc
sumber
sumber
.setAttribute()
ke[key] = value
, semuanya mulai bekerja secara ajaib.Jawaban:
Anda harus selalu menggunakan direct
.attribute
formulir (tetapi lihat tautan quirksmode di bawah) jika Anda ingin akses terprogram dalam JavaScript. Itu harus menangani berbagai jenis atribut (pikirkan "membebani") dengan benar.Gunakan
getAttribute
/setAttribute
ketika Anda ingin berurusan dengan DOM sebagaimana adanya (mis. Hanya teks literal). Browser yang berbeda membingungkan keduanya. Lihat mode Quirks: kompatibilitas atribut (dalam) .sumber
Dari Javascript: The Definitive Guide , ini menjelaskan berbagai hal. Ini mencatat bahwa objek HTMLElement dari dokumen HTML mendefinisikan properti JS yang sesuai dengan semua atribut HTML standar.
Jadi, Anda hanya perlu menggunakan
setAttribute
atribut non-standar.Contoh:
sumber
node.frameborder
TIDAK didefinisikan, jadi Anda harus mendapatkanAttribute untuk mendapatkan kembali nilainya.frameBorder
secara langsung, tetapi perhatikan kapitalisasi. Seseorang berpikir itu adalah ide yang sangat bagus untuk menambahkan persamaan JavaScript pada atribut HTML. Saya belum berhasil menemukan spesifikasi untuk ini, tetapi internet tampaknya setuju bahwa ini adalah masalah 12 kasus tertentu (setidaknya untuk HTML 4). Lihat misalnya posting berikut: drupal.org/node/1420706#comment-6423420usemap
atribut tidak dapat diatur menggunakan notasi dot saat membuat peta dinamis untuk gambar. Membutuhkanimg.setAttribute('usemap', "#MapName");
Apakah jawaban Anda menyiratkan bahwausemap
oleh karena itu "tidak standar"?Tidak ada jawaban sebelumnya yang lengkap dan sebagian besar berisi informasi yang salah.
Ada tiga cara mengakses atribut Elemen DOM dalam JavaScript. Ketiganya bekerja dengan andal di peramban modern selama Anda mengerti cara menggunakannya.
1.
element.attributes
Elemen memiliki atribut properti yang mengembalikan NamedNodeMap langsung dari objek Attr . Indeks koleksi ini mungkin berbeda di antara peramban. Jadi, pesanannya tidak dijamin.
NamedNodeMap
memiliki metode untuk menambah dan menghapus atribut (getNamedItem
dansetNamedItem
, masing-masing).Perhatikan bahwa meskipun XML secara eksplisit peka terhadap huruf besar-kecil, spesifikasi DOM meminta nama string untuk dinormalisasi , sehingga nama yang diteruskan menjadi
getNamedItem
tidak sensitif huruf besar-kecil.Contoh penggunaan:
2.
element.getAttribute
&element.setAttribute
Metode ini ada langsung di
Element
tanpa perlu mengaksesattributes
dan metodenya tetapi melakukan fungsi yang sama.Sekali lagi, perhatikan bahwa nama string tidak sensitif huruf.
Contoh penggunaan:
3. Properti pada objek DOM, seperti
element.id
Banyak atribut dapat diakses menggunakan properti yang mudah digunakan pada objek DOM. Atribut mana yang ada tergantung pada jenis simpul DOM, bukan atribut mana yang didefinisikan dalam HTML. Properti didefinisikan di suatu tempat di rantai prototipe objek DOM yang bersangkutan. Properti spesifik yang ditentukan akan tergantung pada jenis Elemen yang Anda akses. Misalnya,
className
danid
didefinisikanElement
dan ada pada semua node DOM yang merupakan elemen (mis. Bukan teks atau komentar). Tapivalue
lebih sempit. Ini didefinisikanHTMLInputElement
dan mungkin tidak ada pada elemen lain.Perhatikan bahwa properti JavaScript peka huruf besar-kecil. Meskipun sebagian besar properti akan menggunakan huruf kecil, beberapa camelCase. Jadi selalu periksa spek untuk memastikan.
"Bagan" ini menangkap sebagian rantai prototipe untuk objek DOM ini. Bahkan tidak hampir selesai, tetapi ia menangkap keseluruhan struktur.
Contoh penggunaan:
Peringatan: Ini adalah penjelasan tentang bagaimana spesifikasi HTML mendefinisikan dan browser modern menangani atribut. Saya tidak mencoba untuk berurusan dengan batasan dari browser yang rusak dan kuno. Jika Anda perlu mendukung browser lama, selain informasi ini, Anda perlu tahu apa yang rusak di browser tersebut.
sumber
Satu kasus yang saya temukan di mana
setAttribute
diperlukan adalah ketika mengubah atribut ARIA, karena tidak ada properti yang sesuai. Sebagai contohTidak ada
x.arialabel
atau semacamnya, jadi Anda harus menggunakan setAttribute.Sunting: x ["label aria"] tidak berfungsi . Anda benar-benar membutuhkan setAttribute.
sumber
Jawaban ini tidak benar-benar mengatasi kebingungan besar antara properti dan atribut . Juga, tergantung pada prototipe Javascript, terkadang Anda dapat menggunakan properti elemen untuk mengakses atribut dan terkadang Anda tidak bisa.
Pertama, Anda harus ingat bahwa objek
HTMLElement
adalah Javascript. Seperti semua objek, mereka memiliki properti. Tentu, Anda dapat membuat properti yang disebut hampir semua yang Anda inginkan di dalamnyaHTMLElement
, tetapi tidak harus melakukan apa pun dengan DOM (apa yang ada di halaman). Notasi titik (.
) adalah untuk properti . Sekarang, ada beberapa properti khusus yang dipetakan ke atribut, dan pada saat itu atau tulisan hanya ada 4 yang dijamin (lebih lanjut tentang itu nanti).Semua
HTMLElement
termasuk properti yang disebutattributes
.HTMLElement.attributes
adalah Obyek hidupNamedNodeMap
yang berkaitan dengan unsur-unsur dalam DOM. "Langsung" berarti bahwa ketika node berubah di DOM, mereka berubah di sisi JavaScript, dan sebaliknya. Atribut DOM, dalam hal ini, adalah simpul yang dimaksud. ANode
memiliki.nodeValue
properti yang dapat Anda ubah.NamedNodeMap
objek memiliki fungsi yang disebut disetNamedItem
mana Anda dapat mengubah seluruh node. Anda juga dapat langsung mengakses simpul dengan kunci. Misalnya, Anda dapat mengatakan.attributes["dir"]
yang sama dengan.attributes.getNamedItem('dir');
(Catatan samping,NamedNodeMap
tidak peka huruf besar-kecil, sehingga Anda juga dapat lulus'DIR'
);Ada fungsi serupa langsung di
HTMLElement
mana Anda bisa memanggilsetAttribute
yang secara otomatis akan membuat simpul jika tidak ada dan mengaturnodeValue
. Ada juga beberapa atribut yang dapat Anda akses langsung sebagai propertiHTMLElement
melalui properti khusus , sepertidir
. Berikut ini pemetaan kasar dari tampilannya:Jadi, Anda dapat mengubah
dir
atribut 6 cara:Anda dapat memperbarui semua properti dengan metode # 1-5, tetapi hanya
dir
,id
,lang
, danclassName
dengan metode # 6.Ekstensi HTMLElement
HTMLElement
memiliki 4 sifat khusus tersebut. Beberapa elemen adalah kelas yang diperluas yangHTMLElement
memiliki lebih banyak properti yang dipetakan. Misalnya,HTMLAnchorElement
memilikiHTMLAnchorElement.href
,HTMLAnchorElement.rel
, danHTMLAnchorElement.target
. Namun, berhati-hatilah , jika Anda menyetel properti tersebut pada elemen yang tidak memiliki properti khusus itu (seperti pada aHTMLTableElement
) maka atribut tidak berubah dan itu hanya, properti kustom normal. Untuk lebih memahami, inilah contoh warisannya:Properti Khusus
Sekarang peringatan besar: Seperti semua objek Javascript , Anda dapat menambahkan properti khusus. Tapi, itu tidak akan mengubah apa pun pada DOM. Anda dapat melakukan:
Tapi itu sama dengan
Ini berarti bahwa menambahkan properti khusus tidak akan ditautkan ke
.attributes[attr].nodeValue
.Performa
Saya telah membangun test case jsperf untuk menunjukkan perbedaannya: https://jsperf.com/set-attribute-comparison . Pada dasarnya, Agar:
dir
,id
,className
).element.attributes.ATTRIBUTENAME.nodeValue =
element.attributes.getNamedItem(ATTRIBUTENAME).nodeValue = newValue
element.attributes.ATTRIBUTENAME = newNode
element.attributes.setNamedItem(ATTRIBUTENAME) = newNode
Kesimpulan (TL; DR)
Gunakan pemetaan properti khusus dari
HTMLElement
:element.dir
,element.id
,element.className
, atauelement.lang
.Jika Anda 100% yakin elemennya adalah extended
HTMLElement
dengan properti khusus, gunakan pemetaan khusus itu. (Anda dapat memeriksanyaif (element instanceof HTMLAnchorElement)
).Jika Anda 100% yakin atributnya sudah ada, gunakan
element.attributes.ATTRIBUTENAME.nodeValue = newValue
.Jika tidak, gunakan
setAttribute()
.sumber
classList
dijamin 100% ada, tapi ini bukan properti string, iniDOMTokenList
objek langsung . Pengaturan.className
secara langsung lebih cepat daripada memanipulasiclassList
, tetapi Anda akan menimpa semuanya..value
, Anda mengubah internal yang nilaiHTMLInputElement
, yang kemudian tercermin pada atribut. Mereka juga tidak harus seperti itustring
..valueAsNumber
akan berubah secaravalue
internal , danstring
formulir itu akan muncul divalue
atribut. developer.mozilla.org/en-US/docs/Web/HTML/Attributes"Kapan menggunakan setAttribute vs .attribute = dalam JavaScript?"
Aturan umum adalah untuk menggunakan
.attribute
dan memeriksa apakah itu berfungsi di browser...Jika itu bekerja di browser, Anda baik untuk pergi.
..Jika tidak, gunakan
.setAttribute(attribute, value)
bukan.attribute
untuk yang atribut.Bilas-ulangi untuk semua atribut.
Nah, jika Anda malas Anda cukup menggunakan
.setAttribute
. Itu seharusnya bekerja dengan baik pada sebagian besar browser. (Meskipun browser yang mendukung.attribute
dapat mengoptimalkannya lebih baik daripada.setAttribute(attribute, value)
.)sumber
Ini terlihat seperti satu kasus di mana lebih baik menggunakan setAttribute:
Dev.Opera - JavaScript yang Efisien
sumber
posElem.style = newStyle
berfungsi di semua browser (berfungsi untuk saya di Firefox)? Apakah hanya karena alasan kinerja yangsetAttribute
lebih disukai, menghindari pengecatan ulang? ApakahposElem.style.cssText = newStyle
lebih banyak perfomranposElem.style = newStyle
?metode untuk menetapkan atribut (misalnya kelas) pada elemen: 1. el.className = string 2. el.setAttribute ('class', string) 3. el.attributes.setNamedItem (objek) 4. el.setAttributeNode (node)
Saya telah membuat tes benchmark sederhana ( di sini )
dan tampaknya setAttributeNode sekitar 3 kali lebih cepat daripada menggunakan setAttribute.
jadi jika kinerja merupakan masalah - gunakan "setAttributeNode"
sumber
Pengambilan yang menarik dari skrip Google API mengenai hal ini:
Mereka melakukannya seperti ini:
Perhatikan, bagaimana mereka digunakan
setAttribute
untuk "src" dan "nonce", tapi kemudian.async = ...
atribut untuk atribut "async".Saya tidak 100% yakin, tapi mungkin itu karena "async" hanya didukung di browser yang mendukung
.attr =
penugasan langsung . Jadi, tidak masuk akal mencobasestAttribute("async")
karena jika browser tidak mengerti.async=...
- itu tidak akan mengerti atribut "async".Semoga itu adalah wawasan bermanfaat dari proyek penelitian "Un-minify GAPI" saya yang sedang berlangsung . Koreksi saya jika saya salah.
sumber