Mise en cache
1 2 3 4 5 6 7 8
| var Contenu = Fichier('../xml/monfichier.xml');
var lignes = Contenu.getElementsByTagName('ligne');
max = lignes.length;
var compteur = 0;
for (l = 0; l < max; l++) {
var ligne = lignes[l];
compteur++;
} |
Et sinon je peux te garantir que querySelector et querySelectorAll fonctionnent sur du XML, je viens de vérifier. Dans la mesure où ton XML est bien formé, et où tu utilises la propriété responseXML de ton objet Ajax, tu devrais être en mesure de faire :
Contenu.querySelectorAll("ligne");
Si tu as mis des classes et des id dans ton XML, tu peux aussi utiliser les sélecteurs . et #. En gros, CSS n'a jamais été limité au HTML et fonctionne normalement avec XML (à part peut-être les pseudoclasses spécifiques comme :hover – ce n'est qu'une supposition personnelle).
Autrement, si tu connais un peu XPath, tu peux utiliser document.evaluate.
Attention, je ne garantis pas que querySelectorAll sera plus rapide. Comme je l'ai dit dans mon post précédent, l'efficacité dépend du sélecteur. Là c'est un sélecteur de tagName, donc a priori, on est dans les mêmes temps d'exécution qu'avec getElementsByTagName.
Il y a cependant une différence subtile : querySelectorAll renvoie une collection figée (static), alors que getElementsByTagName renvoie une collection vivante (live). Ça veut dire quoi ? Ça veut dire que si tu appelles l'une de ces méthodes et que tu mets le résultat dans une variable, et si la structure du DOM est modifiée avant que tu utilises cette variable, les changements seront répercutés sur la collection renvoyée par getElementsByTagName, alors que celle renvoyée par querySelectorAll continuera de représenter l'ancien état du DOM.
Il y a un JSPerf qui compare getElementsByTagName et querySelectorAll, malheureusement le site est indisponible au moment où j'écris ce post. J'ai trouvé un article de blog datant de 2010 expliquant que querySelectorAll est en réalité plus lent car, pour renvoyer une collection figée, il doit procéder à la copie de chaque élément au moment de l'appel.
C'est une chose que j'avais perdue de vue quand j'ai écrit mon post précédent, donc je dois m'excuser : querySelectorAll est a priori moins efficace que getElementsByTagName. Cependant, il trouve sa force dans l'utilisation des sélecteurs CSS complexes (exemples : nav a, div + p, etc.) qui obligeraient autrement à passer par des manipulations DOM supplémentaires. Et aussi, il permet de faire une sélection par classe sous IE8, où getElementsByClassName n'existait pas encore.
Partager