Использование forEach в массиве из результатов getElementsByClassName в "TypeError: undefined не является функцией"
В мой JSFiddle, я просто пытаюсь выполнить итерацию по массиву элементов. Массив не пуст, как доказывают утверждения журнала. Тем не менее вызов forEach
дает мне (не очень полезно). Ошибка "Недоступная TypeError
: undefined
не является функцией".
Я должен делать что-то глупое; что я делаю неправильно?
Мой код:
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>
Ответы
Ответ 1
Это потому, что 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=>{
Ответ 2
Попробуйте это, он должен работать:
<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>
Ответ 3
если вы хотите получить доступ к идентификатору каждого элемента определенного класса, вы можете сделать следующее:
Array.from(document.getElementsByClassName('myClass')).forEach(function(element) {
console.log(element.id);
});