开发者问题收集

工作代码带来错误 addEventListener 不是一个函数

2016-11-02
1712

我使用这段代码:

for (el in document.getElementsByClassName("close-sidenav"))
document.getElementsByClassName("close-sidenav")[el].addEventListener("click", closeSidenav);

它运行完美,它在元素上添加了点击事件,但 Chrome 一直告诉我:

未捕获的 TypeError:document.getElementsByClassName(...)[el].addEventListener 不是函数(…)

如何防止 Chrome 在工作代码上给我报错?

2个回答

document.getElementsByClassName() 返回一个 HTMLCollection 对象。

该对象不仅具有数字属性,还具有将包含在 for/in 枚举中的其他属性。

因此,不要将 for/in 与 document.getElementsByClassName() 返回的 HTMLCollection 一起使用,因为它将返回该数据结构的其他属性,而这些属性不是您想要的元素。

相反,使用常规的 for 循环。

var list = document.getElementsByClassName("close-sidenav");
for (var i = 0; i < list.length; i++) {
    list[i].addEventListener("click", closeSidenav);
}

请参阅此其他答案 HTMLCollection 元素的 For 循环 了解更多详细信息,包括在 ES6 中使用 Array.from() 执行此迭代的酷方法或使用 for/of 循环的方法。

jfriend00
2016-11-02

除了尝试上述方法,您还可以使用以下代码片段完成相同的工作。

// Initially we grab once here the elements
var elements = document.getElementsByClassName("close-sidenav"); 
if(elements){
    // We found elements with the specified class.
    for (var i=0; i<elements.length; i++){
        // Then we attach here an event listener to them.
        elements[i].addEventListener("click", closeSidenav);
    }
}

在上面的代码片段中,请注意我们使用了简单的 for 结构,而不是 for...in 结构。后者与 for 相比有所不同。它循环遍历 in 之后的对象的键。

Christos
2016-11-02