Ekspresi menyukai Element.getAttribute("id")
dan Element.id
mengembalikan hal yang sama.
Manakah yang harus digunakan saat kita membutuhkan atribut objek HTMLElement?
Apakah ada masalah lintas browser dengan metode seperti getAttribute()
dan setAttribute()
?
Atau dampak apa pun pada kinerja antara mengakses langsung properti objek vs menggunakan metode atribut ini?
javascript
html
dom
PK
sumber
sumber
Jawaban:
getAttribute
mengambil atribut dari elemen DOM, sementarael.id
mengambil properti dari elemen DOM ini. Mereka tidaklah sama.Seringkali, properti DOM disinkronkan dengan atribut.
Namun, sinkronisasi tidak menjamin nilai yang sama . Contoh klasik adalah antara
el.href
danel.getAttribute('href')
untuk elemen jangkar.Sebagai contoh:
Perilaku ini terjadi karena menurut W3C , properti href harus berupa tautan yang dibentuk dengan baik. Kebanyakan browser menghormati standar ini (coba tebak siapa yang tidak?).
Ada kasus lain untuk
input
'schecked
properti. Properti DOM mengembalikantrue
ataufalse
saat atribut mengembalikan string"checked"
atau string kosong.Lalu, ada beberapa properti yang hanya disinkronkan satu arah . Contoh terbaik adalah
value
properti sebuahinput
elemen. Mengubah nilainya melalui properti DOM tidak akan mengubah atribut (edit: periksa komentar pertama untuk lebih presisi).Karena alasan ini, saya sarankan Anda tetap menggunakan properti DOM , dan bukan atributnya, karena perilakunya berbeda di antara browser.
Pada kenyataannya, hanya ada dua kasus di mana Anda perlu menggunakan atribut:
value
dari sebuahinput
elemen).Jika Anda menginginkan penjelasan yang lebih detail, saya sangat menyarankan Anda membaca halaman ini . Ini hanya akan memakan waktu beberapa menit, tetapi Anda akan senang dengan informasi (yang saya simpulkan di sini).
sumber
value
properti input mendapatkan nilai awalnya dari atribut tetapi sebaliknya tidak terikat sama sekali. Thevalue
atribut sepenuhnya disinkronkan bukan dengandefaultValue
properti. Demikian jugachecked
dandefaultChecked
. Kecuali di IE lama (<= 7 dan mode kompatibilitas nanti), yang telah rusakgetAttribute()
dansetAttribute()
.a.href
mengembalikan URL lengkap,a.getAttribute("href")
mengembalikan atribut persis seperti defiend di sumber HTML.input.formAction
) atau string kosong (misalnyaa.download
), yang membuat segalanya menjadi ambigu. Satu-satunya pengecualian adalah nilai yang tidak disinkronkan 2 arah, sepertivalue
.getAttribute('attribute')
biasanya mengembalikan nilai atribut sebagai string, persis seperti yang ditentukan dalam sumber HTML halaman.Namun,
element.attribute
dapat mengembalikan nilai atribut yang dinormalisasi atau dihitung. Contoh:<a href="https://stackoverflow.com/foo"></a>
<input type="checkbox" checked>
<input type="checkbox" checked="bleh">
<img src='http://dummyimage.com/64x64/000/fff'>
<img src='http://dummyimage.com/64x64/000/fff' width="50%">
<img src='http://dummyimage.com/32x32/000/fff' style='width: 50px'>
<div style='background: lime;'></div>
sumber
Menurut pengujian jsPerf
getAttribute
ini lebih lambat daripadaid
properti.PS
Anehnya, kedua pernyataan tersebut berkinerja sangat buruk di IE8 (dibandingkan dengan peramban lain).
sumber
Selalu gunakan properti kecuali Anda memiliki alasan khusus untuk tidak melakukannya.
getAttribute()
dansetAttribute()
rusak di IE lama (dan mode kompatibilitas di versi yang lebih baru)Ada beberapa pengecualian :
<form>
elemenSaya telah menulis tentang subjek ini beberapa kali di SO:
sumber
.id
menghemat overhead panggilan fungsi. (yang sangat kecil, tetapi Anda bertanya.)sumber
Coba contoh di bawah ini untuk memahami ini sepenuhnya. Untuk DIV di bawah ini
<div class="myclass"></div>
The
Element.getAttribute('class')
akan kembalimyclass
tetapi Anda harus menggunakanElement.className
yang mengambil dari properti DOM.sumber
Satu area di mana hal ini membuat perbedaan besar adalah dengan gaya css berdasarkan atribut.
Pertimbangkan hal berikut:
Div dengan set properti khusus secara langsung tidak mencerminkan nilai ke atribut, dan tidak dipilih oleh pemilih atribut kami (
div[custom]
) di css.Namun, div dengan atribut khusus yang ditetapkan
setAttribute
dapat dipilih menggunakan pemilih atribut css, dan diberi gaya yang sesuai.sumber