下面的函数在 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!');
    }
}
有帮助吗?

解决方案

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

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以下。

其他提示

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

如果你使用的的jQuery 并想用的indexOf而不用担心兼容性问题留着,你可以这样做:

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

这在要使用indexOf继续,但提供一个备用的,当它不使用是有帮助的。

要获得真正彻底的解释和解决方法,不仅适用于 indexOf,还适用于 IE 中缺少的其他数组函数,请查看 StackOverflow 问题 修复 Internet Explorer 中的 JavaScript 数组函数(indexOf、forEach 等)

请小心使用$ .inArray,如果你想使用它。 我刚刚发现的$ .inArray是只能用“阵列”,而不是与字符串的工作原理。 这就是为什么这个功能不会在IE8工作的!

jQuery的API化妆混乱

  

在$ .inArray()方法类似于JavaScript的天然.indexOf()   方法,它返回-1,当它没有找到一个匹配。如果   阵列内的第一元素相匹配值,$ .inArray()返回0

- >他们不应该说“类似”。由于支持的indexOf “字符串” 也!

问题

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


解决方案

如果你需要 indexOf 在 IE<=8 中,您应该考虑使用以下内容 填充材料, ,即 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});

您可以用它来替换功能,如果它不存在:

<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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top