为什么indexOf不能在数组IE8上工作?

下面的function在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版本没有Array的.indexOf()函数来定义准确的spec版本 ,在尝试使用它之前运行它:

 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中使用的MDN的版本。 在其他情况下,如IE,它会添加.indexOf()的情况下,它是缺less的…基本IE8或以下在这一点上。

如果您使用jQuery,则可以使用$ .inArray() 。

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

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

当您想要继续使用indexOf时,这是有帮助的,但是当它不可用时提供回退。

对于一个真正彻底的解释和解决方法,不仅是indexOf,而是IE中缺less的其他数组函数,请查看StackOverflow问题修复Internet Explorer中的JavaScript数组函数(indexOf,forEach等)

如果你想使用它,请小心$ .inArray。 我刚刚发现$ .inArray只适用于“数组”,而不是String。 这就是为什么这个function不能在IE8中工作!

jQuery API令人困惑

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

– >他们不应该说“相似”。 既然indexOf也支持“String”!

问题

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


解决scheme

如果您在IE <= 8时需要indexOf ,则应考虑使用以下在MDN中build议的填充 :

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

如果函数不存在,可以使用它来replace函数:

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