blog.virgule.info

Ce blog est écrit à quatre mains et autant de pieds par Mathieu Pillard (mat, billets bleus) et Muriel Méric-Nay (kerdekel, billets verts). Si vous n'arrivez pas à comprendre qui poste quoi, c'est soit que vous êtes atteint d'une forme rare de daltonisme soit que vous n'avez pas été lire notre introduction, donc allez zou, allez y, nous on en a marre de tout re-expliquer :-)

Konqueror et le DOM (Openweb)

Tous les 2 jours a peu pres, quelqu'un la ramene en disant que konqueror supporte Acid2, et que donc par conséquence il a un excellent support des standards, pas comme firefox par exemple... Je ne reviendrais pas sur le fait que passer Acid2 ne veut strictement rien dire sur le support CSS des navigateurs qui y parviennent, mais plutot sur un autre point de détail: ya pas que le CSS dans la vie ! (nota: le pire dans l'histoire étant que Acid 2 ne concerne pas uniquement CSS, c'est un peu un fourre tout, meme si les parties interessantes sont surtout au niveau du CSS)

Par exemple, un point qui devrait interesser de plus en plus de gens en ce moment, avec tout ce buzz autour de du Web2, c'est le support DOM et EcmaScript. En l'occurence, je vais vous parler d'un truc génial que personne n'utilise sur le web, puisque IE ne le supporte pas: le Document Object Model Traversal. Sous ce nom se cache des interfaces pour naviguer dans un document, et executer diverses actions sur une ou plusieurs parties de celui-ci.

Voila donc un petit script tres simple, qui parcourt le document à la recherche de Nodes tres précises. J'utilise une variante de ce script dans ma nouvelle version de la DLFPToolbar, et cela accelere grandement les choses (encore plus dans une version que je n'ai pas encore publié mais sur laquelle je reviendrais plus tard de toutes manieres, parceque elle montre tout l'interet de passer par un Treewalker plutot que par un systeme parsant a la main):

window.onload = beamMeUp;

function beamMeUp()
{
	function acceptNode(node)
	{
		if (node.hasAttribute("class"))
		{
			if (node.className == "ok")
				return NodeFilter.FILTER_ACCEPT;
		}
		return NodeFilter.FILTER_SKIP;
	}
	
	var treeWalker = document.createTreeWalker(document.body, 
	                                           NodeFilter.SHOW_ELEMENT,
	                                           acceptNode,
	                                           false);
	if (treeWalker)
	{
		var node = treeWalker.nextNode();
		
		while (node)
		{
			alert(node);
			node = treeWalker.nextNode();
		}
	}
}

Grosso Modo, ca parcourt le document a la recherche d'elements avec class="ok", et ca alert() a chaque fois que ca en trouve un. En effet, vous l'aurez compris en regardant la spec citée plus haut, la fonction acceptNode() est un filtre, appellé automatiquement, de sorte que lorsque je parcourt les Nodes de mon Treewalker, je ne vois que les Nodes pour lesquelles ma fonction a renvoyé NodeFilter.FILTER_ACCEPT.

Enfin ca, c'est la théorie.

Dans Opera, Safari, Firefox, ca marche tres bien. Dans la derniere version de Konqueror, ca alert() a chaque coup, la fonction acceptNode() n'est jamais appellée. Si quelqu'un a une solution, je veux bien l'entendre, je n'ai pas tres envie de rappeller ma fonction a la main a chaque fois. Remarquez, ya du mieux, avant, toute mention d'un Treewalker lui donnait des boutons (et déjà à l'époque c'était moi qui avait trouvé le bug, je me demande si ya d'autres gens qui s'interessent un peu au support DOM de konqueror :-)

PS: J'ai pour le moment la flemme de reporter le bug, pour ceux qui voudraient le faire avant que je finisse par créer un compte sur le bugzilla de KDE, j'ai mis mon testcase en ligne.


Commentaires

  1. TreeWalker, XPath, getElementsByTagName et compagnie sont dans un bateau

    Pour répondre a ce probleme, j'ai pris 4 approches différentes. On considere pour la démonstration que nos élements n'ont qu'une seule class (ce qui n'est pas forcement le cas en pratique), et que on doit commencer a chercher des la racine du...

    Posté le jeudi 15 décembre 2005 à 04:20 par blog.virgule.info

  2. Avec Xpath p.e ?

    tu ne selectionnes que les noeuds qui t'interessent exactement plus besoins de les filtrer,
    www.codestore.net/store.n...

    avec la chaine :
    //p[contains(@class,'ok')]

    Posté le lundi 12 décembre 2005 à 14:43 par Dam

  3. Le but etait quand meme de faire un truc qui fonctionne dans le plus de navigateurs possibles :-)

    Par ailleurs, je ne l'ai pas mentionné directement dans mon post, parceque je reservais ca pour plus tard, mais on peut renvoyer NodeFilter.FILTER_REJECT, ce qui a pour effet de bannir l'element et tous ses fils: du coup, si on connait un peu ce qu'on a parser, on peut aller beaucoup, beaucoup plus vite...

    Cela dit, je testerais Xpath, c'est une piste interessante.

    Posté le lundi 12 décembre 2005 à 18:08 par mat

  4. sortir ça
    "je vais vous parler d'un truc génial que personne n'utilise sur le web, puisque IE ne le supporte pas"

    puis sortir ça maintenant
    "Le but etait quand meme de faire un truc qui fonctionne dans le plus de navigateurs possibles"

    apres avoir pondu ça avant:
    totalementcretin.apinc.or...
    (et encore même pas pondu, copier/coller sauvage d'un newsgroup sans rediriger sur le lien de la discussion complète)

    c'est sur le contexte devient très marrant.

    Posté le jeudi 15 décembre 2005 à 13:27 par zwetan

  5. Le but etait que ca fonctionne sur le plus de navigateurs possibles, mais je savais des le depart que IE serait out. Ya une tres bonne raison a ca: je n'avais pas IE au moment des faits, et de toutes maniers il s'agit d'une toolbar pour linuxfr quand meme... le voila le contexte...

    PS: Sinon, pour le post sur TC, lorsque je l'ai posté il n'etait pas encore arrivé sur google groups et compagnie. Si il n'y que ca pour te faire plaisir, je rajoute les liens.

    Posté le jeudi 15 décembre 2005 à 15:09 par mat

  6. C'est bien ça que je reproche, tu sais dès le depart que cela ne marchera pas sous IE mais tu t'en fou..

    Ta toolbar là, elle ressemble de plus en plus à un plugin inaccessible pour plein de monde...

    le voila ton contexte

    tu bloques délibérement l'accès à cette toolbar pour tous ceux qui ont IE, et limite konqueror

    Un admin qui serait bloquer sur NT4 et IE par exemple et bah même si il a linux chez lui, tu le bloques.

    Mais il ne faut surtout rien te dire car toi tu sais ce qu'est l'accessibilité.

    Posté le jeudi 15 décembre 2005 à 22:52 par zwetan

  7. La nouvelle version de la toolbar est justement bloquée a cause des problemes qu'elle pose actuellement dans konqueror. Vu les améliorations en terme de rapidité, c'est dommage d'ailleurs, mais je suis dessus, d'ou ce post d'ailleurs.

    Je n'ai jamais bloqué déliberement cette toolbar a aucun navigateur, et meme si c'etait le cas, c'est une fonctionalité supplémentaire offerte uniquement aux utilisateurs de *linux*fr. Elle n'est nullement obligatoire, et d'ailleurs beaucoup de personnes sur linuxfr ne l'activent pas.

    Je suis neamoins parfaitement conscient que le fait qu'elle ne marche pas sous IE est un probleme, je te propose d'ailleurs de fournir un patch corrigeant ceci. Tu trouveras sans peine la version actuelle et la version de developpement (ainsi que leurs historiques respectifs) pour t'aider dans ta tache. D'avance merci.

    Sinon, en ce qui concerne l'accessibilité, ca n'a absolumment rien a voir. Cela étant dit, tu seras ravi d'apprendre qu'elle satisfait les personnes n'utilisant que le clavier a l'aide d'accesskeys, et que la prochaine version sera d'ailleurs legerement améliorée sur ce point.

    Posté le vendredi 16 décembre 2005 à 01:12 par mat

Les commentaires pour ce billet sont fermés.