2016-04-23 15 views
11

Internet Explorerで私の角型アプリケーションに問題があります。それは問題なく(Chrome、Mozilla、Edge)どこでも動作しますが、IE上で動作します。Array.from in Internet Explorer

私はエラーがある開発者のエクスプローラで検査した結果、エラーが次の行に発生することが戻ってきた:

:これは私が取得しています、次のエラーメッセージがある

myDataSet[index - 1].data = Array.from(tmp);

:私は、次のデータが含まれていtmpという名前Set()を持っていることがあるやっている何

Object does not support property or method from at Anonymous function....(etc.)

enter image description here

その後、私は単純に、このSetからの単純な配列オブジェクトを作成しています。

どうすればこの問題を解決できますか?

if (!Array.from) { 
    Array.from = (function() { 
    var toStr = Object.prototype.toString; 
    var isCallable = function (fn) { 
     return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; 
    }; 
    var toInteger = function (value) { 
     var number = Number(value); 
     if (isNaN(number)) { return 0; } 
     if (number === 0 || !isFinite(number)) { return number; } 
     return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); 
    }; 
    var maxSafeInteger = Math.pow(2, 53) - 1; 
    var toLength = function (value) { 
     var len = toInteger(value); 
     return Math.min(Math.max(len, 0), maxSafeInteger); 
    }; 

    // The length property of the from method is 1. 
    return function from(arrayLike/*, mapFn, thisArg */) { 
     // 1. Let C be the this value. 
     var C = this; 

     // 2. Let items be ToObject(arrayLike). 
     var items = Object(arrayLike); 

     // 3. ReturnIfAbrupt(items). 
     if (arrayLike == null) { 
     throw new TypeError("Array.from requires an array-like object - not null or undefined"); 
     } 

     // 4. If mapfn is undefined, then let mapping be false. 
     var mapFn = arguments.length > 1 ? arguments[1] : void undefined; 
     var T; 
     if (typeof mapFn !== 'undefined') { 
     // 5. else 
     // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. 
     if (!isCallable(mapFn)) { 
      throw new TypeError('Array.from: when provided, the second argument must be a function'); 
     } 

     // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. 
     if (arguments.length > 2) { 
      T = arguments[2]; 
     } 
     } 

     // 10. Let lenValue be Get(items, "length"). 
     // 11. Let len be ToLength(lenValue). 
     var len = toLength(items.length); 

     // 13. If IsConstructor(C) is true, then 
     // 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len. 
     // 14. a. Else, Let A be ArrayCreate(len). 
     var A = isCallable(C) ? Object(new C(len)) : new Array(len); 

     // 16. Let k be 0. 
     var k = 0; 
     // 17. Repeat, while k < len… (also steps a - h) 
     var kValue; 
     while (k < len) { 
     kValue = items[k]; 
     if (mapFn) { 
      A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); 
     } else { 
      A[k] = kValue; 
     } 
     k += 1; 
     } 
     // 18. Let putStatus be Put(A, "length", len, true). 
     A.length = len; 
     // 20. Return A. 
     return A; 
    }; 
    }()); 
} 

答えて

23

Array.from次のドキュメントモードでサポートされていない:私は私のアプリに次のコードを追加した勧告に基づいて

EDIT

を癖は、Internet Explorer 6つの標準、Internet Explorerを7標準、Internet Explorer 8標準、Internet Explorer 9標準、Internet Explorer 10標準、Internet Explorer 11標準です。 Windows 8.1ではサポートされていません。

あなたのページ(JS code was copied from developer.mozilla.org)に以下のコードを追加してください。 ES6のArray.fromメソッドをエミュレートします。

Array.fromは、第6版のECMA-262標準に追加されました。 のように、標準の他の実装では存在しない可能性があります。 スクリプトの先頭に次のコードを挿入し、それをネイティブにサポートしていない の実装でArray.fromを使用できるようにして、この問題を回避できます。このアルゴリズムは とTypeErrorが元の値を持ち、callback.call がFunction.prototype.callの元の値になると仮定して、ECMA-262,6番目のバージョンで指定されているものと全く同じ です。 に加えて、真のiterablesはpolyfilledすることができないので、この 実装は、 第6版のECMA-262で定義されている汎用イテラブルをサポートしていません。

if (!Array.from) { 
    Array.from = (function() { 
    var toStr = Object.prototype.toString; 
    var isCallable = function (fn) { 
     return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; 
    }; 
    var toInteger = function (value) { 
     var number = Number(value); 
     if (isNaN(number)) { return 0; } 
     if (number === 0 || !isFinite(number)) { return number; } 
     return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); 
    }; 
    var maxSafeInteger = Math.pow(2, 53) - 1; 
    var toLength = function (value) { 
     var len = toInteger(value); 
     return Math.min(Math.max(len, 0), maxSafeInteger); 
    }; 

    // The length property of the from method is 1. 
    return function from(arrayLike/*, mapFn, thisArg */) { 
     // 1. Let C be the this value. 
     var C = this; 

     // 2. Let items be ToObject(arrayLike). 
     var items = Object(arrayLike); 

     // 3. ReturnIfAbrupt(items). 
     if (arrayLike == null) { 
     throw new TypeError("Array.from requires an array-like object - not null or undefined"); 
     } 

     // 4. If mapfn is undefined, then let mapping be false. 
     var mapFn = arguments.length > 1 ? arguments[1] : void undefined; 
     var T; 
     if (typeof mapFn !== 'undefined') { 
     // 5. else 
     // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. 
     if (!isCallable(mapFn)) { 
      throw new TypeError('Array.from: when provided, the second argument must be a function'); 
     } 

     // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. 
     if (arguments.length > 2) { 
      T = arguments[2]; 
     } 
     } 

     // 10. Let lenValue be Get(items, "length"). 
     // 11. Let len be ToLength(lenValue). 
     var len = toLength(items.length); 

     // 13. If IsConstructor(C) is true, then 
     // 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len. 
     // 14. a. Else, Let A be ArrayCreate(len). 
     var A = isCallable(C) ? Object(new C(len)) : new Array(len); 

     // 16. Let k be 0. 
     var k = 0; 
     // 17. Repeat, while k < len… (also steps a - h) 
     var kValue; 
     while (k < len) { 
     kValue = items[k]; 
     if (mapFn) { 
      A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); 
     } else { 
      A[k] = kValue; 
     } 
     k += 1; 
     } 
     // 18. Let putStatus be Put(A, "length", len, true). 
     A.length = len; 
     // 20. Return A. 
     return A; 
    }; 
    }()); 
} 
+0

ありがとうございます。私の 'Array.from'を置き換えるためにどのようなコードを使用するのかアドバイスできますか? –

+0

私は自分の答えを更新しました。 JavaScriptコードをページにコピーするだけです。たとえば、メインのJSファイルです。そしてあなたの問題は解決されます! –

+0

'myDataSet [index-1] .data = Array.prototype.slice.call(tmp);' – Redu

4

それはIEでサポートされていないですが、あなたはMDNからpolyfillを使用することができます。

3

私は同じ問題に直面しました。 polyfillを見て、それは巨大な脅威です。ここに2行の短い解決策があります。

基本的にOPは、配列のようなオブジェクトから単純な配列を作成する必要があります。私は自分の味に最も効率的な2行のプレーンをforループ(私はHTML DOMノードの配列オブジェクトから配列を作成しなければならなかった、同じJavaScript argumentsオブジェクトに適用)。それがこの方法を鳴らすことができOPのケースでは

var temp_array = [], 
    length = tmp.Set.length; 

for (var i = 0; i < length; i++) { 
    temp_array.push(tmp.Set[i]); 
} 

// Here you get the normal array "temp_array" containing all items 
// from your `tmp.Set`. 

が別の関数作成し、あなたは3行にIE < 9の場合のための普遍的な解決策を得ます。