2012-10-05 28 views
7

Algunos navegadores no le permitirán volver a enviar un evento que ya se haya enviado, pero le permitirán crear nuevos objetos de evento en función de los valores que se pueden obtener del objeto de evento existente.¿Cuál es la mejor manera de clonar un objeto de evento de JavaScript para que pueda volver a enviarse?

¿Existe una solución genérica y reutilizable que funcione con cualquier tipo de evento, o en su defecto, una forma de hacerlo para un tipo de evento específico (en mi caso, estoy preocupado con el evento mousewheel)?

+0

hicieron intenta 'element.dispatchEvent (su evento rueda del ratón)'? Debería poder instanciar un nuevo evento mousewheel creo a través de 'createEvent()'. – Sebas

Respuesta

4

He encontrado mi propia respuesta, al menos para MouseEvents específicamente:

function cloneMouseEvent(e) { 
    var evt = document.createEvent("MouseEvent"); 
    evt.initMouseEvent(e.type, e.canBubble, e.cancelable, e.view, e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget); 
    return evt; 
} 

A continuación, puede distribuir el evento sobre un objetivo con:

target.dispatchEvent(evt); 
+0

¿podría compartir con nosotros el valor de 'e', ​​el parámetro de cloneMouseEvent? Por supuesto, serán solo los valores * que * necesita, pero aún así puede ayudar a evitar algunos escollos ... – GameAlchemist

+0

Disculpe la confusión, 'e' es el objeto de evento de JavaScript pasado al manejador de evento inicial - es decir. el que quiero clonar – devios1

1

es posible que desee utilizar el (mal documentado) NWEvents library

NW.Event.dispatch(target, e.type, false, e); 

Funciona con cualquier caso, y en el IES mayores también.

4

Parece que ahora hay una solución aún mejor, ya que initMouseEvent y similares están en desuso. El constructor MouseEvent(), por ejemplo, toma una tabla de propiedades como su segundo parámetro, para lo cual puede utilizar un objeto MouseEvent existente:

let my_event = new MouseEvent(`foo`, some_existing_mouse_event); 
dispatchEvent(my_event); 

Otras clases de eventos tienen constructores similares que deben ser utilizable de la misma manera. Tal como ClipboardEvent().

jsfiddle example

+0

Impresionante. Esta es la mejor forma que he visto. Gracias. –

+0

algunas propiedades no se pueden copiar con este método, target o currentTarget, por ejemplo. – shuji

+0

@shuji Puede establecer el valor después de like: 'my_event.target = some_element' –

Cuestiones relacionadas