克隆JavaScript事件对象的最佳方法是什么,以便可以重新分派?

时间:2012-10-05 19:26:34

标签: javascript events

某些浏览器不允许您重新分派已分派的事件,但允许您根据可从现有事件对象获取的值创建新的事件对象。

是否存在适用于任何事件类型的通用且可重用的解决方案,或者失败,为特定事件类型执行此操作(在我的情况下,我目前关注的是mousewheel事件) ?

3 个答案:

答案 0 :(得分:5)

我找到了自己的答案,至少对于MouseEvents而言:

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

然后,您可以使用以下命令在目标上调度事件:

target.dispatchEvent( evt );

答案 1 :(得分:5)

现在似乎有一个更好的解决方案,因为initMouseEvent等已被弃用。例如,MouseEvent()构造函数将属性表作为其第二个参数,您可以使用现有的MouseEvent对象:

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

其他类事件具有类似的构造函数,应该以相同的方式使用。例如ClipboardEvent()

jsfiddle example

答案 2 :(得分:1)

您可能想要使用(记录欠佳的)NWEvents library

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

适用于任何事件,也适用于较旧的IE。