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

mec*_*ous 15 javascript compatibility internet-explorer

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

for(let pair of formData.entries()) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

我试着更换.entries().getAll(),但微软边缘不承认任何的两种方法.

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

FormData Microsoft Edge控制台转储

在此输入图像描述

Mon*_*hus 19

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

import 'core-js/es7/object';
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述


cs_*_*pil 14

从本质上讲,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;
  };
Run Code Online (Sandbox Code Playgroud)

看看上面的代码,它检查的第一件事是否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>
Run Code Online (Sandbox Code Playgroud)

然后你可以迭代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();
}
Run Code Online (Sandbox Code Playgroud)