Por que o índice de não funciona em uma matriz IE8?
-
26-09-2019 - |
Pergunta
A função abaixo funciona bem na Opera, Firefox e Chrome. No entanto, no IE8, falha no if ( allowed.indexOf(ext[1]) == -1)
papel.
Alguem sabe por quê? Existe algum erro óbvio?
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!');
}
}
Solução
Versões do IE antes do IE9 não têm um .indexOf()
função para matriz, para definir a versão exata da especificação, execute isso antes de tentar usá -lo:
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;
};
}
Esta é a versão de mdn, usado em Firefox/Spidermonkey. Em outros casos, como o IE, vai adicionar .indexOf()
No caso está faltando ... basicamente IE8 ou abaixo neste momento.
Outras dicas
Se você está usando jQuery, você pode usar $ .inArray () em vez de.
Se você está usando jQuery E quero continuar usando o indexOF sem se preocupar com problemas de compatibilidade, você pode fazer isso:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(val) {
return jQuery.inArray(val, this);
};
}
Isso é útil quando você deseja continuar usando indexOf
mas forneça um fallback quando não estiver disponível.
Para uma explicação e solução alternativa realmente completa, não apenas para indexof, mas outras funções de matriz ausentes no ou seja, confira a pergunta do Stackoverflow Corrigindo as funções JavaScript Array no Internet Explorer (indexof, foreach, etc.)
Por favor, com cuidado com $ .inArray se você quiser usá -lo. Acabei de descobrir que o $ .inArray é só trabalha com "Array", não com string. É por isso que essa função não funcionará no IE8!
A API jQuery faz confusão
O método $ .inArray () é semelhante ao método .IndexOf () nativo de JavaScript, pois retorna -1 quando não encontra uma correspondência. Se o primeiro elemento dentro do valor corresponder ao valor, $ .inArray () retornará 0
-> Eles não devem dizer isso "semelhante". Desde o índiceof Support "String" também!
O problema
Ou seja, <= 8 simplesmente não tem um indexOf()
Método para matrizes.
A solução
Se você precisar indexOf
No ie <= 8, você deve considerar usar o seguinte Polyfil, qual é Recomendado no 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;
};
}
Minificado:
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});
Você pode usar isso para substituir a função se ela não existir:
<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>