Javascript 克隆要重新分派的DOM事件对象

Javascript 克隆要重新分派的DOM事件对象,javascript,dom,dom-events,Javascript,Dom,Dom Events,某些浏览器不允许您重新调度已调度的事件,但允许您基于可从现有事件对象获取的值创建新的事件对象 是否有一种通用且可重用的解决方案可用于任何事件类型,或者如果没有,是否有一种方法可用于特定的事件类型(在我的案例中,我目前关注的是鼠标滚轮事件)?我找到了自己的答案,至少是针对鼠标事件: function cloneMouseEvent( e ) { var evt = document.createEvent( "MouseEvent" ); evt.initMouseEvent( e

某些浏览器不允许您重新调度已调度的事件,但允许您基于可从现有事件对象获取的值创建新的事件对象


是否有一种通用且可重用的解决方案可用于任何事件类型,或者如果没有,是否有一种方法可用于特定的事件类型(在我的案例中,我目前关注的是
鼠标滚轮
事件)?

我找到了自己的答案,至少是针对鼠标事件:

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 );
您可能希望使用(文档记录不完整)


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

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

let my_event = new MouseEvent(`foo`, some_existing_mouse_event);
dispatchEvent(my_event);
其他类的事件具有类似的构造函数,它们应该以相同的方式可用。比如


您是否尝试了
元素。dispatchEvent(您的鼠标滚轮事件)
?通过
createEvent()
,您应该能够实例化一个新的鼠标滚轮事件。您能否与我们共享cloneMouseEvent的参数“e”的值?当然,这只是您需要的值,但它仍然有助于避免一些陷阱……很抱歉造成混淆,
e
是传递给初始事件处理程序的JavaScript事件对象,即我要克隆的对象。太棒了。这是我见过的最好的方法。谢谢。某些属性无法使用此方法复制,例如target或currentTarget。@shuji您可以在如下内容后设置值:
my_event.target=some_element
注意,还有用于滚动的
WheelEvent
,并且
MouseeEvent
无法正常工作:
let my_event = new MouseEvent(`foo`, some_existing_mouse_event);
dispatchEvent(my_event);