2012-10-05 52 views
7

某些瀏覽器不允許您重新分派已分派的事件,但允許您基於可從現有事件對象獲取的值創建新的事件對象。克隆JavaScript事件對象的最佳方法是什麼,以便它可以重新分派?

是否有一個通用的可重複使用的解決方案,可以處理任何事件類型,或失敗,一種方法爲特定的事件類型做到這一點(在我的情況下,我目前正在關注mousewheel事件)?

+0

沒有嘗試'element.dispatchEvent(鼠標滾輪事件)'?你應該能夠通過'createEvent()'實現一個新的鼠標滾輪事件。 – Sebas

回答

4

我發現我自己的答案,至少MouseEvents明確:

target.dispatchEvent(evt); 
+0

您能否與我們分享'e'的值,cloneMouseEvent的參數?當然,它將只是你需要的值,但它仍然可以幫助避免一些陷阱... – GameAlchemist

+0

對不起,混亂,'e'是JavaScript事件對象傳遞給初始事件處理程序 - 即。我想克隆的那個。 – devios1

1

您可能需要使用(不良記錄:

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

然後,您可以與調度事件上的目標)NWEvents library

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

適用於任何事件,也適用於較老的IE。

4

看來現在有一個更好的解決方案,因爲initMouseEvent等已被棄用。該MouseEvent()構造,例如,採用屬性表作爲其第二個參數,你可以使用現有的MouseEvent對象:

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

事件的其他班級也有類似的構造函數應該以同樣的方式使用。如ClipboardEvent()

jsfiddle example

+0

太棒了。這是我見過的最好的方式。謝謝。 –

+0

例如,某些屬性無法使用此方法,target或currentTarget進行復制。 – shuji

+0

@shuji你可以像下面這樣設置值:'my_event.target = some_element' –

相關問題