294 votes

Comment corriger Array indexOf() en JavaScript pour les navigateurs Internet Explorer

Si vous avez travaillé un tant soit peu avec JavaScript, vous savez qu'Internet Explorer n'implémente pas la fonction ECMAScript pour Array.prototype.indexOf() [y compris Internet Explorer 8]. Ce n'est pas un gros problème, car vous pouvez étendre la fonctionnalité sur votre page avec le code suivant.

Array.prototype.indexOf = function(obj, start) {
     for (var i = (start || 0), j = this.length; i < j; i++) {
         if (this[i] === obj) { return i; }
     }
     return -1;
}

Quand dois-je le mettre en œuvre ?

Dois-je l'intégrer dans toutes mes pages avec le contrôle suivant, qui vérifie si le prototype de fonction existe et, dans le cas contraire, étendre le prototype de tableau ?

if (!Array.prototype.indexOf) {

    // Implement function here

}

Ou bien vérifier le navigateur et si c'est Internet Explorer, l'implémenter tout simplement ?

//Pseudo-code

if (browser == IE Style Browser) {

     // Implement function here

}

213voto

Josh Stodola Points 42410

Fais-le comme ça...

if (!Array.prototype.indexOf) {

}

Comme compatibilité recommandée par le MDC .

En général, le code de détection des navigateurs est à proscrire.

141voto

Moses Lee Points 1185

Vous pouvez également utiliser l'option Fonction inArray de jQuery 1.2 qui devrait fonctionner sur tous les navigateurs :

jQuery.inArray( value, array [, fromIndex ] )

78voto

luisperezphd Points 3220

Le code complet serait alors le suivant :

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(obj, start) {
         for (var i = (start || 0), j = this.length; i < j; i++) {
             if (this[i] === obj) { return i; }
         }
         return -1;
    }
}

Pour une réponse très complète et le code de cette fonction ainsi que d'autres fonctions de tableau, consultez la question de Stack Overflow. Correction des fonctions JavaScript Array dans Internet Explorer (indexOf, forEach, etc.) .

16voto

scotta7exander Points 157

La bibliothèque underscore.js possède une fonction indexOf que vous pouvez utiliser à la place :

_.indexOf([1, 2, 3], 2)

10voto

Eli Grey Points 17553

Vous devriez vérifier si elle n'est pas définie en utilisant if (!Array.prototype.indexOf) .

De même, votre mise en œuvre de indexOf n'est pas correct. Vous devez utiliser === au lieu de == dans votre if (this[i] == obj) sinon [4,"5"].indexOf(5) serait égal à 1 selon votre implémentation, ce qui est incorrect.

Je vous recommande d'utiliser la mise en œuvre sur le MDC .

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