为什么indexOf不能在IE8阵列上工作?

nLL*_*nLL 291 javascript internet-explorer indexof internet-explorer-8

以下功能适用于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!');
    }
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*ver 486

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;
  };
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Mike - 这是一个不同的问题......你不应该使用`for ... in`循环来*迭代*一个数组,它应该仅用于*枚举*. (5认同)
  • @Mike - 你为了更多的原因迭代一个数组,比如在浏览器中以正确的顺序获得结果.在数组上使用`for..in`只会导致问题,它不仅仅是一种约定......它的意外用法和不正确的用法.顺序和键都没有完全指定,它们是依赖于实现的...例如,IE将按照它们被添加*的顺序*枚举*数组项,而不是它们的索引.但是,您可以*正确迭代*,通过索引访问. (3认同)
  • 请注意,如果您(或您使用的库)使用for/in语法枚举数组(例如for(arxyname中的idx)stmt;),则此方法也将被枚举.这是因为内置属性不是由for/in枚举的,而是由用户定义的属性. (2认同)

tie*_*egz 151

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

  • 我同意这更有用.这是使用JQuery的主要原因之一 - 它可以减轻跨浏览器的不兼容性. (6认同)

Meh*_*way 17

如果您正在使用jQuery并希望继续使用indexOf而不必担心兼容性问题,则可以执行以下操作:

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(val) {
        return jQuery.inArray(val, this);
    };
}
Run Code Online (Sandbox Code Playgroud)

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


Lui*_*rez 10

对于一个非常详尽的解释和解决方法,不仅对于indexOf而且在IE中缺少其他数组函数,请查看StackOverflow问题在Internet Explorer中修复JavaScript数组函数(indexOf,forEach等)


ptg*_*amr 5

如果你想使用它,请小心$ .inArray.我刚刚发现$ .inArray只适用于"Array",而不适用于String.这就是为什么这个功能无法在IE8中运行!

jQuery API让人感到困惑

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

- >他们不应该说"相似".由于indexOf支持"String"也!

  • 它叫做'inArray`.这似乎非常明确地仅适用于数组.这就是为什么它"相似"而不是"相同". (14认同)