2013-03-22 41 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