L'AJAX aussi c'est bien, quand ça marche..
AJAX: Asynchronous Javascript And XML
XML: eXensible Markup Language
En ce moment, au boulot, je dois réaliser une application presqu'entièrement écrite en AJAX. Jusqu'à aujourd'hui, tout se passait bien, l'application était arrivée à 1200 lignes de javascript, jusqu'à ce qu'un problème fasse son apparition. J'écris cet article dans le bug d'aider ceux qui ont où vont peut-être rencontrer le même problème.
Le problème en question vient de la méthode cloneNode() qui peut être appelée à partir de presque n'importe quel objet de l'arborescence DOM d'une page afin d'en réaliser un clone. En fait, la méthode cloneNode() est tout simplement bugguée et mal implémentée, aussi bien sous Internet Explorer que Firefox et probablement même Opera. Croyez-moi, je me suis cassé la tête sur le problème pendant de longues heures avant de comprendre d'où venait le problème.
Ce problème vient du fait que cloneNode(), même appelé avec l'argument true, ne réalise pas une copie parfaite de l'élément, contrairement à ce qu'elle devrait faire. cloneNode() oublie de faire une copie des events de type onclick, onmouseover, onfocus, etc. qui ont étés assignés via javascript après le chargement de la page. Résultat, ces events sont perdus, et vous pouvez toujours essayer de comprendre pourquoi, il n'y a presque aucune documentation à ce propos sur Internet. Il semblerait également que certains attribus, comme le checked des éléments input ne soient pas propagés lors d'un clonage, mais uniquement sous Internet Explorer cette fois-ci. Il est donc pratiquement impossible de cloner un élément qui a été généré via javascript et dont les events ont étés assignés dynamiquement. La seule solution est de définir les events au chargement de la page et tant pis si tous les objets appellent la même fonction, il faudra différencier le traitement en fonction de l'objet this appelant.
Exemple :
Résultat :
Plus d'informations sur cette page et celle-ci.
Moralité, l'AJAX c'est bien, quand ça marche, quand les navigateurs sont d'accord entre eux et également quand ils sont d'accord avec les normes (autrement dit, jamais).
XML: eXensible Markup Language
En ce moment, au boulot, je dois réaliser une application presqu'entièrement écrite en AJAX. Jusqu'à aujourd'hui, tout se passait bien, l'application était arrivée à 1200 lignes de javascript, jusqu'à ce qu'un problème fasse son apparition. J'écris cet article dans le bug d'aider ceux qui ont où vont peut-être rencontrer le même problème.
Le problème en question vient de la méthode cloneNode() qui peut être appelée à partir de presque n'importe quel objet de l'arborescence DOM d'une page afin d'en réaliser un clone. En fait, la méthode cloneNode() est tout simplement bugguée et mal implémentée, aussi bien sous Internet Explorer que Firefox et probablement même Opera. Croyez-moi, je me suis cassé la tête sur le problème pendant de longues heures avant de comprendre d'où venait le problème.
Ce problème vient du fait que cloneNode(), même appelé avec l'argument true, ne réalise pas une copie parfaite de l'élément, contrairement à ce qu'elle devrait faire. cloneNode() oublie de faire une copie des events de type onclick, onmouseover, onfocus, etc. qui ont étés assignés via javascript après le chargement de la page. Résultat, ces events sont perdus, et vous pouvez toujours essayer de comprendre pourquoi, il n'y a presque aucune documentation à ce propos sur Internet. Il semblerait également que certains attribus, comme le checked des éléments input ne soient pas propagés lors d'un clonage, mais uniquement sous Internet Explorer cette fois-ci. Il est donc pratiquement impossible de cloner un élément qui a été généré via javascript et dont les events ont étés assignés dynamiquement. La seule solution est de définir les events au chargement de la page et tant pis si tous les objets appellent la même fonction, il faudra différencier le traitement en fonction de l'objet this appelant.
Exemple :
Résultat :
Plus d'informations sur cette page et celle-ci.
Moralité, l'AJAX c'est bien, quand ça marche, quand les navigateurs sont d'accord entre eux et également quand ils sont d'accord avec les normes (autrement dit, jamais).

Le W3C précise que cloneNode doit faire une "copie de tous les attributs et leur valeur, y compris ceux générés par le processeur XML et qui correspondent aux attributs ayant des valeurs par défaut". Donc c'est parfaitement normale que les évènements ajoutés dynamiquement ne soient pas pris en comptes.
Enregistrer un commentaire
Créer un lien