为什么indexOf在数组IE8上不起作用?

2020/10/05 03:01 · javascript ·  · 0评论

以下功能在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()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或更低版本。

如果使用的是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仅适用于“ Array”,不适用于String。这就是为什么此功能在IE8中不起作用的原因!

jQuery API令人困惑

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

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

问题

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


解决方案

如果需要indexOfIE <= 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});

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

<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>
本文地址:http://javascript.askforanswer.com/weishenmeindexofzaishuzuie8shangbuqizuoyong.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!