为什么 indexOf 不适用于数组 IE8?

IT技术 javascript internet-explorer internet-explorer-8 indexof
2021-01-22 21:59:33

下面的函数在 Opera、Firefox 和 Chrome 上运行良好。但是,在 IE8 中它失败了if ( allowed.indexOf(ext[1]) == -1)

有谁知道为什么?有什么明显的错误吗?

function CheckMe() {
    var allowed = new Array('docx','xls','xlsx', 'mp3', 'mp4', '3gp', 'sis', 'sisx', 'mp3', 'wav', 'mid', 'amr', 'jpg', 'gif', 'png', 'jpeg', 'txt', 'pdf', 'doc', 'rtf', 'thm', 'rar', 'zip', 'htm', 'html', 'css', 'swf', 'jar', 'nth', 'aac', 'cab', 'wgz');
    var fileinput=document.getElementById('f');
    var ext = fileinput.value.toLowerCase().split('.');
    if ( allowed.indexOf(ext[1]) == -1) 
    {
        document.getElementById('uploadsec').innerHTML = document.getElementById('uploadsec').innerHTML;
        alert('This file type is not allowed!');
    }
}
6个回答

IE9 之前的 IE 版本没有.indexOf()用于 Array函数,要定义确切的规范版本,请在尝试使用它之前运行它:

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

这是来自 MDN的版本,用于 Firefox/SpiderMonkey。在其他情况下,例如 IE,它会.indexOf()在它丢失的情况下添加......此时基本上是 IE8 或更低版本。

@Mike - 您出于更多原因迭代数组..就像在浏览器中以正确的顺序获得结果一样。for..in在数组上使用只会导致问题,它不仅仅是一种约定......它是意外使用和不正确的使用。顺序和键都没有完全指定,它们依赖于实现......例如,IE 将按照添加顺序而不是索引枚举数组项但是,您可以正确迭代,按索引访问。
2021-03-18 21:59:33
这说明了枚举元素和使用索引进行迭代之间的区别。这就是为什么我们有两个概念。您可以枚举链表中的值,也可以抓取链表并将值从一个返回到下一个。一个是数学概念,一个是程序指令。
2021-03-20 21:59:33
请注意,如果您(或您使用的库)使用 for/in 语法来枚举数组(例如 for(idx in arrayname)stmt;),则该方法也将被枚举。这是因为内置属性不是由 for/in 枚举的,而是由用户定义的。
2021-03-24 21:59:33
@Pointy 是的!并且因为许多搜索“为什么 indexOf 在数组 IE8 上不起作用?” WRT 对 js 的复杂程度可能较低,指出这一点作为答案的必然结果可能会有所帮助。如果每个人都已经对规范和实现之间的差异有深入的了解,那么这样的线程就不会存在。@Nick 你对正确性做出了强有力的假设。有许多操作的顺序无关紧要(例如,设置差异)。此外,原始评论没有提到在索引序列中枚举,只是 for/in 包括用户定义 fn 的。
2021-03-31 21:59:33
@Mike - 这是一个不同的问题......你不应该使用for...in循环来迭代一个数组,它应该只用于枚举
2021-04-02 21:59:33

如果您使用 jQuery,则可以使用$.inArray()代替。

我同意这更有用。这是使用 JQuery 的主要原因之一 - 它在缓解跨浏览器不兼容方面做了很多工作。
2021-03-11 21:59:33

如果您正在使用jQuery并希望继续使用 indexOf 而不必担心兼容性问题,您可以这样做:

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(val) {
        return jQuery.inArray(val, this);
    };
}

当您想继续使用indexOf但在它不可用时提供后备时,这很有用。

是的,可能是因为他没有包含 jQuery ¯_(ツ)_/¯ 是有效的语法。
2021-04-09 21:59:33

要获得真正彻底的解释和解决方法,不仅对于 indexOf,而且对于 IE 中缺少的其他数组函数,请查看 StackOverflow 问题Fixing JavaScript Array functions in Internet Explorer(indexOf、forEach 等)

如果你想使用它,请小心使用 $.inArray。我刚刚发现 $.inArray 仅适用于“Array”,而不适用于 String。这就是为什么这个功能在 IE8 中不起作用的原因!

jQuery API 造成混淆

$.inArray() 方法类似于 JavaScript 的原生 .indexOf() 方法,因为它在找不到匹配项时返回 -1。如果数组中的第一个元素与值匹配,则 $.inArray() 返回 0

--> 他们不应该说“相似”。由于 indexOf 也支持“String”!

好记。有趣的事实是indexOf,在 IE 中完全可以找到 String 对象,而indexOf在 IE <= 8 中找不到 Array 原型。
2021-03-25 21:59:33
您将它绑定到数组原型,因此它不会影响字符串。
2021-03-25 21:59:33
它被称为inArray这似乎非常明确地仅适用于数组。这就是为什么它是“类似于”而不是“等同于”的原因。
2021-04-07 21:59:33