Je sais que je vais en surprendre plusieurs d'entre vous avec cette déclaration incendière alors attachez bien votre tuque avec d'la broche, assoyez-vous confortablement, respirez un bon coup et tâchez de ne pas perdre connaissance :
Contrairement aux autres fureteurs, Internet Explorer ne supporte pas la fonction indexOf sur les arrays.
Dûr coup à encaisser hein ? Comment, tu n'es pas surpris du tout ? Ami lecteur, moi qui te croyait de bonne foi envers le fureteur vedette de Microsoft. Pourtant, n'ont-ils pas annoncé que leur dernière mouture allait impressionner ?
Eh bien non, même IE8 gâche la fête et cause des maux de têtes aux développeurs. Personnellement, au cours de mes tests, les fureteurs suivants ont passé tous les tests avec succès : Firefox 3, Safari 4, Chrome 4 et Opera 10. Alors qu'IE6, IE7 et IE8 ont décidé de faire classe à part.
Pourtant, tous sans exception supportent correctement String.indexOf() :
console.log( 'lorem ipsum dolor sit amet'.indexOf('ipsum') );Si vous n'utilisez pas Firebug ou Firebug lite :
alert( 'lorem ipsum dolor sit amet'.indexOf('ipsum') );Mais Array.indexOf() cause une erreur sous IE :
console.log( [10,20,30,40].indexOf(40) );C'est ce dont je me suis aperçu lorsque j'ai testé ma librairie (je teste toujours mes assertions en commençant avec Firefox). IndexOf n'est pas un standard mais tous se sont entendus pour supporter nativement la fonction.
Au moins, vous serez heureux d'apprendre qu'il est possible de le fixer facilement. Il suffit d'inclure le fix suivant à votre projet pour ramener la compatibilité de vos scripts en toute tranquillité :
if(!Array.indexOf){Si la fonction indexOf() n'existe pas nativement, elle sera définie par ce script qui prolonge l'objet Array (avec le mécanisme prototype). Notez aussi que dans le code source des frameworks Prototype.js et jQuery, ils implémentent cette patch de la même façon.
Array.prototype.indexOf = function(obj){
for(var i=0; i<this.length; i++){
if(this[i]==obj){
return i;
}
}
return -1;
}
}
J'ai diffusé un article sur MaRevueWeb qui parle des nouvelles fonctionnalités qu'offrira IE 9. Pour la première fois, je suis vraiment impressionné par les progrès annoncés par Microsoft.
- Nouvel engin Javascript: Chakra
- Compatibilité CSS3 (y'était temps...)
- et plus encore...
Ça promet d'être tout une amélioration comparativement au dernier IE 8.. À suivre !
Ca me fait plaisir de revenir sur ce post 2 ans après pour dire que IE9 ne supporte pas non plus indexOf.
IE9 est bien pourri mais IE10 supporte a merveille WebGL avec des performances impressionnantes
Merci pour l'astuce, cela fonctionne nickel