首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JS:使用Array.forEach迭代getElementsByClassName的结果

JS:使用Array.forEach迭代getElementsByClassName的结果
EN

Stack Overflow用户
提问于 2010-10-06 18:28:04
回答 10查看 275.6K关注 0票数 325

我想迭代一些DOM元素,我这样做:

代码语言:javascript
复制
document.getElementsByClassName( "myclass" ).forEach( function(element, index, array) {
  //do stuff
});

但我得到一个错误:

document.getElementsByClassName("myclass").forEach不是一个函数

我使用的是Firefox3,所以我知道getElementsByClassNameArray.forEach都存在。这可以很好地工作:

代码语言:javascript
复制
[2, 5, 9].forEach( function(element, index, array) {
  //do stuff
});

getElementsByClassName的结果是数组吗?如果不是,那是什么?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-10-06 18:36:12

不是的。作为specified in DOM4,它是一个HTMLCollection (至少在现代浏览器中是这样。较旧的浏览器返回一个NodeList)。

在所有现代浏览器(几乎所有其他IE <= 8)中,您可以调用数组的forEach方法,将元素列表(可以是HTMLCollectionNodeList)作为this值传递给它:

代码语言:javascript
复制
var els = document.getElementsByClassName("myclass");

Array.prototype.forEach.call(els, function(el) {
    // Do stuff here
    console.log(el.tagName);
});

// Or
[].forEach.call(els, function (el) {...});

如果您很高兴能够使用ES6 (即,您可以安全地忽略Internet Explorer或者您正在使用ES5转译器),那么您可以使用Array.from

代码语言:javascript
复制
Array.from(els).forEach((el) => {
    // Do stuff here
    console.log(el.tagName);
});
票数 502
EN

Stack Overflow用户

发布于 2016-06-21 18:22:39

您可以使用Array.from将集合转换为数组,这比Array.prototype.forEach.call干净得多

代码语言:javascript
复制
Array.from(document.getElementsByClassName("myclass")).forEach(
    function(element, index, array) {
        // do stuff
    }
);

在不支持Array.from的老浏览器中,你需要使用像Babel这样的东西。

ES6还添加了以下语法:

代码语言:javascript
复制
[...document.getElementsByClassName("myclass")].forEach(
    (element, index, array) => {
        // do stuff
    }
);

使用...的Rest解构适用于所有类似数组的对象,而不仅仅是数组本身,然后使用良好的旧数组语法从值构造数组。

虽然替代函数querySelectorAll (这会使getElementsByClassName过时)返回一个本机具有forEach的集合,但缺少其他方法,如mapfilter,因此此语法仍然有用:

代码语言:javascript
复制
[...document.querySelectorAll(".myclass")].map(
    (element, index, array) => {
        // do stuff
    }
);

[...document.querySelectorAll(".myclass")].map(element => element.innerHTML);
票数 109
EN

Stack Overflow用户

发布于 2017-05-13 16:10:20

您也可以使用返回querySelectorAll

代码语言:javascript
复制
document.querySelectorAll('.myclass').forEach(...)

受现代浏览器支持(包括Edge,但不支持IE):

Can I use querySelectorAll

NodeList.prototype.forEach()

MDN: Document.querySelectorAll()

票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3871547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档