我正在制作一个用于选择产品(颜色等)的脚本,它适用于除 Internet Explorer (11) & Edge 之外的所有浏览器。
我将每个参数的选择放在一个数组中,并使用 array.forEach()
方法对它们应用一个函数。
颜色参数示例:
var color_btns = document.querySelectorAll('#color > p');
color_btns.forEach(function(color) {
color.onclick = function () {
color_btns.forEach(function(element) {
if (element.classList.contains('selected')) {
element.classList.remove('selected');
}
});
color.classList.add('selected');
document.querySelector('#f_color').value = color.dataset.id;
};
});
我在 IE 和 Edge 的控制台中得到以下输出:
对象不支持属性或方法“forEach”
查了一下issue,得知这个功能应该是 IE 9及以上版本才支持的。我试图自己定义函数,但没有成功。当我记录函数时,它被定义为函数(内部带有“ [native code]
”)。
我用一个 .forEach
for
并且它工作得很好,
- 但我怎样才能让它发挥作用呢?
forEach()
是否有用于 Internet Explorer 和 Edge 的特定用法?
我认为它是 Array.prototype.forEach
并且最新版本的 IE(以及所有版本的 Edge)都有它……?
原文由 AymDev 发布,翻译遵循 CC BY-SA 4.0 许可协议
大多数 DOM 方法和集合属性实际上不是数组,它们是集合:
querySelectorAll
返回静态NodeList
(调用时匹配元素的快照)。getElementsByTagName
,getElementsByTagNameNS
,getElementsByClassName
, and thechildren
property on aParentNode
(Elements are parent nodes) return 实时HTMLCollection
实例(如果更改 DOM,该更改将实时反映在集合中)。getElementsByName
返回 实时NodeList
(不是快照)。NodeList
最近才得到forEach
(和keys
和其他几个数组方法)。HTMLCollection
没有也不会;事实证明,添加它们会破坏网络上的太多代码。Both
NodeList
andHTMLCollection
are iterable , though, meaning that you can loop through them withfor-of
, expand them into an array via spread ([...theCollection]
), 等。但是如果你在浏览器上运行NodeList
没有forEach
,它可能太旧了,没有任何 ES2015+ 功能,比如for-of
或迭代。由于
NodeList
被指定为具有forEach
,您可以安全地填充它,而且它 真的很 容易做到:Direct assignment is fine in this case, because
enumerable
,configurable
, andwritable
should all betrue
and it’s a value property. (enumerable
true
让我感到惊讶,但这就是它在 Chrome/Chromium/Edge/Etc.、Firefox、旧版 Legacy Edge 和 Safari 上的本地定义方式)。在您自己的代码中,您也可以使用
HTMLCollection
来做到这一点,如果您愿意,请注意,如果您使用的是一些旧的 DOM 库,例如 MooTools 或 YUI 等,如果您添加它们,它们可能会混淆forEach
到HTMLCollection
。正如我之前所说,
NodeList
和HTMLCollection
都被指定为可迭代的(因为 这个Web IDL规则 ¹)。如果您遇到具有 ES2015+ 功能但由于某种原因 无法 使集合可迭代的浏览器,您也可以对其进行 polyfill:(对于
HTMLCollection
。)这是一个同时使用两者的实例,在(例如)IE11 上试试这个(尽管它只会演示
forEach
),而NodeList
本身没有这些功能:¹ 这令人困惑,因为
HTMLCollection
是可迭代的,但它 没有 标有iterable
声明,这在 JavaScript DOM 绑定中奇怪地 并不 意味着某些东西是可迭代的,这意味着它具有forEach
keys
,entries
values
但是HTMLCollection
,它没有标有iterable
声明,仍然是可迭代的。相反,由于前面提到的 Web IDL 规则,它是可迭代的。