2013-03-22 44 views
1

我才知道,在IE8不支持濾鏡陣列功能。 尋找互聯網上的幫助後,我發現這一點 - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filterIE8濾鏡陣列()不工作

這表明,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/

什麼是錯誤的代碼?爲什麼它不起作用?

+0

你應該在你的陣列拆分出來.filter的檢查/創建() - 或者你會試圖把它每次爲.diff()被調用時,你只需要做一次。 - 所有缺失的ES5方法都有polyfills - 請看這裏:http://www.calormen.com/polyfill/ – Lewis 2013-03-22 09:40:07

回答

3

當運行diff首次,它只會警報"Not Supported",安裝filter填充,但什麼都不做。它只是返回undefined,而不是像它應該做的那樣區分。

取出else,或更好的只是移動filter安裝diff功能之外 - 這是不是要它的一部分(例如,在封閉的條件,雖然現代發動機會在乎這一點)。

此外,IE8不支持indexOf方法,您還需要將this compat shim也放入。

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); 
} 
+0

正如我會說如果我有時間:) +1 – mplungjan 2013-03-22 10:01:23

1

IE8不支持的indexOf數組 - 你還在使用它的代碼,所以一旦你實現過濾器,它確實存在,然後IE8將嘗試使用的indexOf。

在你的代碼實際上不應用過濾器,一旦你打電話DIFF但一旦你這樣做,你還需要實現的indexOf

MDN Array indexOf