292 votes

Pourquoi indexOf ne fonctionne pas sur un tableau IE8 ?

La fonction ci-dessous fonctionne bien sur opera, firefox et chrome. Cependant, dans IE8, elle échoue sur if ( allowed.indexOf(ext[1]) == -1) partie.

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

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

486voto

Nick Craver Points 313913

Les versions d'IE antérieures à IE9 ne disposent pas d'une fonction .indexOf() pour Array, pour définir la version exacte de la spécification Exécutez ceci 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;
  };
}

Voici la version du MDC utilisé dans Firefox/SpiderMonkey. Dans d'autres cas, comme IE, il ajoutera .indexOf() dans le cas où il n'y en a pas... en principe IE8 ou moins à ce stade.

152voto

tiegz Points 1228

Si vous utilisez jQuery, vous pouvez utiliser $.inArray() à la place.

17voto

Mehdiway Points 571

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

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

C'est utile lorsque vous voulez continuer à utiliser indexOf mais prévoir une solution de repli lorsqu'elle n'est pas disponible.

Mettez ceci en haut de votre premier fichier javascript chargé, après $(document).ready(function() {

10voto

luisperezphd Points 3220

Pour une explication très complète et une solution de contournement, non seulement pour indexOf mais aussi pour d'autres fonctions de tableau manquantes dans IE, consultez la question de StackOverflow. Correction des fonctions javascript Array dans Internet Explorer (indexOf, forEach, etc)

5voto

ptgamr Points 63

Veuillez faire attention à $.inArray si vous voulez l'utiliser. Je viens de découvrir que $.inArray ne fonctionne qu'avec "Array", pas avec String. C'est pourquoi cette fonction ne fonctionnera pas dans IE8 !

L'API jQuery crée la confusion

La méthode $.inArray() est similaire à la méthode native .indexOf() de JavaScript. native 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 dire "similaire". Puisque indexOf supporte aussi "String" !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X