Si vous avez longuement travaillé 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 les fonctionnalités de 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 mettre cela en œuvre?
Dois-je l'envelopper sur toutes mes pages avec la vérification suivante, qui vérifie si la fonction prototype existe et sinon, continuez et étendez le prototype Array?
if (!Array.prototype.indexOf) {
// Implement function here
}
Ou le navigateur vérifie-t-il et s'il s'agit d'Internet Explorer, il suffit de l'implémenter?
//Pseudo-code
if (browser == IE Style Browser) {
// Implement function here
}
javascript
internet-explorer
internet-explorer-8
cross-browser
Bobby Borszich
la source
la source
Array.prototype.indexOf
fait, ne fait pas partie de l'ECMA-262 / ECMAScript. Voir ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf Peut-être que vous pensezString.prototype.indexOf
...Array.indexOf
ne prend pas en compte les indices de départ négatifs. Voir l'implémentation de l'interruption de la suggestion de Mozilla ici: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…Réponses:
Fais-le comme ça...
Comme la compatibilité recommandée par MDC .
En général, le code de détection du navigateur est un gros no-no.
la source
Alternativement, vous pouvez utiliser la fonction jQuery 1.2 inArray , qui devrait fonctionner sur tous les navigateurs:
la source
Le code complet serait alors le suivant:
Pour obtenir une réponse et un code vraiment approfondis, ainsi que d'autres fonctions de tableau, consultez la question Stack Overflow Fixing JavaScript Array dans Internet Explorer (indexOf, forEach, etc.) .
la source
La bibliothèque underscore.js possède une fonction indexOf que vous pouvez utiliser à la place:
la source
Vous devez vérifier s'il n'est pas défini à l'aide de
if (!Array.prototype.indexOf)
.En outre, votre implémentation de
indexOf
n'est pas correcte. Vous devez utiliser à la===
place de==
dans votreif (this[i] == obj)
relevé, sinon[4,"5"].indexOf(5)
serait 1 selon votre implémentation, ce qui est incorrect.Je vous recommande d'utiliser l'implémentation sur MDC .
la source
Il existe une solution officielle de Mozilla: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
la source
Je recommanderais ceci à tous ceux qui recherchent des fonctionnalités manquantes:
http://code.google.com/p/ddr-ecma5/
Il apporte la plupart des fonctionnalités ecma5 manquantes aux anciens navigateurs :)
la source
C'était ma mise en œuvre. Essentiellement, ajoutez ceci avant tout autre script sur la page. c'est-à-dire dans votre master pour une solution globale pour Internet Explorer 8. J'ai également ajouté dans la fonction trim qui semble être utilisée dans de nombreux frameworks.
la source
ça marche pour moi.
la source
Avec le Underscore.js
var arr=['a','a1','b'] _.filter(arr, function(a){ return a.indexOf('a') > -1; })
la source