为什么在一个数组IE8上不工作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!');
}
}
124978 次浏览

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()的情况下添加.indexOf()…基本上是IE8或更低版本。

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

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

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

jQuery API让人困惑

$.inArray()方法类似于JavaScript的原生.indexOf()方法 方法,在没有找到匹配时返回-1。如果 如果数组中的第一个元素与value匹配,$.inArray()返回0

他们不应该说“相似”。因为indexOf也支持“字符串”!

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

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

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

如果这个函数不存在,你可以用它来替换它:

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

这个问题

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


解决方案

如果你需要在IE<=8中使用indexOf,你应该考虑使用下面的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});