【问题标题】:Object doesn't support property or method 'forEach' IE 11对象不支持属性或方法“forEach”IE 11
【发布时间】:2018-09-11 04:54:31
【问题描述】:

我有下面的sn-p

data.forEach(function (row) {
var dataRow = [];

columns.forEach(function (column) {

dataRow.push(row[column].toString());
})

这给了我错误data.forEach(function (row) { 。对此应该有什么替代?如何解决?

【问题讨论】:

  • @brk 这个 polyfill 是针对 Array#forEach 的。被骗的目标是 NodeList#forEach。另外,RAM 你能确认它确实是你尝试使用的 NodeList#forEach。
  • nodelist#forEach polyfill - 我怀疑 OP 是否在谈论 NodeList
  • 是的,这听起来更像data 不是它应该的样子。我重新打开(save-link-to-prev-dupe-target)。但请注意,就目前而言,这个问题仍应关闭,因为它缺少一些您应该采取的信息和调试步骤(例如,在您调用其不存在的 forEach 方法之前,data 是什么?)
  • 当数据是一个对象时,你不能循环遍历 forEach。它应该在阵列上运行。为了遍历对象,您应该尝试: for (var key in data) { if (data.hasOwnProperty(key)) { console.log(key + " -> " + data[key]); // 这里你会得到key和value } }

标签: javascript jquery arrays internet-explorer


【解决方案1】:

对于任何使用 document.querySelectorAll('..').forEach() 并在 IE 11 中遇到此问题并说“forEach 不是函数”的人,我在 reddit 上发现了一个很好用的 hack:

if (typeof NodeList.prototype.forEach !== 'function')  {
    NodeList.prototype.forEach = Array.prototype.forEach;
}

这很完美,只需要 3 行代码而不是 polyfill。

@JoeTaras 在他的回答中暗示了这一点(是的,IE 确实自 IE9 起就有Array.forEach),但我仍然认为我的回答增加了价值,并将帮助其他用户。

【讨论】:

  • 这是在完美的时间发布的!非常感谢!不知道为什么会损坏,但这是金子!
【解决方案2】:

IE11 知道forEach 语句(与 IE 9.0 兼容,请参阅here),但如果您愿意,可以使用 forEach 代替 forEach 语句,如下所示:

我已经编辑了我的答案,如果是一个数组,添加一个检查数据对象

if (data != null && Array.isArray(data)) {
    var dataRow = [];
    for (var i = 0; i < data.length; i++) {
        var row = data[i];
        for (var j = 0; j < columns.length; i++) {
            var column = columns[i];

            dataRow.push(row[column].toString());
        }
    }
}

【讨论】:

  • 假设data 变量包含一个索引对象,这是一个强有力的假设,因为它没有#forEach 方法。 + var foo=bar 在 for 循环中...
  • @Kaiido:嗨,是的,我是基于问题的。但现在我编辑我的问题
  • 啊不,我们至少知道data 不是数组。幸运的是 IE11 确实支持 Array#forEach
猜你喜欢
  • 1970-01-01
  • 2021-02-24
  • 2019-07-05
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多