В моем JSFiddle я просто пытаюсь перебрать массив элементов. Как показывают операторы журнала, массив не пуст. Однако вызов to forEach
дает мне (не очень полезную) ошибку «Uncaught TypeError
: undefined
is not a function».
Я, должно быть, делаю что-то глупое; Что я делаю не так?
Мой код:
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
Джер
источник
источник
arr
не массив, аHTMLCollection
. У него нет тех же методов, что и у массива. developer.mozilla.org/en-US/docs/Web/API/… . Вот даже SO-сообщение об этом: stackoverflow.com/questions/13433799/…[1,2,3].forEach(function(v,i,a) { console.log(v); });
нормально. В чем разница между этим и массивом в моем примере?arr instanceof Array
результатеfalse
он не может использовать какие-либо методы прототипаArray
объекта, такие как Array.prototype.forEach () .arr
представляет собой HTMLCollection и массив, подобный объекту (но не наследуется и не создаетсяArray
). Следовательно, ваш стандартныйfor
цикл будет работать так, как будто он просто перебирает индекс объекта и не является прототипомArray
.Ответы:
Это потому, что
document.getElementsByClassName
возвращает HTMLCollection , а не массив.К счастью, это объект типа «массив» (что объясняет, почему он регистрируется как объект и почему вы можете выполнять итерацию с помощью стандартного
for
цикла), поэтому вы можете сделать это:[].forEach.call(document.getElementsByClassName('myClass'), function(v,i,a) {
С ES6 (в современных браузерах или с Babel) вы также можете использовать,
Array.from
который строит массивы из объектов, подобных массиву:Array.from(document.getElementsByClassName('myClass')).forEach(v=>{
или разложите подобный массиву объект в массив:
[...document.getElementsByClassName('myClass'))].forEach(v=>{
источник
arguments
- один. Другой пример - объекты jQuery. Вы могли бы сделать его сами:var a = {"0": "str1", "1": "str2", length: 2}
querySelectorAll('.myClass')
должен работать. Я все еще жду добавления итераторов в API NodeList. :-(Array.prototype.forEach
, вам этого не позволят. Если у вас есть это требование позже, используйте стандартныйfor
цикл или если вы хотите использовать объект массива, используйтеArray.prototype.every
илиArray.prototype.some
(обратите внимание, что каждый / некоторые не поддерживаются в IE8 или менее)splice
в это определение , но когда я хочу быть более «массив типа» , чтобы быть в состоянии использоватьmap
,filter
и так далее, то я его включить. Простая итерация с использованиемforEach
не требуетсяsplice
.Попробуйте, это должно сработать:
<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>
источник
если вы хотите получить доступ к идентификатору каждого элемента определенного класса, вы можете сделать следующее:
Array.from(document.getElementsByClassName('myClass')).forEach(function(element) { console.log(element.id); });
источник