Saya mencoba membuat loop sederhana:
const parent = this.el.parentElement
console.log(parent.children)
parent.children.forEach(child => {
console.log(child)
})
Tapi saya mendapatkan kesalahan berikut:
VM384: 53 UnEught TypeError: parent.children.forEach bukan sebuah fungsi
Meskipun parent.children
log:
Apa yang bisa menjadi masalah?
Catatan: Ini JSFiddle .
javascript
ecmascript-6
vue.js
alexchenco
sumber
sumber
Jawaban:
Opsi pertama: aktifkan forEach secara tidak langsung
Ini
parent.children
adalah objek seperti Array. Gunakan solusi berikut:The
parent.children
yaituNodeList
jenis, yang merupakan Array seperti objek karena:length
properti, yang menunjukkan jumlah node{0: NodeObject, 1: NodeObject, length: 2, ...}
Lihat lebih detail di artikel ini .
Opsi kedua: gunakan protokol iterable
parent.children
adalahHTMLCollection
: yang mengimplementasikan protokol iterable . Dalam lingkungan ES2015, Anda dapat menggunakanHTMLCollection
dengan konstruksi apa pun yang menerima iterables.Gunakan
HTMLCollection
dengan spread operator:Atau dengan
for..of
siklus (yang merupakan pilihan pilihan saya):sumber
parent.children
bukan sebuah array. Ini HTMLCollection dan tidak memilikiforEach
metode. Anda dapat mengonversikannya ke array terlebih dahulu. Misalnya dalam ES6:atau menggunakan operator spread:
sumber
parent.children
akan mengembalikandaftardaftarsimpul, secara teknis Koleksi html . Itu adalah array seperti objek, tetapi bukan array, jadi Anda tidak bisa memanggil fungsi array secara langsung. Pada konteks ini Anda dapat menggunakanArray.from()
untuk mengubahnya menjadi array nyata,sumber
Versi yang lebih naif , setidaknya Anda yakin itu akan berfungsi pada semua perangkat, tanpa konversi dan ES6:
https://jsfiddle.net/swb12kqn/5/
sumber
parent.children
adalahHTMLCollection
objek yang mirip array. Pertama, Anda harus mengubahnya menjadi metode nyataArray
untuk digunakanArray.prototype
.sumber
Itu karena
parent.children
adalah NodeList , dan itu tidak mendukung.forEach
metode (karena NodeList adalah array seperti struktur tetapi bukan array), jadi cobalah untuk menyebutnya dengan terlebih dahulu mengubahnya ke array menggunakansumber
Tidak perlu untuk itu
forEach
, Anda dapat beralih menggunakan hanyafrom
parameter kedua, seperti:sumber
Array.from
mengubah objek yang diberikan dalam parameter pertama menjadi array. Hasilnya sama dengan jawaban madox2 tanpa perluforEach
loop tambahan (Array.from
MDN docs).Jika Anda mencoba untuk mengulang
NodeList
seperti ini:Saya sangat merekomendasikan untuk melakukannya:
Secara pribadi, saya sudah mencoba beberapa cara tetapi kebanyakan dari mereka tidak bekerja karena saya ingin mengulang
NodeList
, tetapi yang ini berfungsi seperti pesona, cobalah!Ini
NodeList
bukan Array, tapi kami memperlakukannya sebagai Array, menggunakanArray.
Jadi, Anda perlu tahu bahwa itu tidak didukung di browser lama!Perlu informasi lebih lanjut tentang
NodeList
? Silakan baca dokumentasinya di MDN .sumber
Karena Anda menggunakan fitur ES6 ( fungsi panah ), Anda juga dapat menggunakan loop for seperti ini:
sumber
Anda dapat memeriksa apakah Anda mengetik untukEach dengan benar, jika Anda mengetik foreach seperti dalam bahasa pemrograman lain itu tidak akan berfungsi.
sumber
Anda bisa menggunakan
childNodes
alih-alihchildren
,childNodes
juga lebih andal mengingat masalah kompatibilitas browser, info lebih lanjut di sini :atau menggunakan operator spread:
sumber