在getElementsByClassName的数组上使用forEach会导致“TypeError:undefined不是函数”

在我的JSFiddle中 ,我只是试图迭代一组元素。 这个数组是非空的,正如日志所certificate的那样。 然而, forEach的调用给了我(不太有用)的“Uncaught TypeErrorundefined不是函数”错误。

我一定在做一些愚蠢的事情。 我究竟做错了什么?

我的代码:

 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> 

这是因为document.getElementsByClassName返回一个HTMLCollection ,而不是一个数组。

幸运的是,它是一个“类似数组”的对象 (这解释了为什么它被logging为一个对象,为什么你可以迭代一个标准for循环),所以你可以这样做:

 [].forEach.call(document.getElementsByClassName('myClass'), function(v,i,a) { 

有了ES6(在现代浏览器或Babel),你也可以使用Array.from从类似于数组的对象构build数组:

 Array.from(document.getElementsByClassName('myClass')).forEach(v=>{ 

或者将类似数组的对象分散到一个数组中:

 [...document.getElementsByClassName('myClass'))].forEach(v=>{ 

试试这应该工作:

 <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> 

如果要访问特定类的每个元素的ID,可以执行以下操作:

  Array.from(document.getElementsByClassName('myClass')).forEach(function(element) { console.log(element.id); });