web-dev-qa-db-fra.com

Pourquoi indexOf ne fonctionne-t-il pas sur un tableau IE8?

La fonction ci-dessous fonctionne bien sur Opera, Firefox et Chrome. Cependant, dans IE8, la partie if ( allowed.indexOf(ext[1]) == -1) échoue.

Quelqu'un sait-il pourquoi? Y a-t-il une erreur évidente?

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

Les versions de IE antérieures à IE9 n'ont pas de fonction .indexOf() pour Array, à définir la version de spécification exacte , exécutez-le avant d'essayer de l'utiliser:

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;
  };
}

Ceci est la version de MDN , utilisée dans Firefox/SpiderMonkey. Dans d'autres cas tels que IE, cela ajoutera .indexOf() dans le cas où il manque ... essentiellement IE8 ou une version inférieure à ce stade.

486
Nick Craver

Si vous utilisez jQuery, vous pouvez utiliser $. InArray () .

150
tiegz

Si vous utilisez jQuery et souhaitez continuer à utiliser indexOf sans vous soucier des problèmes de compatibilité, procédez comme suit:

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

Ceci est utile lorsque vous souhaitez continuer à utiliser indexOf mais que vous fournissez une solution de repli lorsqu'elle n'est pas disponible.

17
Mehdiway

Pour une explication vraiment détaillée et une solution de contournement, non seulement pour indexOf mais d'autres fonctions de tableau manquantes dans IE, consultez la question StackOverflow Correction des fonctions de tableau JavaScript dans Internet Explorer (indexOf, forEach, etc.)

10
Luis Perez

S'il vous plaît faites attention avec $ .inArray si vous voulez l'utiliser. Je viens de découvrir que le $ .inArray fonctionne uniquement avec "Array", pas avec String. C'est pourquoi cette fonction ne fonctionnera pas dans IE8!

L'API jQuery fait confusion

La méthode $ .inArray () est similaire à la méthode native .indexOf () de JavaScript en ce sens qu'elle renvoie -1 lorsqu'elle ne trouve pas de correspondance. Si le premier élément du tableau correspond à la valeur, $ .inArray () renvoie 0

-> Ils ne devraient pas le dire "similaire". Depuis indexOf supporte "String" aussi!

5
ptgamr

Le problème

IE <= 8 n'a tout simplement pas de méthode indexOf() pour les tableaux.


La solution

Si vous avez besoin de indexOf dans IE <= 8, vous devriez envisager d'utiliser le suivant polyfill , qui est recommandé par le 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});
3
John Slegers

Vous pouvez l'utiliser pour remplacer la fonction si elle n'existe pas:

<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