【发布时间】:2017-04-29 19:16:01
【问题描述】:
我正在运行这个 sn-p 控制台。在 IE 中,它按预期产生输出。在 Cr 和 FF 中运行相同以供参考证实了行为的一致性。
["a", "b"].forEach(function(element) {
console.log(element);
});
但是,在运行以下脚本时,我收到错误消息,告诉我该对象没有在其上声明 forEach(...)。该问题出现在 IE 中,但不在 Cr 和 FF 中。
var menus = document.querySelectorAll("ul.application>li>a");
menus.forEach(function(element) { ... }
我检查了变量 menus 是否已声明,并且选择它的元素会产生我所期望的,即 menus[0] 存在并且是一个标签。与其他浏览器相比,它在 IE 中看起来有些不同,但可能只是呈现方式不同。
我很幸运能与 Cr 和 FF 一起工作,所以我在处理 IE 方面的经验是有限的。谷歌搜索也没有给我太多智慧。
如何进一步排除故障?
【问题讨论】:
-
仅仅是因为 NodeList 不是一个数组(并且 IE/Safari 不支持 NodeList.forEach,请参阅MDN)。
-
据我所知,
querySelectorAll返回一个HtmlCollection,它与Array不同,Chrome 可能有一个内部 polyfill,因此它可以在那里工作。 -
“祝福”也是一个诅咒 :) 当浏览器通过实现自己的内部解决方法来弥补时,它们会让 IE 看起来很糟糕,也会让你依赖可能会或可能不会改变的自定义实现未来版本 :) 例如,不能保证 Chrome 将继续支持使用 forEach 扩展 HtmlCollection,他们过去已经这样做了 :) 虽然 IE 在很多方面都很糟糕,但如果你必须支持多个浏览器,包括特定版本的 IE,也许出于这些原因,首先在 IE 中运行会更好?
-
@FrançoisWahl 这实际上是一个很好的建议。我只是更喜欢 Cr 和 FF,因为我觉得这些工具更好。但我将不得不更仔细地检查 IE 中的内容。 (好吧,我的专用测试员将不得不这样做,呵呵。)
标签: javascript html foreach internet-explorer-11