至于详细的其他地方 ,否则显然是众所周知的,IE浏览器(版本绝对7,并在某些情况下,版本8)不执行关键功能,特别是在Array
(如forEach
, indexOf
等)。
有一些变通办法在这里和那里,但我想正确的,规范的一套实现折叠到我们的网站,而不是复制和粘贴或谬以千里,在我们自己的实现。 我发现JS的方法 ,这看起来很有希望,但想到我会在这里发表,看看是否有另一个自带库更加强烈推荐。 一对夫妇的其他条件:
- 图书馆应该仅仅是一个浏览器已经实现了(这些功能无操作
js-methods
似乎做的相当不错这里)。 - 非GPL ,请,虽然LGPL是可以接受的。
许多使用MDC回退的实现(例如,为的indexOf )。 他们一般严格符合标准,甚至明确地检查类型的所有参数的程度。
不幸的是,而很显然,作者把这段代码为琐碎和可自由使用,似乎没有成为一个明确的牌照发放把这个写下来。 维基作为一个整体是CC署名方式共享,如果这是一个可接受的许可证(尽管CC不是设计用于代码本身)。
JS-方法长相一般不错,但不是作为符合标准的周围的功能是如何应该是(例如不确定列表项,即变异列表功能)的边缘。 这也是充满了其他随机非标准方法,包括一些可疑的像狡猾的stripTags和不完整的UTF-8编码解码器(这也是一个有点不必要给出的unescape(encodeURIComponent)
欺骗)。
对于它的价值,这是我使用的(我在此释放到公共领域,如果可以说是版权保护的话)。 它比MDC版本更短一点,因为它不尝试键入嗅探,你有没有做过一些愚蠢像传递非函数回调或非整数索引,但除此之外,它试图要符合标准。 (让我知道如果我错过了什么。;-))
'use strict';
// Add ECMA262-5 method binding if not supported natively
//
if (!('bind' in Function.prototype)) {
Function.prototype.bind= function(owner) {
var that= this;
if (arguments.length<=1) {
return function() {
return that.apply(owner, arguments);
};
} else {
var args= Array.prototype.slice.call(arguments, 1);
return function() {
return that.apply(owner, arguments.length===0? args : args.concat(Array.prototype.slice.call(arguments)));
};
}
};
}
// Add ECMA262-5 string trim if not supported natively
//
if (!('trim' in String.prototype)) {
String.prototype.trim= function() {
return this.replace(/^\s+/, '').replace(/\s+$/, '');
};
}
// Add ECMA262-5 Array methods if not supported natively
//
if (!('indexOf' in Array.prototype)) {
Array.prototype.indexOf= function(find, i /*opt*/) {
if (i===undefined) i= 0;
if (i<0) i+= this.length;
if (i<0) i= 0;
for (var n= this.length; i<n; i++)
if (i in this && this[i]===find)
return i;
return -1;
};
}
if (!('lastIndexOf' in Array.prototype)) {
Array.prototype.lastIndexOf= function(find, i /*opt*/) {
if (i===undefined) i= this.length-1;
if (i<0) i+= this.length;
if (i>this.length-1) i= this.length-1;
for (i++; i-->0;) /* i++ because from-argument is sadly inclusive */
if (i in this && this[i]===find)
return i;
return -1;
};
}
if (!('forEach' in Array.prototype)) {
Array.prototype.forEach= function(action, that /*opt*/) {
for (var i= 0, n= this.length; i<n; i++)
if (i in this)
action.call(that, this[i], i, this);
};
}
if (!('map' in Array.prototype)) {
Array.prototype.map= function(mapper, that /*opt*/) {
var other= new Array(this.length);
for (var i= 0, n= this.length; i<n; i++)
if (i in this)
other[i]= mapper.call(that, this[i], i, this);
return other;
};
}
if (!('filter' in Array.prototype)) {
Array.prototype.filter= function(filter, that /*opt*/) {
var other= [], v;
for (var i=0, n= this.length; i<n; i++)
if (i in this && filter.call(that, v= this[i], i, this))
other.push(v);
return other;
};
}
if (!('every' in Array.prototype)) {
Array.prototype.every= function(tester, that /*opt*/) {
for (var i= 0, n= this.length; i<n; i++)
if (i in this && !tester.call(that, this[i], i, this))
return false;
return true;
};
}
if (!('some' in Array.prototype)) {
Array.prototype.some= function(tester, that /*opt*/) {
for (var i= 0, n= this.length; i<n; i++)
if (i in this && tester.call(that, this[i], i, this))
return true;
return false;
};
}
这里没有实施其他ECMA262-5方法包括阵列reduce
/ reduceRight
的JSON者和一些新的Object
,可以作为JS功能能够可靠地实现的方法。
克里斯·科瓦尔编制充当可以从浏览器的执行缺少的ECMAScript 5功能的垫片一个小型图书馆。 一些功能已经被其他人修改后的无数次的速度进行优化,以解决浏览器的bug。 该功能将被写入尽可能地遵循规范。
ES5-shim.js是在MIT许可下发布的,该Array.prototype扩展是靠近顶部,你可以砍,并删除你不需要很轻松地将任何功能。 我也建议你再缩小脚本的意见,使其远远大于它需要。
通过“不实现关键功能”,你其实就是“符合ECMA 262 3'rd版”吧? :)
你是指的方法是新的第5'版的一部分-的浏览器不支持此您可以使用下面的“垫片”延伸到3'rd第5' http://github.com/kriskowal/narwhal- LIB / BLOB /独角鲸-lib的/ lib目录/全球es5.js 。
这些脚本没有在我的测试很好地工作。 我创建基于相同功能的文件MDN文件。
太多的问题区域Internet Explorer 8中得到解决,请参见代码egermano / IE-fix.js 。
随着Underscore.js
var arr=['a','a1','b'] _.filter(arr, function(a){ return a.indexOf('a') > -1; })
文章来源: Fixing JavaScript Array functions in Internet Explorer (indexOf, forEach, etc.) [closed]