某些瀏覽器不允許您重新分派已分派的事件,但允許您基於可從現有事件對象獲取的值創建新的事件對象。克隆JavaScript事件對象的最佳方法是什麼,以便它可以重新分派?
是否有一個通用的可重複使用的解決方案,可以處理任何事件類型,或失敗,一種方法爲特定的事件類型做到這一點(在我的情況下,我目前正在關注mousewheel
事件)?
某些瀏覽器不允許您重新分派已分派的事件,但允許您基於可從現有事件對象獲取的值創建新的事件對象。克隆JavaScript事件對象的最佳方法是什麼,以便它可以重新分派?
是否有一個通用的可重複使用的解決方案,可以處理任何事件類型,或失敗,一種方法爲特定的事件類型做到這一點(在我的情況下,我目前正在關注mousewheel
事件)?
我發現我自己的答案,至少MouseEvents明確:
target.dispatchEvent(evt);
您能否與我們分享'e'的值,cloneMouseEvent的參數?當然,它將只是你需要的值,但它仍然可以幫助避免一些陷阱... – GameAlchemist
對不起,混亂,'e'是JavaScript事件對象傳遞給初始事件處理程序 - 即。我想克隆的那個。 – devios1
您可能需要使用(不良記錄:
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。
看來現在有一個更好的解決方案,因爲initMouseEvent
等已被棄用。該MouseEvent()構造,例如,採用屬性表作爲其第二個參數,你可以使用現有的MouseEvent對象:
let my_event = new MouseEvent(`foo`, some_existing_mouse_event);
dispatchEvent(my_event);
事件的其他班級也有類似的構造函數應該以同樣的方式使用。如ClipboardEvent()。
太棒了。這是我見過的最好的方式。謝謝。 –
例如,某些屬性無法使用此方法,target或currentTarget進行復制。 – shuji
@shuji你可以像下面這樣設置值:'my_event.target = some_element' –
沒有嘗試'element.dispatchEvent(鼠標滾輪事件)'?你應該能夠通過'createEvent()'實現一個新的鼠標滾輪事件。 – Sebas