Saya pemula Javascript.
Saya memulai halaman web melalui window.onload
, saya harus menemukan banyak elemen dengan nama kelas mereka ( slide
) dan mendistribusikannya ke node yang berbeda berdasarkan beberapa logika. Saya memiliki fungsi Distribute(element)
yang mengambil elemen sebagai input dan melakukan distribusi. Saya ingin melakukan sesuatu seperti ini (seperti diuraikan misalnya di sini atau di sini ):
var slides = getElementsByClassName("slide");
for(var i = 0; i < slides.length; i++)
{
Distribute(slides[i]);
}
Namun ini tidak melakukan keajaiban bagi saya, karena getElementsByClassName
sebenarnya tidak mengembalikan array, tapi a NodeList
, yang ...
... ini spekulasi saya ...
... diubah di dalam fungsi Distribute
(pohon DOM sedang diubah di dalam fungsi ini, dan kloning node tertentu terjadi). For-each
struktur lingkaran juga tidak membantu.
Variabel slide bertindak benar-benar tidak deterministik, melalui setiap iterasi itu mengubah panjang dan urutan elemennya secara liar.
Apa cara yang benar untuk melakukan iterasi melalui NodeList dalam kasus saya? Saya sedang berpikir untuk mengisi beberapa larik sementara, tetapi tidak yakin bagaimana melakukan itu ...
EDIT:
Fakta penting yang lupa saya sebutkan adalah bahwa mungkin ada satu slide di dalam yang lain, ini sebenarnya yang mengubah slides
variabel seperti yang baru saja saya ketahui berkat pengguna Alohci .
Solusi bagi saya adalah mengkloning setiap elemen ke dalam array terlebih dahulu dan meneruskan array satu per satu ke Distribute()
setelahnya.
sumber
Distribute()
berfungsi untuk panjang dan kompleks untuk disalin di sini, tapi saya yakin bahwa saya mengubah dalam struktur DOM, saya juga duplikasi (kloning) unsur sana. Ketika saya men-debugnya, saya bisa melihat variabelslides
berubah setiap kali dilewatkan di dalam.getElementsByClassName()
mengembalikan siaran langsungnodeList
, sehingga elemen dengan kelas itu ditambahkan panjang dinodeList
mana Anda mengulangi perubahan.Jawaban:
Menurut MDN, cara mengambil item dari a
NodeList
adalah:Jadi:
Saya belum mencoba ini sendiri (
for
loop normal selalu berhasil untuk saya), tetapi cobalah.sumber
for(var el in document.getElementsByClassName("foo")){}
?for ... of
memungkinkan Anda untuk beralih melalui NodeList sekarang seperti difor (slide of slides) Distribute(slide)
. Dukungan browser tidak lengkap, tetapi jika Anda transpiling makafor ... of
akan dikonversi, tetapiNodeList.forEach
tidak.Jika Anda menggunakan querySelectorAll baru, Anda dapat memanggil forEach secara langsung.
Sesuai komentar di bawah. nodeLists tidak memiliki fungsi forEach.
Jika menggunakan ini dengan babel Anda dapat menambahkan
Array.from
dan itu akan mengubah daftar non node menjadi array forEach.Array.from
tidak berfungsi seperti aslinya di browser di bawah dan termasuk IE 11.Pada pertemuan kami tadi malam, saya menemukan cara lain untuk menangani daftar node yang tidak memiliki forEach
Dukungan Browser untuk [...]
Ditampilkan sebagai Daftar Node
Ditampilkan sebagai Array
sumber
if ( !NodeList.prototype.forEach ) {NodeList.prototype.forEach = Array.prototype.forEach;}
[...document.getElementsByClassName('.edit')].forEach(function(button) {
[...document.getElementsByClassName('edit')].forEach(function(button) {
Anda selalu bisa menggunakan metode array:
sumber
Saya mengikuti rekomendasi Alohci untuk melakukan perulangan secara terbalik karena ini live
nodeList
. Inilah yang saya lakukan untuk mereka yang penasaran ...sumber
sumber
Saya memiliki masalah serupa dengan iterasi dan saya mendarat di sini. Mungkin orang lain juga melakukan kesalahan yang sama dengan yang saya lakukan.
Dalam kasus saya, pemilih bukanlah masalah sama sekali. Masalahnya adalah saya telah mengacaukan kode javascript: Saya memiliki loop dan subloop. Subloop juga digunakan
i
sebagai penghitung, bukanj
, jadi karena subloop menimpa nilai darii
loop utama, yang ini tidak pernah sampai ke iterasi kedua.sumber