如何在 Internet Explorer 浏览器的 JavaScript 中修复数组 indexOf()

IT技术 javascript internet-explorer internet-explorer-8 cross-browser
2021-02-05 18:19:59

如果您使用过 JavaScript,您就会知道 Internet Explorer 没有为 Array.prototype.indexOf() [包括 Internet Explorer 8] 实现 ECMAScript 函数。这不是一个大问题,因为您可以使用以下代码扩展页面上的功能。

Array.prototype.indexOf = function(obj, start) {
     for (var i = (start || 0), j = this.length; i < j; i++) {
         if (this[i] === obj) { return i; }
     }
     return -1;
}

我应该什么时候实施这个?

我是否应该使用以下检查将它包装在所有页面上,检查原型函数是否存在,如果不存在,继续扩展数组原型?

if (!Array.prototype.indexOf) {

    // Implement function here

}

或者做浏览器检查,如果它是 Internet Explorer 那么就实现它?

//Pseudo-code

if (browser == IE Style Browser) {

     // Implement function here

}
6个回答

像这样做...

if (!Array.prototype.indexOf) {

}

作为MDC 推荐的兼容性

一般来说,浏览器检测代码是一个很大的禁忌。

MDC 到底是谁?
2021-03-15 18:19:59
它是否必须包含在每个 js 文件中?
2021-03-23 18:19:59
“链接”栏 ---> 真的很方便!我喜欢这里的答案: stackoverflow.com/questions/1744310/...
2021-03-24 18:19:59
如果您使用这种检测,请小心。另一个库可能会在您测试之前实现此功能,并且它可能不符合标准(prototype 已经完成了一段时间)。如果我在一个敌对的环境中工作(许多其他编码人员使用许多不同的库),我不会相信这些......
2021-04-02 18:19:59
我没有足够的代表来编辑问题,但可以随意删除 ECMAScript 术语并替换为适当的措辞。再次感谢
2021-04-06 18:19:59

或者,您可以使用jQuery 1.2 inArray 函数,它应该可以跨浏览器工作:

jQuery.inArray( value, array [, fromIndex ] )
'indexOf' 是本机代码(正确),那么 jQuery 'inArray()' 是否会一样快,例如在可用时使用本机而在不可用时使用 poly-fill?
2021-04-05 18:19:59
好的,所以回答我自己的评论(上面),我刚刚实现了它,在 Chrome 上它和我使用“indexOf()”时一样快,但在 IE 8 中它非常非常慢......所以至少我们知道'inArray()' 尽可能使用本机。
2021-04-05 18:19:59

完整的代码是这样的:

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(obj, start) {
         for (var i = (start || 0), j = this.length; i < j; i++) {
             if (this[i] === obj) { return i; }
         }
         return -1;
    }
}

有关此以及其他数组函数的真正彻底的答案和代码,请查看堆栈溢出问题Fixing JavaScript Array functions in Internet Explorer (indexOf, forEach, etc.)

感谢您拥有完整的东西。每当我在新项目中需要跨平台 indexOf 时,我都会经常访问此页面,而您的代码段是唯一具有完整代码的代码段。:) 当一个人经常访问这个页面时,那几秒钟真的加起来了。
2021-03-25 18:19:59

underscore.js 库有一个indexOf函数,你可以改用:

_.indexOf([1, 2, 3], 2)
此答案避免弄乱数组原型,并在可用时委托给本机 indexOf。我喜欢。
2021-03-31 18:19:59
如果您能够包含下划线或 lodash,这似乎是最简单的方法
2021-04-09 18:19:59

您应该检查它是否未使用if (!Array.prototype.indexOf).

另外,您的实现indexOf不正确。您必须在您的语句中使用===而不是,否则根据您的实现将是 1,这是不正确的。==if (this[i] == obj)[4,"5"].indexOf(5)

我建议您使用MDC 上的实现