可重用的Javascript事件对象

问题描述 投票:0回答:3

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

Tnx 寻求帮助!

javascript mouseevent event-dispatching
3个回答
7
投票

更新(2023-08-08):当前浏览器似乎允许重新调度事件。事实上,根据 bug 412567,Firefox 自 2008 年起就允许这样做。这是为了符合 Acid3 测试而引入的更改。

原答案如下供参考。


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

几乎所有该领域的安全问题都与文件输入控制有关。不久前,Firefox 决定彻底改变文件输入 UI,禁止直接输入文件名。我想知道这一变化是否使事件的重新调度不再成为问题。不过,我怀疑是否有人愿意再次冒险打开这罐蠕虫。


1
投票

我认为你不能重用相同的

MouseEvent
对象的原因是因为事件系统在事件对象中维护一些内部状态,以便它们可以实现冒泡和取消等功能。您可能只需要坚持创建不同的事件对象。

阅读文档对象模型事件可能会让您更好地理解 DOM 事件系统的工作原理。


0
投票

在不知道你现在有什么病的情况下,只是假设一下。

制作事件函数:

function clickEvent(event) {
    //do something
}

附上:

obj.onclick = clickHandler;

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

© www.soinside.com 2019 - 2024. All rights reserved.