15 votes

La fonction .indexOf sur un tableau ne fonctionne pas dans IE7/8 en utilisant JavaScript

Est-ce que quelqu'un peut me dire si IE 7 et IE 8 supportent la méthode JavaScript .indexOf() car je reçois l'erreur :

SCRIPT438: L'objet ne prend pas en charge la propriété ou la méthode 'indexOf'

de la console de débogage IE9 (utilisée sous les modes de navigation IE7 et IE8).

Pour le commentaire ci-dessous, le code utilisant .indexOf() est le suivant :

if(shirt_colour == 'black') {
    p_arr=['orange','red','green','yellow','bblue','rblue','pink','white','silver','gold'];
    if( p_arr.indexOf(print_colour) != -1 ) rtn = true;
}

36voto

markzzz Points 8008

Sur IE<9 indexOf() n'est pas "bien" implémenté. Essayez d'ajouter cette fonction à votre code :

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length;

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

Cela va "remplacer" la fonction d'origine, si elle n'est pas trouvée dans la norme ECMA-262.

2voto

Chandikumar Points 64

Le code suivant peut être utile.

function findIndexOf(findfrom, findthis) {
    for (i = 0; i < findfrom.length; i++) {
        if (findfrom[i] == findthis) {
            return i;
        }
    }
    return -1;
}

0voto

John Slegers Points 509

Si vous avez besoin de indexOf dans IE<=8, vous devriez envisager d'utiliser le polyfill suivant, qui est recommandé sur le MDN :

// Étapes de production de l'ECMA-262, Édition 5, 15.4.4.14
// Référence: http://es5.github.io/#x15.4.4.14
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {

    var k;

    // 1. Soit o le résultat de l'appel à ToObject en passant
    //    la valeur "this" comme argument.
    if (this == null) {
      throw new TypeError('"this" est null ou non défini');
    }

    var o = Object(this);

    // 2. Soit lenValue le résultat de l'appel à la méthode interne Get
    //    de o avec l'argument "length".
    // 3. Soit len ToUint32(lenValue).
    var len = o.length >>> 0;

    // 4. Si len est 0, retourner -1.
    if (len === 0) {
      return -1;
    }

    // 5. Si l'argument fromIndex a été passé, soit n
    //    ToInteger(fromIndex); sinon soit n égal à 0.
    var n = +fromIndex || 0;

    if (Math.abs(n) === Infinity) {
      n = 0;
    }

    // 6. Si n >= len, retourner -1.
    if (n >= len) {
      return -1;
    }

    // 7. Si n >= 0, alors soit k égal à n.
    // 8. Sinon, n<0, soit k égal à len - abs(n).
    //    Si k est inférieur à 0, soit k égal à 0.
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

    // 9. Répéter, tant que k < len
    while (k < len) {
      // a. Soit Pk égal à ToString(k).
      //   Cela est implicite pour les opérandes de la partie gauche de l'opérateur in
      // b. Soit kPresent le résultat de l'appel à la méthode interne HasProperty
      //    de o avec l'argument Pk.
      //   Cette étape peut être combinée avec c
      // c. Si kPresent est vrai, alors
      //    i.  Soit elementK le résultat de l'appel à la méthode Get
      //        interne de o avec l'argument ToString(k).
      //   ii.  Soit same le résultat de l'application de l'algorithme de comparaison
      //        stricte d'égalité à searchElement et elementK.
      //  iii.  Si same est vrai, retourner k.
      if (k in o && o[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}

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