ti-enxame.com

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

A função 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!');
    }
}
291
nLL

Versões do IE antes do IE9 não possuem uma função .indexOf() para o Array, para definir a versão exata da especificação , execute isto 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.

485
Nick Craver

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

150
tiegz

Se você estiver usando jQuery e quiser continuar usando 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ê quiser continuar usando indexOf, mas fornecer um substituto quando não estiver disponível.

16
Mehdiway

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

9
Luis Perez

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 função 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 dentro da matriz corresponder ao valor, $ .inArray () retornará 0

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

5
ptgamr

O problema

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


A solução

Se você precisar de indexOf no IE <= 8, considere usar o seguinte polyfill , que é 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});
3
John Slegers

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>
1
Bob Cadmire