2012-08-15 12 views
35

Estoy buscando una manera simple y abstracta de clonar o volver a enviar eventos DOM solamente. No estoy interesado en clonar nodos DOM.¿Cómo clonar o volver a enviar los eventos DOM?

Experimenté un poco, leí DOM Events specification y no encontré una respuesta clara.

Lo ideal es que estoy buscando algo tan recta hacia adelante como:

handler = function(e){ 
    document.getElementById("decoy").dispatchEvent(e) 
} 
document.getElementById("source").addEventListener("click", handler) 

Este ejemplo de código, por supuesto, no funciona. Hay una excepción DOM que indica que el evento se está enviando actualmente, obviamente.

Me gustaría evitar crear eventos nuevos manualmente con document.createEvent(), inicializándolos y enviándolos.

¿Existe una solución simple para este caso de uso?

+0

¿Por qué necesita su reexpedición eventos? – josh3736

+0

Lo necesito como una solución para las regiones CSS que actualmente no distribuyen eventos de nodo hijo. Las regiones solo representan el contenido del nodo secundario, no actúan como parentNodes. –

Respuesta

63

que sé, la cuestión es viejo, y el PO quería evitar la creación/inicializar enfoque, pero hay una manera relativamente sencilla duplicar los sucesos:

new_event = new MouseEvent(old_event.type, old_event) 

Si desea algo más que eventos de ratón, se puede hacer algo como esto:

new_event = new old_event.constructor(old_event.type, old_event) 

Y en el contexto original:

handler = function(e) { 
    new_e = new e.constructor(e.type, e); 
    document.getElementById("decoy").dispatchEvent(new_e); 
} 
document.getElementById("source").addEventListener("click", handler); 

(Para los usuarios de jQuery: puede que tenga que utilizar e.originalEvent.constructor en lugar de e.constructor)

+1

Tenga en cuenta que esto solo funciona en las versiones modernas de Firefox y Chrome, y no funciona en ninguna versión de IE –

+3

@Alexis obtengo: '' 'Uncaught TypeError: Illegal constructor''': ( – niieani

+0

@NIXin en qué navegador? – Alexis

-2

¿Qué ocurre con el evento desencadenante?

En su caso:

$('#decoy').trigger('click') 

O en JS puro se puede encontrar en How to trigger event in JavaScript?


ACTUALIZACIÓN

encontré un camino a través de jQuery:

  1. Como se escribe aquí - jQuery find events handlers registered with an object necesita obtener el evento necesario. Por ejemplo, $('#decoy').data('events').click[0].handler;

  2. Ahora puede obtener un enlace a este controlador. Pero si desea crear una copia independiente del controlador - utilizar este código para crear copia de manejador:


function clone_obj(obj){ 
    if(obj == null || typeof(obj) != 'object') return obj; 
    var temp = new obj.constructor(); 
    for(var key in obj) temp[key] = clone_obj(obj[key]); 
    return temp; 
} 
+1

Sí, puedo activar un nuevo evento, pero esto implica la configuración manual de su estado para reflejar el evento original. Estoy buscando una forma de que DOM maneje la clonación del evento, cualquiera que sea: haga clic, toque, etc. –

+0

He agregado la actualización con la respuesta – Rustam

Cuestiones relacionadas