forEach适用于querySelectorAll,但不适用于getElementsByTagName?

时间:2016-10-24 07:33:35

标签: javascript for-loop foreach getelementsbytagname selectors-api

在编写某些内容时,我遇到了一些非常奇怪的东西。

以下代码可以正常使用:

document.querySelectorAll("button").forEach(function(e) {
    e.addEventListener("click", function() {
        console.log(e);
    });
});

但是,以下情况并非如此:

document.getElementsByTagName("button").forEach(function(e) {
    e.addEventListener("click", function() {
        console.log(e);
    });
})

我在这里很困惑。据我所知,document.getElementsByTagName("button")返回与document.querySelectorAll("button")完全相同的数组。我错了吗?这里有什么问题?它与forEach

有关

旁注:

我遇到this post,但它没有回答我的问题。

只是强调:我没有使用jQuery。

P.S。 - 我已经意识到forEach与常规for循环之间的差异和利弊,所以除非forEach具体说明这两个函数的工作方式不同,否则forEach vs for辩论与我的问题无关。

1 个答案:

答案 0 :(得分:4)

区别在于从这些方法返回的是什么。 querySelectorAll返回NodeListgetElementsByTagName返回HTMLCollection。它们都不支持泛型Array.forEach,但NodeList实现了自己的NodeList.forEach,这就是你在这里所要达到的。