固定的JavaScript数组函数在Internet Explorer(的indexOf,的forE

2019-05-10 11:02发布

至于详细的其他地方 ,否则显然是众所周知的,IE浏览器(版本绝对7,并在某些情况下,版本8)不执行关键功能,特别是在Array (如forEachindexOf等)。

有一些变通办法在这里和那里,但我想正确的,规范的一套实现折叠到我们的网站,而不是复制和粘贴或谬以千里,在我们自己的实现。 我发现JS的方法 ,这看起来很有希望,但想到我会在这里发表,看看是否有另一个自带库更加强烈推荐。 一对夫妇的其他条件:

  • 图书馆应该仅仅是一个浏览器已经实现了(这些功能无操作js-methods似乎做的相当不错这里)。
  • 非GPL ,请,虽然LGPL是可以接受的。

Answer 1:

许多使用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功能能够可靠地实现的方法。



Answer 2:

看看Underscore.js 。



Answer 3:

克里斯·科瓦尔编制充当可以从浏览器的执行缺少的ECMAScript 5功能的垫片一个小型图书馆。 一些功能已经被其他人修改后的无数次的速度进行优化,以解决浏览器的bug。 该功能将被写入尽可能地遵循规范。

ES5-shim.js是在MIT许可下发布的,该Array.prototype扩展是靠近顶部,你可以砍,并删除你不需要很轻松地将任何功能。 我也建议你再缩小脚本的意见,使其远远大于它需要。



Answer 4:

通过“不实现关键功能”,你其实就是“符合ECMA 262 3'rd版”吧? :)

你是指的方法是新的第5'版的一部分-的浏览器不支持此您可以使用下面的“垫片”延伸到3'rd第5' http://github.com/kriskowal/narwhal- LIB / BLOB /独角鲸-lib的/ lib目录/全球es5.js 。



Answer 5:

这些脚本没有在我的测试很好地工作。 我创建基于相同功能的文件MDN文件。

太多的问题区域Internet Explorer 8中得到解决,请参见代码egermano / IE-fix.js



Answer 6:

随着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]