【问题标题】:Object doesn't support property or method 'entries'对象不支持属性或方法“条目”
【发布时间】:2017-07-15 17:22:04
【问题描述】:

我正在使用 FormData 对象,而我的代码在 Chrome 上运行良好,Microsoft Edge 会吐出以下错误消息 Object doesn't support property or method 'entries' - 对应于以下代码:

for(let pair of formData.entries()) {
  ...
}

我尝试将 .entries() 替换为 .getAll(),但 Microsoft Edge 无法识别这两种方法中的任何一种。

有没有办法从 Microsoft Edge 中获取此功能(迭代 FormData 文件)?

FormData Microsoft Edge 控制台转储

【问题讨论】:

  • entriesgetAll 目前不受 Edge 支持。检查最后的浏览器兼容性部分。
  • 你需要一个 polyfill,因为 Edge 不支持它。在此处查看 polyfill:developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
  • 您介意将其发布为答案吗?这将帮助那里的许多人遇到此错误。
  • @Agalo MDN 文档不稳定Compatibility unknown; please update this.
  • 为什么在询问microsoft-edge 时会标记为internet-explorer

标签: javascript internet-explorer compatibility


【解决方案1】:

2020 年 2 月 10 日更新: 就像@Monomachus 所说,首先尝试将此行添加到 polyfill.ts:

import 'core-js/es7/object';

如果这能解决问题,请务必将他的答案归功于他!如果需要,您可以使用以下说明手动定义它:


原始回复: 本质上,polyfill 是一种手动定义特定平台/浏览器本身不支持的函数的方法。

在您的情况下,这里给出了函数 Object.entries 的基本定义: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Polyfill

他们提供了这个简单的、可部署的定义:

if (!Object.entries)
  Object.entries = function( obj ){
    var ownProps = Object.keys( obj ),
        i = ownProps.length,
        resArray = new Array(i); // preallocate the Array
    while (i--)
      resArray[i] = [ownProps[i], obj[ownProps[i]]];

    return resArray;
  };

查看上面的代码,它首先检查的是Object.entries 是否存在。如果存在,不用担心,但如果它不存在,那么它会创建它...... 只要在您在代码中实际调用它之前定义了此函数,就可以了。

使用angular-cli 之类的东西,他们提供了一个 polyfills.ts 文件(在您的应用运行之前执行),您可以在其中放置这样的代码或导入包含您需要的定义的文件。


2018 年 10 月 30 日更新:

@apsillers 正确指出上述答案不适用于FormData.entries(),而是适用于Object.entries()

FormData.entries() 的解决方案(这对我有用): https://stackoverflow.com/a/49556416/3806701

基本上,导入这个 poly-fill:

<script src="https://unpkg.com/formdata-polyfill"></script>

然后你可以迭代FormData如下:

var formDataEntries = (<any>formData).entries(), formDataEntry = formDataEntries.next(), pair;
while (!formDataEntry.done) {
    pair = formDataEntry.value;
    console.log(pair[0] + ', ' + pair[1]);
    formDataEntry = formDataEntries.next();
}

【讨论】:

  • 这对我不起作用。我仍然收到错误Object doesn't support property or method 'entries'
  • 如果你在 2020 年努力解决这个问题(使用 React),请看这个答案:stackoverflow.com/questions/60079188/…
  • 将 es7 更改为 es 对我有用:import 'core-js/es/object';在 Polyfills 文件中。
  • 你应该同时导入 es6 和 es7 对象import 'core-js/es6/object' & import 'core-js/es7/object'
【解决方案2】:

如果您使用 Angular 应用程序,请将此行添加到您的 polyfills.ts 文件中

import 'core-js/es7/object';

它将导入对象上的所有新方法,包括条目

【讨论】:

  • 这在从 Angular 6 升级到 Angular 8 时有效。太棒了!
【解决方案3】:

通过导入

import 'core-js/es7/object';

如果你遇到错误

找不到模块:错误:无法解析“core-js/es7/object”

然后将导入中的所有“es6”和“es7”更改为“es”。

import 'core-js/es/object';

【讨论】:

    【解决方案4】:

    我在我的 polyfills.ts 中添加了以下代码,它对我有用。

    import 'core-js/es7/object';
    import 'core-js/es7/array';
    
    if (!Object.entries)
      { Object.entries = function(obj)
            { 
              var ownProps = Object.keys(obj),
              i = ownProps.length,
              resArray = new Array(i); // preallocate the Array while (i--) 
              resArray[i] = [ownProps[i], obj[ownProps[i]]]; 
              return resArray; 
            }; 
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-21
      • 2019-07-05
      • 2015-04-14
      • 2020-09-03
      • 2015-04-09
      • 2014-01-12
      • 2016-08-20
      • 2013-10-05
      相关资源
      最近更新 更多