Por que o indexOf não funciona em um array IE8?

A function abaixo funciona bem no Opera, Firefox e Chrome. No entanto, no IE8 ele falha na parte if ( allowed.indexOf(ext[1]) == -1) .

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

Versões do IE antes do IE9 não têm uma function .indexOf() para o Array, 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 do MDN , usada no Firefox / SpiderMonkey. Em outros casos, como o IE, ele adicionará .indexOf() no caso de estar faltando ... basicamente o IE8 ou abaixo neste ponto.

Se você estiver usando o jQuery, poderá usar $ .inArray () .

Se você estiver usando o jQuery e quiser continuar usando o indexOf sem se preocupar com problemas de compatibilidade, faça o seguinte:

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

Isso é útil quando você deseja continuar usando o indexOf mas fornece uma alternativa quando não está disponível.

Para uma explicação realmente completa e solução alternativa, não apenas para indexOf, mas outras funções de matriz faltando no IE, confira a pergunta StackOverflow Fixing JavaScript Array no Internet Explorer (indexOf, forEach, etc.)

Por favor, tenha cuidado com $ .inArray se você quiser usá-lo. Acabei de descobrir que o $ .inArray só funciona com “Array”, não com String. É por isso que esta function não funcionará no IE8!

A API do jQuery faz confusão

O método $ .inArray () é semelhante ao método nativo .indexOf () do JavaScript, na medida em que retorna -1 quando não encontra uma correspondência. Se o primeiro elemento da matriz corresponder ao valor, $ .inArray () retornará 0

-> Eles não deveriam dizer “Similar”. Desde indexOf suporte “String” também!

O problema

IE < = 8 simplesmente não possui um método indexOf() para matrizes.


A solução

Se você precisar indexOf no IE < = 8, considere usar o seguinte polyfill , 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 replace a function se ela não existir: