294

以下功能在 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!');
    }
}
4

7 回答 7

488

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 或更低版本。

于 2010-09-02T16:38:12.473 回答
153

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

于 2012-01-18T16:56:56.947 回答
17

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

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

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

于 2014-02-28T18:03:47.110 回答
10

有关真正彻底的解释和解决方法,不仅针对 indexOf,而且 IE 中缺少其他数组函数,请查看 StackOverflow 问题Fixing JavaScript Array functions in Internet Explorer (indexOf, forEach, etc.)

于 2012-01-11T02:40:43.630 回答
5

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

jQuery API 造成混乱

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

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

于 2013-09-04T08:24:10.607 回答
3

问题

IE<=8 根本没有indexOf()数组的方法。


解决方案

如果你需要indexOf在 IE<=8 中,你应该考虑使用下面的polyfill,这是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});
于 2016-02-21T17:43:45.770 回答
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>
于 2015-02-23T17:22:18.740 回答