1

IE8では配列フィルタ機能がサポートされていないことがわかりました。インターネットでヘルプを探した後、これを見つけました - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter

上記のコードを使用してIE8が動作することを示唆しています。

HTML コード:

<body>
<a href="javascript:void(0)" onclick="calculateDiff()">Calculate</a>
</body>

JS コード:

function calculateDiff() {
    var arr1 = new Array(1, 2, 3);
    var arr2 = new Array(3, 4, 5);
    var res = arr1.diff(arr2);

    alert(res);
}


Array.prototype.diff = function(a) {

    if(!Array.prototype.filter) {
        alert("not supported");
        Array.prototype.filter = function(fun) {
            "use strict";

            if(this == null)
                throw new TypeError();

            var t = Object(this);
            var len = t.length >>> 0;
            if(typeof fun != "function")
                throw new TypeError();

            var res = [];
            var thisp = arguments[1];
            for(var i = 0; i < len; i++) {
                if(i in t) {
                    var val = t[i]; // in case fun mutates this
                    if (fun.call(thisp, val, i, t))
                        res.push(val);
                }
            }

            return res;
        };
    }
    else {
        alert("supported");
        return this.filter(function(i) {
            return !(a.indexOf(i) > -1);
        });
    }
}

私はこのフィドルでソリューションを実装しました - http://jsfiddle.net/7LFMA/

コードのどこが間違っていますか? なぜ機能しないのですか?

4

2 に答える 2

3

diff初めて実行するときは、警告を発し、ポリフィル"Not Supported"をインストールするだけで、何もしません。本来のようにdiffするのではなく、単に戻るだけです。filterundefined

を削除するか、インストールを関数の外にelse移動することをお勧めします-それはその一部ではありません(たとえば、最近のエンジンはこれを気にしますが、クロージャーの観点から)。filterdiff

また、IE8はこのメソッドをサポートしていないため、この互換性のあるシムindexOfも挿入する必要があります。

if (!Array.prototype.indexOf)
    Array.prototype.indexOf = function (searchElement) {…};

if (!Array.prototype.filter)
    Array.prototype.filter = function(fun) {…};

Array.prototype.diff = function(a) {
    return this.filter(function(i) {
        return !(a.indexOf(i) > -1);
    });
};

function calculateDiff() {
    var arr1 = new Array(1, 2, 3);
    var arr2 = new Array(3, 4, 5);
    var res = arr1.diff(arr2);

    alert(res);
}
于 2013-03-22T09:47:38.813 に答える
1

IE8 は配列の indexOf をサポートしていません。コード内でまだ使用しているため、フィルターを実装すると存在し、IE8 は indexOf を使用しようとします。

コードでは、DIFF を呼び出すと実際にはフィルターを適用しませんが、一度それを行うと、indexOf も実装する必要があります。

MDN 配列 indexOf

于 2013-03-22T09:37:29.540 に答える