Hanya menggunakan JavaScript, apa cara paling efisien untuk memilih semua elemen DOM yang memiliki data-
atribut tertentu (katakanlah data-foo
). Elemen-elemennya mungkin elemen tag yang berbeda.
<p data-foo="0"></p><br/><h6 data-foo="1"></h6>
javascript
html
dom
DrANoel
sumber
sumber
document.querySelectorAll
itu tidak berfungsi pada IE7. Anda harus membuat skrip fallback yang akan berjalan di pohon DOM dan memeriksa atribut di setiap tag (sebenarnya saya tidak tahu seberapa cepatquerySelectorAll
, dan akan pergi untuk memeriksa tag secara manual).data-
, yaitu:data-foo=0
dandata-bar=1
dandata-app="js"
dandata-date="20181231"
Jawaban:
Anda dapat menggunakan querySelectorAll :
sumber
akan membuat Anda semua elemen dengan atribut itu.
hanya akan memberi Anda nilai 1.
sumber
.querySelectorAll()
mengembalikan aNodeList
. Seperti dicatat dalam dokumentasi itu, Anda dapat beralih menggunakan koleksi.forEach()
. Perhatikan bahwa ini adalah solusi non-IE: developer.mozilla.org/en-US/docs/Web/API/… . Jika Anda perlu mendukung IE, Anda hanya perlu mengulang NodeList menggunakanfor
loop biasa .Cobalah → di sini
sumber
for in
akan beralih pada properti panjang dan item. Sebagai gantinya, gunakanfor of
untuk beralih pada properti yang dirancang untuk diulangiBerikut adalah solusi yang menarik: menggunakan mesin CSS browser untuk menambahkan properti dummy ke elemen yang cocok dengan pemilih dan kemudian mengevaluasi gaya yang dihitung untuk menemukan elemen yang cocok:
sumber
Tidak yakin siapa yang memberiku nilai -1, tapi inilah buktinya.
http://jsfiddle.net/D798K/2/
sumber
getElementsByTagName
dengan*
pemilih global ( ) rusak di build IE yang lebih lama. Di sinilah pencarian DOM rekursif menyelesaikan pekerjaan. Juga tidak ada properti "data-foo" pada ElementNode yang dipetakan daridata-foo
atribut. Anda sedang mencaridataset
objek (misnode.dataset.foo
. : .Meskipun tidak secantik
querySelectorAll
(yang memiliki banyak masalah), inilah fungsi yang sangat fleksibel yang mengulang DOM dan harus bekerja di sebagian besar browser (lama dan baru). Selama browser mendukung kondisi Anda (yaitu: atribut data), Anda harus dapat mengambil elemen tersebut.Untuk yang penasaran: Jangan repot-repot menguji ini vs QSA di jsPerf. Browser seperti Opera 11 akan men-cache permintaan dan cenderung hasilnya.
Kode:
Anda kemudian dapat memulai dengan yang berikut:
recurseDOM(document.body, {"1": 1});
untuk kecepatan, atau adilrecurseDOM(document.body);
Contoh dengan spesifikasi Anda: http://jsbin.com/unajot/1/edit
Contoh dengan spesifikasi berbeda: http://jsbin.com/unajot/2/edit
sumber
querySelectorAll
?querySelectorAll
api