Di JSFiddle saya , saya hanya mencoba melakukan iterasi pada berbagai elemen. Array tidak kosong, seperti yang dibuktikan oleh pernyataan log. Namun panggilan untuk forEach
memberi saya kesalahan (tidak terlalu membantu) "Tidak tertangkap TypeError
: undefined
bukan fungsi".
Saya pasti melakukan sesuatu yang bodoh; apa yang saya lakukan salah?
Kode saya:
var arr = document.getElementsByClassName('myClass');
console.log(arr);
console.log(arr[0]);
arr.forEach(function(v, i, a) {
console.log(v);
});
.myClass {
background-color: #FF0000;
}
<div class="myClass">Hello</div>
javascript
foreach
Jer
sumber
sumber
arr
bukan sebuah array, tapi aHTMLCollection
. Itu tidak memiliki metode yang sama dengan array. developer.mozilla.org/en-US/docs/Web/API/… . Berikut adalah posting SO tentang itu bahkan: stackoverflow.com/questions/13433799/…[1,2,3].forEach(function(v,i,a) { console.log(v); });
itu baik-baik saja. Apa perbedaan antara this dan array dalam contoh saya?arr instanceof Array
akan mengakibatkanfalse
tidak dapat memanfaatkan metode prototipe apa pun dariArray
objek seperti Array.prototype.forEach () .arr
adalah HTMLCollection dan array seperti objek (tetapi tidak mewarisi dari atau instantiateArray
). Oleh karena itufor
loop standar Anda akan bekerja karena hanya melakukan iterasi melalui indeks objek dan bukan merupakan prototipeArray
.Jawaban:
Itu karena
document.getElementsByClassName
mengembalikan HTMLCollection , bukan array.Untungnya, ini adalah objek "mirip-larik" (yang menjelaskan mengapa itu dicatat seolah-olah itu adalah objek dan mengapa Anda dapat melakukan iterasi dengan
for
loop standar ), jadi Anda dapat melakukan ini:[].forEach.call(document.getElementsByClassName('myClass'), function(v,i,a) {
Dengan ES6 (di browser modern atau dengan Babel), Anda juga dapat menggunakan
Array.from
array yang membangun dari objek seperti array:Array.from(document.getElementsByClassName('myClass')).forEach(v=>{
atau sebarkan objek seperti larik ke dalam larik:
[...document.getElementsByClassName('myClass'))].forEach(v=>{
sumber
arguments
adalah satu. Objek jQuery adalah hal lain. Anda dapat membuatnya sendiri:var a = {"0": "str1", "1": "str2", length: 2}
querySelectorAll('.myClass')
seharusnya berfungsi. Saya masih menunggu iterator ditambahkan ke NodeList API. :-(Array.prototype.forEach
tidak akan membiarkan Anda melakukan itu. Jika Anda memiliki persyaratan itu nanti gunakanfor
loop standar atau jika Anda ingin menggunakan objek array gunakanArray.prototype.every
atauArray.prototype.some
(perhatikan bahwa setiap / beberapa tidak didukung di IE8 atau kurang)splice
dalam definisi itu, tetapi ketika saya ingin lebih "array-seperti" untuk dapat menggunakanmap
,filter
dan sebagainya, maka saya memasukkannya. Penggunaan iterasi sederhanaforEach
tidak perlusplice
.Coba ini seharusnya berhasil:
<html> <head> <style type="text/css"> </style> </head> <body> <div class="myClass">Hello</div> <div class="myClass">Hello</div> <script type="text/javascript"> var arr = document.getElementsByClassName('myClass'); console.log(arr); console.log(arr[0]); arr = [].slice.call(arr); //I have converted the HTML Collection an array arr.forEach(function(v,i,a) { console.log(v); }); </script> <style type="text/css"> .myClass { background-color: #FF0000; } </style> </body> </html>
sumber
Jika Anda ingin mengakses ID dari setiap elemen dari kelas tertentu, Anda dapat melakukan hal berikut:
Array.from(document.getElementsByClassName('myClass')).forEach(function(element) { console.log(element.id); });
sumber