【问题标题】:Reusable Javascript event object可重用的 Javascript 事件对象
【发布时间】:2011-08-11 21:48:50
【问题描述】:

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

求救!

【问题讨论】:

    标签: javascript mouseevent event-dispatching


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,这就是我想要的!
    【解决方案2】:

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

    阅读 Document Object Model Events 可能会让您更好地了解 DOM 事件系统的工作原理。

    【讨论】:

      【解决方案3】:

      不知道你现在有什么病,只是假设。

      制作一个事件函数:

      function clickEvent(event) {
          //do something
      }
      

      附上:

      obj.onclick = clickHandler;
      

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

      【讨论】:

      • 也许我不清楚。我正在尝试连续多次发送一个事件,尤其是鼠标单击事件,中间有一些小的延迟。为此,我创建了一个 MouseEvent 并尝试通过 node.dispatchEvent(evt) 语法将其分派到同一个节点,并且我总是使用同一个事件对象。这不会触发相应的回调。当我每次重新创建事件对象时,它都会起作用。我可以做到,但我对事情的真正运作方式很感兴趣。 Tnx!
      猜你喜欢
      • 1970-01-01
      • 2012-11-08
      • 2011-11-06
      • 1970-01-01
      • 2023-03-17
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多