4

我正在制作鼠标单击事件,并尝试连续多次将其分派到某个节点。为此,我使用了相同的 MouseEvent 对象,由于某种原因,这种方法不起作用。然而,当我每次手动创建事件时,系统工作。有谁知道这种行为的原因是什么?我试图更改时间戳,但问题仍然存在。我可以像我之前提到的那样解决问题,但我对这个 MouseEvent 和相应的调度和处理子系统如何真正工作感兴趣。我在 MDC 页面上找到的 MouseEvent 规范似乎缺少很多信息。

Tnx 的帮助!

4

3 回答 3

6

这实际上是一种安全机制,不允许调度之前已经调度过的事件。一个事件总是有与之关联的附加数据,例如它是否来自受信任的来源(用户的键盘而不是 JavaScript 代码)。一些攻击(主要针对 MSIE,因为它具有可变事件对象)正在使用它——他们捕获了一个受信任的事件,对其进行更改并再次将其分派到其他地方(可能并不总是需要更改,将其分派到不同的元素就足以应对某些攻击) . 最后,不允许重新调度事件被证明是最好的解决方案。毕竟,这个功能并不是真正需要的:创建一个具有相同属性(减去隐藏数据)的新事件对象并不难。

这方面的几乎所有安全问题都与文件输入控件有关。前段时间 Firefox 决定彻底改变文件输入 UI 并禁止直接输入文件名。我想知道这种变化是否使重新调度事件成为非问题。然而,我怀疑是否有人愿意冒险再次打开这罐蠕虫病毒。

于 2011-08-11T22:22:14.050 回答
1

我认为你不能重用同一个MouseEvent对象的原因是因为事件系统在事件对象中维护了一些内部状态,所以它们可以实现像冒泡和取消这样的事情。您可能只需要坚持创建不同的事件对象。

阅读Document Object Model Events可以让你更好地理解 DOM 事件系统是如何工作的。

于 2011-08-11T22:02:30.520 回答
0

在不知道你现在生病的情况下,只是假设。

制作一个事件函数:

function clickEvent(event) {
    //do something
}

附上它:

obj.onclick = clickHandler;

您可以对多个对象多次执行此操作。

于 2011-08-11T21:56:31.830 回答