如何克隆或重新调度DOM事件?

Raz*_*man 56 javascript events dom webkit

我正在寻找一种简单而抽象的方法来克隆或重新调度DOM事件.我对克隆DOM节点不感兴趣.

我已经尝试了一下,阅读了DOM Events规范,但我没有找到明确的答案.

理想情况下,我正在寻找一些直截了当的东西:

handler = function(e){
  document.getElementById("decoy").dispatchEvent(e)
}
document.getElementById("source").addEventListener("click", handler)
Run Code Online (Sandbox Code Playgroud)

当然,这个代码示例不起作用.有一个DOM例外,说明事件当前正在调度 - 显然.

我想避免手动创建新事件document.createEvent(),初始化它们并调度它们.

这个用例有一个简单的解决方案吗?

Ale*_*xis 108

我知道,问题是陈旧的,OP希望避免创建/初始化方法,但是有一种相对简单的方法来复制事件:

new_event = new MouseEvent(old_event.type, old_event)
Run Code Online (Sandbox Code Playgroud)

如果您想要的不仅仅是鼠标事件,您可以这样做:

new_event = new old_event.constructor(old_event.type, old_event)
Run Code Online (Sandbox Code Playgroud)

在原始背景下:

handler = function(e) {
  new_e = new e.constructor(e.type, e);
  document.getElementById("decoy").dispatchEvent(new_e);
}
document.getElementById("source").addEventListener("click", handler);
Run Code Online (Sandbox Code Playgroud)

(对于jQuery用户:您可能需要使用e.originalEvent.constructor而不是e.constructor)

  • 我尝试对滚轮事件执行相同的操作,但新事件的“isTrusted”为 false,并且操作系统会忽略它而不是滚动 (5认同)
  • 请注意,这仅适用于现代版本的Firefox和Chrome,并且不适用于任何版本的IE (3认同)
  • @Alexis我得到:```Uncaught TypeError:Illegal constructor``` :( (3认同)
  • 我刚刚在 npm 上组合了一个名为 clone-event 的模块,它基本上包装了这个答案中描述的功能,这是我当前想要重新调度事件时使用的功能。我已经在 Chrome v37 中对这种方法进行了基本测试,它似乎有效。如果有人发现错误或无法正常工作的环境,我将不胜感激。 (2认同)
  • 非常聪明,你将旧事件作为构造函数的init参数传递的方式! (2认同)
  • @Gyro,是的,根据[specs](https://w3c.github.io/uievents/#trusted-events),在大多数情况下,不受信任的事件不能触发默认操作"就像preventDefault()方法一样称他们为"他们.不幸的是,我认为我们无能为力. (2认同)