在来自 getElementsByClassName 的数组上使用 forEach 会导致“TypeError: undefined is not a function”

IT技术 javascript foreach
2021-03-10 01:32:27

我的 JSFiddle 中,我只是试图迭代一个元素数组。正如日志语句所证明的那样,该数组是非空的。然而,调用给forEach了我(不是很有帮助)“Uncaught TypeError: undefinedis 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>

3个回答

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

幸运的是,它是一个“类似数组”的对象(这解释了为什么将它记录为一个对象以及为什么您可以使用标准for循环进行迭代),因此您可以这样做:

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

使用 ES6(在现代浏览器或 Babel 上),您还可以使用Array.fromwhich 从类数组对象构建数组:

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

或将类似数组的对象传播到数组中:

[...document.getElementsByClassName('myClass'))].forEach(v=>{
@Ian TBH“类数组”的定义非常模糊,取决于用途。有时我不包含splice在该定义中,但是当我想要更“类似数组”以便能够使用map,filter等时,我会包含它。简单的迭代使用forEach不需要splice.
2021-04-20 01:32:27
在这里,我们再次使用旧浏览器……在 IE 8 及更低版本中,将主机对象传递给本机方法将失败。也许没有人在乎,但有些人可能会在乎。;-) 哦,它也不支持getElementsByClassName,但querySelectorAll('.myClass')应该可以工作。我仍在等待将迭代器添加到 NodeList API。:-(
2021-05-06 01:32:27
@Jerarguments就是其中之一。jQuery 对象是另一个。你可以自己做一个:var a = {"0": "str1", "1": "str2", length: 2}
2021-05-10 01:32:27
@Jer:作为旁注,如果您出于任何原因打算跳出循环,Array.prototype.forEach则不会让您这样做。如果您以后有该要求,请使用标准for循环,或者如果您想使用数组对象,请使用Array.prototype.everyArray.prototype.some(请注意,IE8 或更低版本不支持每个/某些)
2021-05-15 01:32:27
@Ian 您需要将对象拼接为“类似数组”。比较这里的日志:jsbin.com/sigut/1/edit
2021-05-16 01:32:27

试试这个它应该工作:

<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);
    });