Comment fixer le Tableau indexOf() en JavaScript pour les navigateurs Internet Explorer
Si vous avez travaillé avec JavaScript dans la longueur que vous êtes conscient que Internet Explorer ne permet pas de mettre en œuvre les ECMAScript fonction de la Matrice.le prototype.indexOf() [y compris Internet Explorer 8]. Il n'est pas un énorme problème, parce que 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 en œuvre cette?
Dois-je l'enrouler sur toutes mes pages avec le cocher suivantes, qui vérifie si le prototype de la fonction existe et si non, aller de l'avant et d'étendre le Tableau prototype?
if (!Array.prototype.indexOf) {
//Implement function here
}
Ou faire de vérification du navigateur et si c'est Internet Explorer puis il suffit de la mettre en œuvre?
//Pseudo-code
if (browser == IE Style Browser) {
//Implement function here
}
- En fait
Array.prototype.indexOf
ne fait pas partie de l'ECMA-262/ECMAScript. Voir ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf Peut-être que vous êtes en train de penserString.prototype.indexOf
... - C'est une extension, ne fait pas partie de la norme d'origine. Il devrait, cependant, être mis en œuvre dans le cadre de Javascript 1.6 (qui IE ne parvient pas à faire) developer.mozilla.org/en/New_in_JavaScript_1.6
- a été juste se référant à "c'est à dire ne pas mettre en œuvre l'ECMAScript fonction..."
- Votre mise en œuvre de
Array.indexOf
ne pas prendre négatif de départ indices en compte. Voir Mozilla suggestion pour combler les lacunes de mise en œuvre ici: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/... - J'ai mis à jour la question d'utiliser "===", parce que j'ai peur que les gens vont le copier avec le "==" et qui serait une erreur - d'autres que c'est la fin. Voir Eli Gris de la réponse.
- En Fait, Tableau.le prototype.indexOf est une partie de ECMAScript 5 (où le lien à la norme maintenant, va): "15.4.4.14 Tableau.le prototype.indexOf ( searchElement [ , fromIndex ] )"
Vous devez vous connecter pour publier un commentaire.
De faire comme ceci...
Comme recommandé de compatibilité par MDC.
En général, le code de détection du navigateur est un gros no-no.
Sinon, vous pouvez utiliser le jQuery 1.2 inArray fonction, qui devrait fonctionner sur tous les navigateurs:
Le code complet serait alors de ceci:
Pour une réponse très complète et le code pour le présent ainsi que d'autres fonctions de tableau de vérifier Débordement de Pile question Fixation JavaScript les fonctions de Tableau dans Internet Explorer (indexOf, forEach, etc.).
L'underscore.js la bibliothèque dispose d'un indexOf fonction que vous pouvez utiliser à la place:
Vous devriez vérifier si elle n'est pas définie à l'aide de
if (!Array.prototype.indexOf)
.Aussi, votre mise en œuvre de
indexOf
n'est pas correct. Vous devez utiliser===
au lieu de==
dans votreif (this[i] == obj)
déclaration, sinon[4,"5"].indexOf(5)
serait de 1 en fonction de votre mise en œuvre, ce qui est incorrect.Je vous recommande d'utiliser la mise en œuvre sur MDC.
Il est Mozilla solution officielle:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
Je le recommande à ceux qui recherchent des fonctionnalités manquantes:
http://code.google.com/p/ddr-ecma5/
Il apporte dans la plupart des disparus ecma5 de la fonctionnalité âgées browers 🙂
C'était mon œuvre. Essentiellement, ajouter cet avant tous les autres scripts sur la page. c'est à dire à votre maître pour une solution globale pour Internet Explorer 8. J'ai également ajouté dans la fonction trim qui semble être utilisé dans beaucoup de cadres.
cela fonctionne pour moi.
Avec l'Underscore.js
var arr=['a','a1','b']
_.filter(arr, function(a){ return a.indexOf('a') > -1; })