11550 sujets

JavaScript, DOM et API Web HTML5

Bonjour a tous,

Mon problème du jour est le suivant. J'utilise le DOM pour parcourrir les noeud de mon document. Tout va bien, mais... Firefox prend en compte l'intégralité des noeuds, même les noeuds de type text qui ne comporte que des caractère invisible (espaces, tabulations, retour à la ligne, etc...).

C'est pas que ça me gène outre mesure, mais dès que je cherche à utiliser les fonctions nextSibling() et previousSibling(), ça me fout le brouzouf si ma source est "formaté" (retour à la ligne + indentation = un noeud de type text en plus dans l'arboressence Smiley fache )

Y a-t-il un moyen de dire à FF de ne pas tenir compte du formatage de la source ? (Comme le ferais un parseur XML)

Merci Smiley smile
Modifié par Jep (25 Jul 2005 - 12:40)
Tu peux tester le nodeType, si c'est un espace tabulation etc (je crois que c'est "3" la valeur du nodeType mais je suis plus très sûr faudrait tester ou vérifier sur une doc).

Tu testes récursivement jusqu'à ce que ton nodeType soit une balise ("1" toujours je crois, je confond peut être les 2) ou différent d'un espace etc.

L'appel récursif sera assez rapide et peu gourmant en temps d'execution puisqu'on a pas que des noeud "espaces" qui s'enchainent en général.

J'espere que je répond pas à côté de la plaque et que je me ridiculise pas Smiley langue
Il est le matin et /me couché tard la veille Smiley lol

Ca m'etonne de pouvoir répondre à Jep niveau JS, ainsi qu'à solo
Olivier a écrit :
J'espere que je répond pas à côté de la plaque et que je me ridiculise pas Smiley langue
Il est le matin et /me couché tard la veille Smiley lol

Non, tu n'est pas a coté de la plaque, mais je voulais savoir s'il existait une méthode propre à Firefox pour le forcer à ignorer le formatage de la source (ce qui devrais normalement etre le cas de tous bon parseur HTML/XML !!!!!)... Maintenant, la solution que tu propose, j'y avais effectivement pensé, mais en gros faignant que je suis, je cherchait d'abord la solution de facilité Smiley lol

Olivier a écrit :
Ca m'etonne de pouvoir répondre à Jep niveau JS, ainsi qu'à solo

J'ai jamais eu la pretention de "tout savoir" en ce qui concerne le JS (loin s'en faut... et surtout en ce qui concerne le support de celui-ci par les différent navigateur Smiley sweatdrop )

Smiley smile
Modifié par Jep (25 Jul 2005 - 11:18)
Jep a écrit :
Maintenant, la solution que tu propose, j'y avais effectivement pensé, mais en gros faignant que je suis, je cherchait d'abord la solution de facilité Smiley lol


Ouff, ça me rassure Smiley lol tout va bien Smiley cligne
Il n'y a pas de solution de facilité à ma connaissance.

Une autre solution, un peu bourrine elle aussi, sûrement beaucoup plus d'ailleurs.

elt.parentNode.getElementsByTagName('*');

Et tu boucles la dessus, mais faut récupérer le "numéro" de l'elt et aller chercher le suivant.
C'est un nextSibling de porc quoi Smiley lol
Je suis même pas sûr que ça soit possible en fait ^^ enfin si sûrement mais à grand coup de bordel dans le code.

Jep a écrit :

J'ai jamais eu la pretention de "tout savoir" en ce qui concerne le JS (loin s'en faut... et surtout en ce qui concerne le support de celui-ci par les différent navigateur Smiley sweatdrop )

J'ai pas dit ça non plus Smiley cligne c'est juste que tu es callé en JS et en plus que tu fais des trucs propres Smiley smile
pis solo, il dégage aussi avec sa class xhr Smiley lol

Moi je m'en fout, j'ai le statut "OuebMastère du dimanche" Smiley smile
Cedric a écrit :
une méthode propre à Firefox pour le forcer à ignorer le formatage de la source (ce qui devrais normalement etre le cas de tous bon parseur HTML/XML !!!!!)...


La spécification indique au contraire qu'il est obligatoire pour un processeur xml de renvoyer tout : http://www.w3.org/TR/2004/REC-xml11-20040204/#sec-white-space
Oui, mais ce n'est pas ce que je veux dire... ce que je comprend de la spécification (avec mon pauvre anglais aproximatif) : Un parseur XML doit préserver les espaces et autre indentation (il ne doit donc pas modifier la sources qu'il analyse),
a écrit :
An XML processor MUST always pass all characters in a document that are not markup through to the application

mais il doit explicitement signaler si ces espaces sont signifiant ou non (c-à-d s'il font partis intégrante du texte à rendre ou s'il ne sont là que pour faire joli !).
a écrit :
A validating XML processor MUST also inform the application which of these characters constitute white space appearing in element content.


C'est ce dernier point qui m'interresse. En effet, si le processeur XML et correctement mis en oeuvre (c-à-d qu'il est validant), il doit pouvoir faire la différence entre les deux type de texte et une fois passer a un interpreteur DOM, celui-ci ne devrait pas tenir compte des caractères qui sont là uniquement pour faire jolie.

Bref, ce serait génial de pouvoir forcer FF à être un parseur validant Smiley cligne
Modifié par Jep (25 Jul 2005 - 12:16)
Pour le début, on a compris la même chose apparement.

Pour la suite, je ne sais pas trop quel serait le comportement...

La solution d'olivier est elle suffisante... ? enfin je ne sais pas trop trop...
Pour en revenir à mon problème initial, j'ai contourné le problème avec la méthode suggérée par Olivier :
NXT = this.nextSibling
while(NXT && NXT.nodeType == 3){
  NXT = NXT.nextSibling
}
			
PRV = this.previousSibling
while(PRV && PRV.nodeType == 3){
  PRV = PRV.previousSibling
}


C'est bien suffisant dans mon cas, mais pour rendre ça plus généraliste, il faudrait rajouter un test en RegExp qui verifie que le Noeud text ne contiens que des caractères invisibles.
Modifié par Jep (27 Jul 2005 - 20:07)
Bonjour,
Je ne connais pas XML, mais un test avec tagName pour sauter le noeud #text me semble simple :

var truc= truc.nextSibling;
if(!truc.tagName)truc= truc.nextSibling;


Je crois que je suis un peu à côté Smiley biggol
Modifié par chmel (28 Jul 2005 - 02:51)
C'est une solution aussi, mais ça revient strictement à la même chose !

Quoi que non, enfin je sais plus, mais nodeName donnera undefined ou un truc du style pour les espaces et autre ? pas si sûr.
(c'est nodeName, pas tagName)

Par ailleurs, tu ne fais pas d'appel récursif dans ton exemple, ça risque d'être court si plusieurs node "espace" se suivent Smiley cligne