Saya ingin mengulangi beberapa elemen DOM, saya melakukan ini:
document.getElementsByClassName( "myclass" ).forEach( function(element, index, array) {
//do stuff
});
tapi saya mendapatkan kesalahan:
document.getElementsByClassName ("myclass"). forEach bukan fungsi
Saya menggunakan Firefox 3 jadi saya tahu keduanya getElementsByClassName
dan Array.forEach
ada. Ini berfungsi dengan baik:
[2, 5, 9].forEach( function(element, index, array) {
//do stuff
});
Apakah hasil dari getElementsByClassName
Array? Jika tidak, apa itu?
sumber
[].forEach.call(elsArray, function () {...})
.querySelectorAll
Metode mengembalikan NodeList sekalipun.document.getElementsByClassName()
harus mengembalikanHTMLCollection
(yang sangat mirip tetapi bukan NodeList). Terima kasih telah menunjukkan kesalahannya.HTMLCollection
tipnya. Sekarang saya akhirnya dapat menggunakanHTMLCollection.prototype.forEach = Array.prototype.forEach;
kode saya.Anda dapat menggunakan
Array.from
untuk mengonversi koleksi menjadi array, yang jauh lebih bersih daripadaArray.prototype.forEach.call
:Di browser lama yang tidak mendukung
Array.from
, Anda perlu menggunakan sesuatu seperti Babel.ES6 juga menambahkan sintaks ini:
Rest Destrukturisasi dengan
...
bekerja pada semua objek seperti array, tidak hanya array sendiri, maka sintaks array lama yang baik digunakan untuk membangun sebuah array dari nilai-nilai.Sementara fungsi alternatif
querySelectorAll
(yang agaknyagetElementsByClassName
usang) mengembalikan koleksi yang memilikiforEach
secara native, metode lain sukamap
ataufilter
tidak ada, jadi sintaks ini masih berguna:sumber
Atau Anda dapat menggunakan
querySelectorAll
yang mengembalikan NodeList :Didukung oleh browser modern (termasuk Edge, tetapi bukan IE):
Dapatkah saya menggunakan querySelectorAll
NodeList.prototype.forEach ()
MDN: Document.querySelectorAll ()
sumber
Sunting: Meskipun jenis kembali telah berubah dalam versi HTML baru (lihat jawaban Tim Down yang diperbarui), kode di bawah ini masih berfungsi.
Seperti yang orang lain katakan, ini adalah NodeList. Berikut adalah contoh yang lengkap dan berfungsi yang dapat Anda coba:
Ini berfungsi di IE 9, FF 5, Safari 5, dan Chrome 12 pada Win 7.
sumber
Hasil
getElementsByClassName()
bukan Array, tetapi objek seperti array . Khususnya itu disebutHTMLCollection
, jangan dikacaukan denganNodeList
( yang memilikiforEach()
metode sendiri ).Salah satu cara sederhana dengan ES2015 untuk mengonversi objek mirip array untuk digunakan dengan
Array.prototype.forEach()
yang belum disebutkan adalah dengan menggunakan operator spread atau menyebar sintaksis :sumber
Tidak
Seperti semua metode DOM yang mengembalikan banyak elemen, ini adalah NodeList, lihat https://developer.mozilla.org/en/DOM/document.getElementsByClassName
sumber
Seperti yang sudah dikatakan,
getElementsByClassName
mengembalikan HTMLCollection , yang didefinisikan sebagaiSebelumnya, beberapa browser malah mengembalikan NodeList .
Perbedaannya penting, karena DOM4 sekarang mendefinisikan NodeList sebagai yang dapat diubah.
Menurut konsep Web IDL ,
Itu berarti, jika Anda ingin menggunakan
forEach
, Anda dapat menggunakan metode DOM yang mengembalikan NodeList , sepertiquerySelectorAll
.Catatan ini belum didukung secara luas. Lihat juga metode forEach dari Node.childNodes?
sumber
forEach in not a function
document.querySelectorAll(...).forEach is not a function
Itu tidak mengembalikan
Array
, mengembalikan NodeList .sumber
Ini cara yang lebih aman:
sumber
getElementsByClassName
mengembalikan HTMLCollection di browser modern.yang merupakan objek mirip array dengan argumen yang dapat diulang dengan
for...of
loop, lihat di bawah apa yang dikatakan MDN doc tentangnya:contoh
sumber
error TS2488: Type 'HTMLCollectionOf<Element>' must have a '[Symbol.iterator]()' method that returns an iterator.
Ini adalah tes yang saya buat di jsperf: https://jsperf.com/vanillajs-loop-through-elements-of-class
Versi yang paling bagus di Chrome dan Firefox adalah versi lama yang bagus untuk loop dalam kombinasi dengan document.getElementsByClassName:
Di Safari, varian ini adalah pemenangnya:
Jika Anda ingin varian yang paling bagus untuk semua browser, mungkin yang ini:
sumber