parcourir un document web en utilisant le DOM

Attention: Les informations de ce billet sont susceptibles d'être obsolètes car vieux de plus 2 ans.

Warning: The information you are reading may be obsolete, this post was published more than 2 years ago.

Pendant des années, la vie quotidienne des développeurs web, lorsqu’ils travaillaient avec le DOM, se résumait en l’utilisation de la boucle for avec les méthodes getElementById et getElementsByTagName pour récupérer tel ou tel balise du HTML. Mais tout cela est fini (enfin!!), remontons le temps pour voir ce que l’on faisait avant et ce que l’on fera demain 🙂 .

Le problème qui ce pose est toujours de ce type :

Comment sélectionner toutes les balises enfants de type liste inclue dans mes balises div avec la class="post" enfants d’une balise div ayant pour id="content".

Avec la sortie du DOM1, la solution à ce problème fut le code suivant :

var nodeList = document.getElementById('content').getElementsByTagName('div');
var res = [];
for (var i = 0, div; div = nodeList[i]; i++) {
	if (/(^|s)post(s|$)/.test(div.className)) {
		if (div.hasChildNodes) {
			for (var j = 0, o; o = div.childNodes[j]; j++) {
				if(/^(UL|OL|DL)$/.test(o.nodeName)) {
					res[res.length] = o;
				}
			}
		}
	}
}

Avec l’avènement de Firefox 1.5 est des méthodes avancées de manipulation des tableaux, le code s’est “simplifié” de la sorte

var res = [];
var nodeList = Array.filter(document.getElementById('content').getElementsByClassName('post'), function (el) {
	return(el.nodeName==='DIV'&&el.hasChildNodes);
});
if (nodeList.length>0) {
	Array.forEach(nodeList, function (el) {
		var r = Array.filter(el.childNodes, function (el) {
			return /^(UL|OL|DL)$/.test(el.nodeName);
		});
		if (r.length > 0) {
			res = res.concat(r);
		}
	});
}

Mais seul, Firefox comprend, nativement le code ci-dessus, et bien que plus simple (il n’y a plus de boucle for), l’écriture d’un tel code est en fait plus difficile. Depuis, les différentes framework javascript on mis en place toute une série de méthodes aux noms variés pour remédier à cette complexification. Mais tous cela, c’est du passé grâce à querySelectorAll on aura désormais plus qu’à écrire ceci :

var res = document.querySelectorAll("#content div.post > dl, #content div.post > ul, #content div.post > ol");

Essayez ces scripts dans différents navigateurs et vous verrez par vous-même que cela donne la même réponse.

Première bonne nouvelle : querySelectorAll permet de faire des recherches en utilisant une déclaration CSS à la manière de différentes frameworks javascript mais diffère de celles-ci en cela qu’elle retourne une liste de noeud et reste strict par rapport au règles du CSS. C’est donc une version modernisée de getElementsByTagName. De même querySelector fonctionne exactement comme querySelectorAll mais ne renvoie que le premier noeud qui satisfait à la condition CSS, c’est donc l’équivalent moderne de getElementById.

Deuxième nouvelle : La rapidité de ces fonctions, native dans le navigateur, nous permettra d’avoir des script beaucoup plus rapide

Troisième bonne nouvelle : Cette année 2009 verra la mise à jour de minimum 3 grands navigateurs, IE passera la 8ème vitesse, Firefox fera un toilettage de sa mouture avec une version 3.1 très attendue, quand à Opera il a déjà annoncé les couleurs avec une version alpha de son prochain navigateur Opera 10. De toute les nouveautés qui nous attendent avec l’arrivée de ces différents navigateurs une est de taille, le support par tout les navigateurs modernes de ces méthodes querySelector et querySelectorAll, qui sont déjà présentent sous Safari depuis sa version 3.1. Bref 2009 s’annonce comme un bon cru pour le DOM et le Javascript.

3 thoughts on “parcourir un document web en utilisant le DOM

  1. Faudra juste attendre X années que tout le monde ait mis à jour son navigateur.

    C’est bô le futur quand même. Rien que de penser aux améliorations de DOM, il me passe l’envie de me jeter sous un train.

  2. Bonjour à toi et merci pour cette info. C’est vrai que jQuery permet déjà de s’affranchir de la complexité, comme tu l’as souligné ; mais des fonctions natives, voilà une bonne nouvelle.
    J’ai tenté sur ie8 en mode de compatibilité (quirksmode) mais, évidemment, ça ne passe pas !
    Quand tous les utilisateurs de ie se seront mis à jour, ça ira mieux…en 2020 vous avez dit ? 😉

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.