javascript - 为什么我不能在 Javascript 元素集合上使用 Array.forEach?

标签 javascript arrays ecmascript-6 babeljs

<分区>

我正在使用 Babel/ES6 构建一个应用程序。我想为它的仅查看版本禁用所有表单元素,所以我这样做了:

let form = document.getElementById('application-form')
let elements = form.elements

我希望能够做到这一点,而不是使用常规的旧 for 循环(确实有效):

elements.forEach((el) => {
    el.disabled = true
})

但是我得到了 TypeError: elements.forEach is not a function

奇怪的是,如果我在 Chrome 开发控制台中 console.log(elements) 它就像一个包含一堆 input 对象的数组。它不显示对象的 Object 符号,并且所有键都是整数。我认为它是某种伪数组,但我什至不知道如何找到它。

编辑:简而言之,它不是一个数组,它是一个 HTMLCollection。见Why doesn't nodelist have forEach?


*更新*

根据 this answer , nodelist 现在有了 forEach 方法!

最佳答案

可以。您不能那样使用它,因为HTMLFormControlsCollection 上没有forEach 属性那form.elements给你(这不是一个数组)。

下面是您如何使用它:

Array.prototype.forEach.call(form.elements, (element) => {
    // ...
});

或者在现代浏览器上,您可以利用底层 HTMLCollectioniterable 的事实,即使它没有 forEach:

// `for-of`:
for (const element of elements) {
    // ...do something with `element`...
}

// Spreading into an array:
[...elements].forEach((element) => {
    // ...do something with `element`...
});

不过,这不适用于 IE11 等过时的浏览器。

还有 Array.from(需要针对过时浏览器的 polyfill):

Array.from(elements).forEach((element) => {
    // ...
});

有关详细信息,请参阅 my answer here“类数组” 部分.

关于javascript - 为什么我不能在 Javascript 元素集合上使用 Array.forEach?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39797101/

相关文章:

javascript - 从嵌套对象和数组的巨大 JSON 中以编程方式解构特定属性的最佳且最有效的方法

javascript - 如何跟踪 BFS 图搜索 JavaScript 中的路径

javascript - Typescript for (let i of someArray) 在 IE11 中不起作用

javascript - 如何使用按钮在javascript中添加类

javascript - 根据鼠标点击位置定位 div

Java 数组串联

c - 如果索引反向迭代,则段错误(核心已转储)

javascript - 通过这个简单的示例了解 Promise 链

c - 如何在 C 中使用 malloc() 创建特定大小的数组?

javascript - Jasmine:如何在 ES6 上监视导入的函数/构造函数?