2010-07-11 29 views
20

¿Es posible eliminar todos los detectores de eventos de un elemento y sus elementos secundarios? Algo así como:¿Quitar todos los detectores de eventos JavaScript de un elemento y sus elementos secundarios?

myElem.removeEventListeners(); 

necesito esto porque tengo un elemento complejo con eventos, y necesito para crear una copia de la misma - como una imagen estática que no reaccione ante cualquier evento.

+1

¿Cómo se vinculan los eventos en primer lugar (por ejemplo, 'onclick = ...', 'addEventListener', biblioteca, etc.)? –

+0

addEventListener() se utiliza. Se usa para myElem y para algunos niños arbitrarios dependiendo de la lógica condicional activada por el usuario. – Tower

+5

Supongo que no te importa IE entonces (que usa 'attachEvent')? Si ese es el caso, "copie" su elemento con 'cloneNode (true)', y los eventos magic-boom-presto, addEventListener no se copiarán. Está en la especificación: http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventListener –

Respuesta

22

Si usa cloneNode, los detectores de eventos no se copiarán.

Si desea una solución robusta, su mejor opción es escribir un contenedor para oyentes attach/detach, y realizar un seguimiento de ellos usted mismo. Algo así como Dean Edwards' addEvent.

+0

Gracias por los consejos.Estoy usando escuchas de eventos W3C, entonces, probablemente tenga que escribir un contenedor, que me gustaría evitar ... – Tower

+0

pero si usa 'cloneNode' sus oyentes no se copiarán. Ver mi actualización, – galambalazs

+0

aún si hay una manera simple de eliminar todo el controlador de eventos, sería genial –

-7

No conozco ninguno, y una búsqueda en Google no arrojó ningún resultado obvio. Una solución fácil, kludgy es crear una función que los ciclos a través de cada evento y lo establece en null, como

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

llamar a esta función de la siguiente manera: removeEvents(myElem). Se puede encontrar una lista completa de controladores de eventos de JavaScript en http://www.elated.com/articles/events-and-event-handlers/.

Sin duda, hay una manera más elegante de escribir esta función, pero no sé si hay una forma más elegante de resolver este problema. Sería encantador si alguien sabe de uno. Si está vinculando eventos a través de una biblioteca de JavaScript, como jQuery, puede haber otras opciones mejores.

+3

Lo configuré para una función vacía ('function() {}') en cambio, en caso de que todavía se llame. –

+1

Según el navegador, los elementos sin controlador de eventos lo tienen definido como indefinido o nulo. No creo que establecerlo como nulo presenta ningún problema, pero si es así, se debe tomar su sugerencia. – TNi

+1

¿Por qué es este downvoted al santo infierno? ¿Es una mala idea, si está atrapado en el código heredado y no puede atornillarse en una biblioteca de eventos? –

Cuestiones relacionadas