Comment faire pour copier un nœud DOM avec les écouteurs d'événement?
J'ai essayé
node.cloneNode(true); //deep copy
Il ne semble pas copier les écouteurs d'événement, que j'ai ajouté à l'aide de node.addEventListener("click", someFunc);
.
Nous utilisons le Dojo de la bibliothèque.
Vous devez vous connecter pour publier un commentaire.
cloneNode()
ne copie pas les écouteurs d'événement. En fait, il n'y a aucun moyen de se procurer des écouteurs d'événement via le DOM, une fois qu'ils ont été attachés, de sorte que vos options sont les suivantes:Node.addEventListener()
de garder une trace des auditeurs ajouté à chaque nœud. C'est de cette façon jQueryclone()
méthode est capable de copier un nœud avec ses écouteurs d'événements, par exemple.onclick
) sont plus pratique que de bon la vanille alternative? Soupir...Événement Délégation exemple.
Après la lecture de Tim Bas de la réponse, j'ai trouvé délégué événements sont très faciles à mettre en œuvre, la résolution d'un problème similaire que j'ai eu. J'ai pensé que je voudrais ajouter un exemple concret, même si c'est en JQuery pas Dojo.
Je suis re-skining d'une application dans la Sémantique de l'INTERFACE utilisateur, ce qui nécessite un petit morceau de JS pour rendre le message de fermer les boutons de travail. Cependant, les messages sont clonés à partir d'un modèle HTML de la balise à l'aide de
document.importNode
dans une bibliothèque. Cela signifie, même si je ne fixez les gestionnaires d'événements pour le modèle dans le nouveau code HTML, ils sont perdus pendant le clonage.Je ne peux pas faire de Tim option 1, tout simplement ré-attacher pendant le clonage comme la messagerie de la bibliothèque est frontal cadre agnostique. (Il est intéressant de noter mon précédent avant la fin de l'été dans Zurb Foundation, qui utilise une "data-fermable" attribut, la fonctionnalité de ce qui fait survivre le processus de clonage).
La normal de gestion des événements, a été proposé comme ceci:
Le problème ".message" à l'app-charger uniquement les matchs le même modèle, mais pas les messages qui arrivent plus tard sur le web sockets.
Faire de ce délégué, signifiait la fixation de l'événement pour le conteneur dans lequel les messages sont clonés
<div id="user-messages">
Il devient donc:
Cela a fonctionné immédiatement, l'enregistrement de tous travaux complexes comme la troisième option d'emballage de la manifestation subs.
La Dojo équivalent semble assez similaire dans son concept.
Cela ne répond pas à la question exactement, mais si le cas d'utilisation permet de déplacement l'élément plutôt que copie, vous pouvez utiliser removeChild avec appendChild qui permettra de préserver les écouteurs d'événement. Par exemple:
C'est ce que @JeromeJ été décrit dans un commentaire. Créer l'élément initial à l'aide de ce code HTML.
<DIV ONCLICK="doSomething(this)">touch me</DIV>
Lorsque vous clone de cet élément, le résultat sera le même gestionnaire, et "cette" pointe vers l'élément cloné.
Ce serait formidable si le gestionnaire ONCLICK peuvent facilement être ajoutés en JavaScript. Cette approche signifie que vous avez à écrire une partie de votre code HTML.