我试图在HTMLCollectionOf中设置所有元素的获取id。我写了下面的代码:

var list = document.getElementsByClassName("events");
console.log(list[0].id);
for (key in list) {
    console.log(key.id);
}

但我在控制台得到以下输出:

event1
undefined

这和我预料的不一样为什么第二个控制台输出是未定义的,而第一个控制台输出是event1?


当前回答

如果你使用的是IE9或更高版本,就没有理由使用es6特性来转义循环。

在ES5中,有两个不错的选项。首先,你可以“借用”Array的forEach。

但更好的是……

使用Object.keys(),它有forEach和过滤器来自动“拥有属性”。

这就是对象。Keys本质上等同于for…在HasOwnProperty,但更流畅。

var eventNodes = document.getElementsByClassName("events");
Object.keys(eventNodes).forEach(function (key) {
    console.log(eventNodes[key].id);
});

其他回答

你可以添加这两行:

HTMLCollection.prototype.forEach = Array.prototype.forEach;
NodeList.prototype.forEach = Array.prototype.forEach;

HTMLCollection由getElementsByClassName和getElementsByTagName返回

NodeList由querySelectorAll返回

像这样你可以做一个forEach:

var selections = document.getElementsByClassName('myClass');

/* alternative :
var selections = document.querySelectorAll('.myClass');
*/

selections.forEach(function(element, i){
//do your stuffs
});

截至2016年3月,在Chrome 49.0中,对于…HTMLCollection的作品:

this.headers = this.getElementsByTagName("header");

for (var header of this.headers) {
    console.log(header); 
}

请参阅这里的文档。

但是,只有在使用for…of之前应用以下变通方法,它才会起作用:

HTMLCollection.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];

for……也有同样的必要。使用NodeList:

NamedNodeMap.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];

我相信/希望……的将很快工作,没有上述的变通办法。悬而未决的问题在这里:

https://bugs.chromium.org/p/chromium/issues/detail?id=401699

更新:见下面Expenzor的评论:此问题已于2016年4月修复。不需要添加HTMLCollection.prototype[Symbol. prototype]。iterator] = Array.prototype[Symbol.iterator];使用for…of迭代HTMLCollection

如果你使用ES的旧版本(例如ES5),你可以使用as any:

for (let element of elementsToIterate as any) {
      console.log(element);
}

如果你使用的是IE9或更高版本,就没有理由使用es6特性来转义循环。

在ES5中,有两个不错的选项。首先,你可以“借用”Array的forEach。

但更好的是……

使用Object.keys(),它有forEach和过滤器来自动“拥有属性”。

这就是对象。Keys本质上等同于for…在HasOwnProperty,但更流畅。

var eventNodes = document.getElementsByClassName("events");
Object.keys(eventNodes).forEach(function (key) {
    console.log(eventNodes[key].id);
});

我在IE 11和Firefox 49中使用forEach时遇到了问题

我找到了一个这样的变通办法

Array.prototype.slice.call(document.getElementsByClassName("events")).forEach(function (key) {
        console.log(key.id);
    }