11548 sujets

JavaScript, DOM et API Web HTML5

[EDIT] Voir la fin de ce post
Je rencontre un petit problème de script avec mon vieil ami Internet Explorer (dans sa version 7)... Alors que tout fonctionne sous Firefox (ce qui est logique vu qu'il n'y a pas de raison que le code plante...).

Ce que je fais, c'est simplement remplacer un élément de formulaire par un autre. J'ai essayé de deux façons différentes, premièrement de supprimer l'élément ancien puis d'ajouter le nouveau puis de faire un replaceChild. Dans les deux cas, c'est pareil : le code plante sous IE lors de la tentative de supprimer l'élément mais seulement après avoir effectué un premier changement (lors du premier changement, tout se passe bien), j'ai pu pourtant vérifier que l'élément qui le remplace possède bien le bon attribut name etc... Le code est plutôt basique :
onchange="this.parentNode.removeChild(this.form.elements['nouvelle_vartemplate_valeur_defaut']);"

J'ai essayé en mettant le numéro de l'élément au lieu de l'attribut name, c'est pareil... En gros j'ai l'impression que mon élément ne fait pas parti du formulaire...
Comme je l'ai dis plus haut, tout fonctionne bien sous Firefox... et nodeType me donne bien le bon type de noeud (sous IE aussi bien que sous FF)...
Alors évidemment, c'est contournable en utilisant l'id, mais je n'ai pas envi de changer du tout au tout mon code pour une problème sous IE.
__________________
Il semblerai que l'ancien titre (problème de remove/replaceChild) ne soit plus pertinent. Car après plusieurs recherche, il est évident que le problème vienne de la fonction appendChild qui, vraisemblablement, ajoute le noeud sans qu'il soit réellement pris en compte dans le document et donc impossible de le supprimer...
Quelqu'un a-t'il déjà recontré ce problème ? Ou quelqu'un a-t'il une explication ? Merci d'avance...
Modifié par Tsukaniki (24 Jan 2008 - 14:51)
Je me permet de poster ça en tant que réponse,
Après plusieurs tests, j'ai pu voir qu'Internet Explorer avait apparemment un petit problème pour récupérer l'élément inséré par le formulaire via son attribut name...
En effet, autant obj.form.elements['nouvelle_vartemplate_valeur_defaut'] ne fonctionne pas, autant obj.form.elements[6] (l'élément inséré étant le 7eme) fonctionne sans soucis et d'ailleurs obj.form.elements[6].name vaut bien nouvelle_vartemplate_valeur_defaut......
Suis-je condamné à faire un boucle pour retrouver le numéro de l'élément ou est-ce que quelqu'un aurai une autre solution ?

[EDIT] J'ai regardé du coté de setAttribute (qui est la méthode que j'utilise pour donner un nom etc... à mon élément), mais le problème ne semble pas venir de là (nom_objet.name = 'valeur' ne règle pas le problème).
Je tiens aussi à signaler que mes évênements (onchange etc...) ne fonctionnent pas non plus, alors que l'attribut size fonctionne parfaitement (mais pas maxlength...)
Modifié par Tsukaniki (22 Jan 2008 - 17:43)
J'ai enfin trouvé une solution... C'est moche, très très très moche, et pas du tout "légal" mais ça marche... Qu'avec IE bien entendu...
Donc avant ma fonction c'était ça :
function transforme_html(doc,element) {
         var elem_retour ; // L'élément à retourner
         var elem_html = element.tagName ; // Le nom de cet élément
         elem_retour = doc.createElement(elem_html) ;
            // On regarde maintenant les attributs de ce noeud
            for (var i=0 ; i<element.attributes.length ; i++) {
                if (element.attributes[ i ].nodeName != undefined) {
                   elem_retour.setAttribute(element.attributes[  
i ].nodeName,element.attributes[ i ].nodeValue) ;
                }
            }
         // On regarde le contenu
         for (var j=0 ; j<element.childNodes.length ; j++) {
             if (element.childNodes[j].tagName != undefined) {
                var nouvel_arbre = transforme_html(doc,element.childNodes[j]) ;
                elem_retour.appendChild(nouvel_arbre) ;
             } else {
               elem_retour.appendChild(doc.createTextNode(element.childNodes[j].nodeValue)) ;
             }
         }
         return elem_retour ;
}

Et donc ça ne fonctionnait pas avec Internet Explorer (dans sa version 7, je n'ai pas eu le "plaisir" de pouvoir tester avec la version 6), en fait les attributs étaient bien présents (je pouvais afficher leur contenu et leurs nom) mais n'étaient pas interprétés par IE... Il a donc fallu faire ça :
function transforme_html(doc,element) {
         var elem_retour ; // L'élément à retourner
         var elem_html = element.tagName ; // Le nom de cet élément
         var traitement_IE = false ; // Vérifier si on a effectué le traitement spécial IE
         /* Compilation conditionnelle d'IE */
	 /*@cc_on
         traitement_IE = true ;
         elem_html = '<'+elem_html ;
         for (var i=0 ; i<element.attributes.length ; i++) {
              if (element.attributes[ i ].nodeName != undefined) {
                 elem_html = elem_html +' '+element.attributes[ i ].nodeName+'="'+element.attributes[ i ].nodeValue+'"' ;
              }
         }
         elem_html = elem_html+'>' ;
	 @*/
         elem_retour = doc.createElement(elem_html) ;
         if (!traitement_IE) {
            // On regarde maintenant les attributs de ce noeud
            for (var i=0 ; i<element.attributes.length ; i++) {
                if (element.attributes[ i ].nodeName != undefined) {
                   elem_retour.setAttribute(element.attributes[ i ].nodeName,element.attributes[ i ].nodeValue) ;
                }
            }
         }
         // On regarde le contenu
         for (var j=0 ; j<element.childNodes.length ; j++) {
             if (element.childNodes[j].tagName != undefined) {
                var nouvel_arbre = transforme_html(doc,element.childNodes[j]) ;
                elem_retour.appendChild(nouvel_arbre) ;
             } else {
               elem_retour.appendChild(doc.createTextNode(element.childNodes[j].nodeValue)) ;
             }
         }
         return elem_retour ;
}


C'est moche, ça ne me plait pas du tout, mais ça marche... "Évidemment" ça affiche une erreur sous firefox (d'où la compilation conditionnelle pour IE) et je n'ai jamais vu de trace de cette façon de faire nulle part...
Est-ce une utilisation légale que firefox ne reconnait pas ou est-ce une fantaisie de microsoft ?
M'enfin, dans tous les cas, je mets le sujet en résolu...
Modifié par Tsukaniki (24 Jan 2008 - 14:52)