问题 事件处理如何在JavaScript内部工作?


特别 蜘蛛猴

我知道你编写函数并将它们附加到事件来处理它们。

哪儿是 onClick 处理程序定义以及JS引擎如何知道触发 onClick 用户点击时的事件?

任何关键字,设计模式,链接等都是值得赞赏的。

UPDATE

我在这里找到有用的聚合链接:

http://www.w3.org/TR/DOM-Level-2-Events/events.html

https://github.com/joyent/node/blob/master/src/node_events.cc

http://mxr.mozilla.org/mozilla/source/dom/src/events/nsJSEventListener.cpp


10813
2018-04-22 17:54


起源

SpiderMonkey是开源的,当然,你可以随时......浏览... - T.J. Crowder
@TJ,Spidermonkey只是一个JS引擎,DOM的事件驱动特性是在它上面实现的。 - Mad Rapper X
出于好奇,您如何期望能够使用这些知识?换句话说,你有什么想做的事情,这个谜团的答案将指导你的解决方案吗? - Pointy
@Pointy,我想在一个gui程序中嵌入Spidermonkey,并允许用户编写程序对某些事件的反应。 - Mad Rapper X
好吧,那就完全合情合理了:-)你可能想要研究的另一件事是Node.js源代码,因为它可能比浏览器的内容稍微复杂一点。 - Pointy


答案:


SpiderMonkey本身没有涉及事件处理的任何内容。事件纯粹是DOM的事情。

click事件由浏览器代码(嵌入SpiderMonkey的东西)触发,而不是由SpiderMonkey本身触发。看到 http://hg.mozilla.org/mozilla-central/file/e60b8be7a97b/content/events/src/nsEventStateManager.cpp 对于负责发送点击等内容的代码。

浏览器也定义了赋值给它的setter方法 onclick 属性并将其转换为事件监听器注册。看到 http://hg.mozilla.org/mozilla-central/file/e60b8be7a97b/dom/base/nsDOMClassInfo.cpp#l7624 这是从 nsEventReceiverSH::SetProperty 并处理其名称的属性(id 在这段代码中)传递了 IsEventName 测试。

注册事件侦听器并触发事件时,事件调度程序管理对侦听器的调用;该 nsJSEventListener 你找到的链接是转换C ++的粘合剂 HandleEvent 调用对JS函数的调用。

因此,在您的情况下,您需要为侦听器提供某种注册/取消注册机制,然后您的实现将触发事件并将它们分发给侦听器。你如何做到最后一部分是非常开放的;由于需要实现DOM Events规范,Gecko实现有很多限制,但是你应该能够做更简单的事情。


7
2018-04-22 18:49



你是个天才 - Mad Rapper X
不,我只是在Gecko内部工作。 - Boris Zbarsky


  1. HTML使用接收器/气泡事件传播模式: http://catcode.com/domcontent/events/capture.html
  2. 有“物理”事件(鼠标,键盘)和逻辑/合成事件(焦点,点击,value_changed等)
  3. onClick是一个逻辑事件 - 由于鼠标,触摸和/或键盘事件而生成。
  4. 鼠标(或手指触摸)发起的点击事件是鼠标按下,移动和向上事件的结果。请注意,鼠标按下,移动和向上是下沉/冒泡事件。这些“原始”事件中的目标元素将是click事件的目标(或源)。如果鼠标按下/向上事件具有不同的目标(DOM元素),则使用它们的公共父节点。
  5. 鼠标按下,移动和向上事件的顺序可能会产生不同的逻辑事件:单击,滑动/滚动等。

我相信这是基本概念的完整列表。


3
2018-04-22 18:53