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!');
    }
}
Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top