11550 sujets

JavaScript, DOM et API Web HTML5

Hello les gens,

Je fais face à un comportement étrange que je n'avais jamais rencontré avant la mise à jour automatique vers IE8. Je n'ai pas put isoler le cas, et je ne peux donc guère faire mieux que d'en parler dans des termes généraux.

Voici : des noeuds issus du DOM, qui génèrent des exceptions si je tente d'accéder à une propriété pourtant standard (dans ce cas précis, nodeValue sur un noeud text, car nodeType === 3). J'utilise courament une petite fonction JavaScript qui me sert à faire des « dump » d'objet de manière générique, en listant les propriétés définies dans l'objet puis en affichant la valeur de la propriété. Là également, exceptions levées, pour des propriétés dont le nom existe pourtant dans le « dictionnaire » de l'objet, mais auxquels il est impossible d'accéder. Ni undefined, ni null, rien, une exceptions est immédiatement levé, et si elle n'est pas interceptée, IE8 affiche le message « argument invalide ». Seuls lastChild, nodeName, attributes, nodeType, childNodes et firstChild, sont accessibles, toutes les autres propriétés, y compris parentNode et nodeValue, génère automatiquement une exception. Que par exemple parentNode ne soit pas accessible est déroutant, car le noeud existe bien dans le document, y est lié, puisqu'il est récupéré suite à une exploration d'une partie du document.

Le cas ne se produit ni sous Opera, ni sous Safari par exemple. Seulement sous IE8.

Je suis désolé de ne pas pouvoir exposer le cas avec plus de détails (l'isoler va me demander un temps fou, si encore c'est possible). Je n'attend pas à vrai dire de solution (pour ça je vais me débrouiller), mais je suis surtout à la pêche aux infos sur la question, par exemple des choses comme « est-ce que ça dit quelque chose à quelqu'un également ? »

À moins qu'une énormité ne m'échappe, je ne m'explique pas ce problème.
Modifié par hibou57 (21 Sep 2009 - 18:26)
Le shimilibilick avance un chouya,

Je tombe sur ce cas de noeud « zombi » (à moitié mort, à moitié vivant), lorsque j'arrive sur un élément dont le innerHTML est en tout et pour tout, un espace. Il semble que ce soit ce noeud espace qui est à l'origine de ce comportement étrange. Si j'effectue au préalable un teste sur innerHTML (ou même outerHTML, c'est moins simple, mais j'ai vérifié que ça marche aussi), et que je supprime tout simplement cet espace (que j'assigne une chaîne vide à innerHTML) ou encore alternativement que je remplace cet espace par un caractère quelconque, alors plus aucun noeud zombi n'est retrouvé dans le DOM.

Ceci semble être finalement en rapport avec un bug déjà identifié sous IE8 :
2 bugs DOM identifiés sous IE8

Ces deux bugs identifiés, sont en rapport avec des noeuds texte représentant des espaces également. Mais bien que partiellement en rapport, mon cas semble différent de ces deux bugs, car le premier est tout à fait l'opposé, il parle d'un noeud manquant dans le DOM, alors que moi j'en trouve un, mais plutôt dans le genre mutant avec quelques membres en moins, et le second bug ne correspond pas à mon contexte (pas d'inline dans le contexte où mon bug se produit).
Modifié par hibou57 (21 Sep 2009 - 19:39)
Un autre mutant, cette fois-ci c'est un élément, donc pas un noeud texte, qui est présent dans un document, mais dont aussi bien la propriété parentNode que parentElement valent « null », alors que l'élément est visible dans le document !


l'IE8 de la mise à jour automatique, ce n'est pas une version béta par hasard ?

j'ai un doute ....
Hop, résolu, je ne rentre pas dans les détails (dépendants d'un contexte trop long à détailler), mais je poste tout de même pour dire que IE8 n'est pas en cause sur le point du poste précédent, mais simplement une différence de comportement entre les navigateurs. Le comportement d'IE8 est Ok.

Pour les personnes qui rencontreraient ce type d'erreur (celle du 3ième poste), cherchez du côté des usages faits de replaceChild