2010-07-11 2 views
20

Est-il possible de supprimer tous les écouteurs d'événement d'un élément et ses enfants? Quelque chose comme:Supprimer tous les écouteurs d'événement JavaScript d'un élément et de ses enfants?

myElem.removeEventListeners(); 

J'ai besoin parce que j'ai un élément complexe d'événements, et je dois créer une copie de celui-ci - comme une image statique qui ne réagit pas aux événements.

+1

Comment les événements sont-ils liés en premier lieu (par exemple 'onclick = ...', 'addEventListener', bibliothèque, etc.)? –

+0

addEventListener() est utilisé. Il est utilisé pour myElem et pour certains enfants arbitraires en fonction de la logique conditionnelle déclenchée par l'utilisateur. – Tower

+5

Je suppose que vous ne vous souciez pas de IE alors (qui utilise 'attachEvent')? Si c'est le cas, "copiez" votre élément avec 'cloneNode (true)' et magic-boom-presto, les événements addEventListener ne seront pas copiés. C'est dans la spécification: http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventListener –

Répondre

22

Si vous utilisez cloneNode, les écouteurs d'événement ne seront pas copiés.

Si vous voulez une solution robuste, il vaut mieux écrire un wrapper aux attach/detach auditeurs, et de les suivre vous-même. Quelque chose comme Dean Edwards' addEvent.

+0

Merci pour les conseils.J'utilise des écouteurs d'événement W3C, donc, je dois probablement écrire un wrapper, que je voudrais éviter ... – Tower

+0

mais si vous utilisez 'cloneNode' vos auditeurs ne seront pas copiés. Voir ma mise à jour, – galambalazs

+0

toujours s'il y a un moyen simple de supprimer tous les gestionnaires d'événements, ce serait génial –

-7

Je n'en connais pas, et une recherche sur Google n'a pas donné de résultats évidents. Une solution simple, kludgy est de créer une fonction qui cycles à travers chaque événement et met à null, tels que

function removeEvents(obj) 
{ 
    obj.onblur = null; 
    obj.onchange = null; 
    obj.onclick = null; 
    // ... 
} 

appeler cette fonction comme suit: removeEvents(myElem). Une liste complète des gestionnaires d'événements JavaScript peut être trouvée au http://www.elated.com/articles/events-and-event-handlers/.

Sans aucun doute, il existe une façon plus élégante d'écrire cette fonction, mais je ne sais pas s'il existe une façon plus élégante de résoudre ce problème. Ce serait adorable si quelqu'un en connaissait un. Si vous liez des événements via une bibliothèque JavaScript, telle que jQuery, il peut y avoir d'autres options, meilleures.

+3

Je le mettrais à une fonction vide ('function() {}') au lieu de cela au cas où il serait encore appelé. –

+1

Selon le navigateur, les éléments sans gestionnaire d'événements sont définis sur undefined ou null. Je ne pense pas que la mise à null présente des problèmes, mais si oui, votre suggestion devrait être prise. – TNi

+1

Pourquoi est-ce downviewé à l'enfer saint? Est-ce une mauvaise idée, si vous êtes coincé dans le code hérité et que vous ne pouvez pas utiliser une bibliothèque d'événements? –

Questions connexes