2012-10-05 15 views
7

Alcuni browser non consentono di ri-inviare un evento che è già stato inviato, ma consentono di creare nuovi oggetti evento in base ai valori che possono essere ottenuti dall'oggetto evento esistente.Qual è il modo migliore per clonare un oggetto evento JavaScript in modo che possa essere nuovamente inviato?

Esiste una soluzione generica e riutilizzabile che funzionerà con qualsiasi tipo di evento o, in caso contrario, un modo per farlo per un tipo di evento specifico (nel mio caso sono attualmente interessato all'evento mousewheel)?

+0

Hai provato 'element.dispatchEvent (il vostro evento rotellina del mouse)'? Dovresti essere in grado di avviare un nuovo evento della rotellina del mouse che penso attraverso 'createEvent()'. – Sebas

risposta

4

ho trovato la mia risposta, almeno per MouseEvents specificamente:

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; 
} 

È quindi possibile inviare l'evento su un bersaglio con:

target.dispatchEvent(evt); 
+0

potresti condividere con noi il valore di 'e', ​​il parametro di cloneMouseEvent? Naturalmente saranno solo i valori * necessari *, ma può comunque aiutare ad evitare alcune insidie ​​... – GameAlchemist

+0

Ci scusiamo per la confusione, 'e' è l'oggetto evento JavaScript passato al gestore eventi iniziale - i.e. quello che voglio clonare. – devios1

1

si consiglia di utilizzare il (mal documentato) NWEvents library

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

Funziona con ogni caso, e in IE anziani anche.

4

Sembra che ora ci sia una soluzione ancora migliore, dal momento che initMouseEvent e simili sono deprecati. Il costruttore MouseEvent(), ad esempio, richiede una tabella delle proprietà come secondo parametro, per cui è possibile utilizzare un oggetto MouseEvent esistente:

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

Altre classi di eventi hanno costruttori simili che devono essere utilizzabili nello stesso modo. Ad esempio ClipboardEvent().

jsfiddle example

+0

Fantastico. Questo è il modo migliore che ho visto. Grazie. –

+0

alcune proprietà non possono essere copiate con questo metodo, target o currentTarget ad esempio. – shuji

+0

@shuji È possibile impostare il valore in modo simile: 'my_event.target = some_element' –

Problemi correlati