web-dev-qa-db-ja.com

オブジェクトはプロパティまたはメソッド「エントリ」をサポートしていません

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 Console Dump

enter image description here

14
Bright

本質的に、ポリフィルは、特定のプラットフォーム/ブラウザでネイティブにサポートされていない関数を手動で定義する方法です。

あなたの場合、関数_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

基本的に、このポリフィルをインポートします。

_<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();
}
_
13
cs_pupil

Angularアプリの場合は、この行をpolyfills.tsファイルに追加してください

import 'core-js/es7/object';

エントリを含む、オブジェクトのすべての新しいメソッドをインポートします

enter image description here

17
Monomachus