对象不支持属性或方法'条目'

时间:2017-02-24 18:42:47

标签: javascript internet-explorer compatibility

我正在使用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控制台转储

enter image description here

4 个答案:

答案 0 :(得分:13)

从本质上讲,填充是一种可以手动定义特定平台/浏览器本身不支持的功能的方法。

在您的情况下,此处给出了函数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文件(在运行应用程序之前执行),您可以在其中放置此类代码或导入包含您需要的定义的文件。

10/30/2018更新:

@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();
}

答案 1 :(得分:13)

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

import 'core-js/es7/object';

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

enter image description here

答案 2 :(得分:1)

通过导入

import 'core-js/es7/object';

如果遇到错误

未找到模块:错误:无法解析'core-js / es7 / object'

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

import 'core-js/es/object';

答案 3 :(得分:0)

我在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; 
        }; 
  }