为什么indexOf在数组IE8上不起作用?
本文翻译自:Why doesn't indexOf work on an array IE8?
The below function works fine on Opera, Firefox and Chrome. 以下功能在Opera,Firefox和Chrome上正常运行。 However, in IE8 it fails on the if ( allowed.indexOf(ext[1]) == -1)
part. 但是,在IE8中,它在if ( allowed.indexOf(ext[1]) == -1)
部分失败。
Does anyone know why? 有人知道为什么吗? Is there any obvious mistake? 有没有明显的错误?
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!');
}
}
#1楼
参考:https://stackoom.com/question/FE7D/为什么indexOf在数组IE-上不起作用
#2楼
Please careful with $.inArray if you want to use it. 如果要使用$ .inArray,请小心。 I just found out that the $.inArray is only works with "Array", not with String. 我刚刚发现$ .inArray仅适用于“ Array”,不适用于String。 That's why this function will not working in IE8! 这就是为什么此功能在IE8中不起作用的原因!
The jQuery API make confusion jQuery API令人困惑
The $.inArray() method is similar to JavaScript's native .indexOf() method in that it returns -1 when it doesn't find a match. $ .inArray()方法类似于JavaScript的本机.indexOf()方法,因为它找不到匹配项时返回-1。 If the first element within the array matches value, $.inArray() returns 0 如果数组中的第一个元素匹配值,则$ .inArray()返回0
--> They shouldn't say it "Similar". ->他们不应该说“类似”。 Since indexOf support "String" also! 由于indexOf支持“字符串”也!
#3楼
If you're using jQuery and want to keep using indexOf without worrying about compatibility issues, you can do this : 如果您使用的是jQuery并希望继续使用indexOf而不用担心兼容性问题,则可以执行以下操作:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(val) {
return jQuery.inArray(val, this);
};
}
This is helpful when you want to keep using indexOf
but provide a fallback when it's not available. 当您想继续使用indexOf
但在不可用时提供后备功能时,这很有用。
#4楼
You can use this to replace the function if it doesn't exist: 您可以使用它来替换该函数(如果不存在):
<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>
#5楼
The problem 问题
IE<=8 simply doesn't have an indexOf()
method for arrays. IE <= 8根本没有用于数组的indexOf()
方法。
The solution 解决方案
If you need indexOf
in IE<=8, you should consider using the following polyfill , which is recommended at the MDN : 如果您需要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;
};
}
Minified : 缩小:
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});
#6楼
Versions of IE before IE9 don't have an .indexOf()
function for Array, to define the exact spec version , run this before trying to use it: IE9之前的IE版本没有用于Array的.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;
};
}
This is the version from MDN , used in Firefox/SpiderMonkey. 这是MDN的版本,在Firefox / SpiderMonkey中使用。 In other cases such as IE, it'll add .indexOf()
in the case it's missing... basically IE8 or below at this point. 在其他情况下,例如IE,它会在丢失的情况下添加.indexOf()
...此时基本上是IE8或更低版本。