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

时间:2010-09-02 16:33:55

标签: javascript internet-explorer internet-explorer-8 indexof

以下功能适用于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 个答案:

答案 0 :(得分:485)

在IE9之前的IE版本没有用于Array的.indexOf()函数来定义the exact spec version,在尝试使用它之前运行它:

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;
  };
}

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

答案 1 :(得分:15)

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

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

如果您希望继续使用indexOf,但在不可用时提供备用,这会很有用。

答案 2 :(得分:9)

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

答案 3 :(得分:5)

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

jQuery API会造成混淆

  

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

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

答案 4 :(得分:3)

问题

IE&lt; = 8对数组没有indexOf()方法。

解决方案

如果您在IE&lt; = 8中需要indexOf,则应考虑使用以下polyfillrecommended at the MDN

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(searchElement, fromIndex) {
        var k;
        if (this == null) {
            throw new TypeError('"this" is null or not defined');
        }
        var o = Object(this);
        var len = o.length >>> 0;
        if (len === 0) {
            return -1;
        }
        var n = +fromIndex || 0;
        if (Math.abs(n) === Infinity) {
            n = 0;
        }
        if (n >= len) {
            return -1;
        }
        k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
        while (k < len) {
            if (k in o && o[k] === searchElement) {
                return k;
            }
            k++;
        }
        return -1;
    };
}

缩小:

Array.prototype.indexOf||(Array.prototype.indexOf=function(r,t){var n;if(null==this)throw new TypeError('"this" is null or not defined');var e=Object(this),i=e.length>>>0;if(0===i)return-1;var a=+t||0;if(Math.abs(a)===1/0&&(a=0),a>=i)return-1;for(n=Math.max(a>=0?a:i-Math.abs(a),0);i>n;){if(n in e&&e[n]===r)return n;n++}return-1});

答案 5 :(得分:1)

如果函数不存在,您可以使用它来替换该函数:

<script>
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;
    };
}
</script>