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

时间:2011-04-22 17:54:45

标签: javascript events internals spidermonkey

特别是Spidermonkey

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

定义onClick处理程序的位置以及JS引擎在用户单击时如何知道触发onClick事件?

任何关键字,设计模式,链接等都会受到赞赏。

更新

汇总我认为有用的链接:

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

2 个答案:

答案 0 :(得分:9)

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

点击事件由浏览器代码(嵌入SpiderMonkey的东西)触发,而不是由SpiderMonkey本身触发。有关负责调度点击等内容的代码,请参阅http://hg.mozilla.org/mozilla-central/file/e60b8be7a97b/content/events/src/nsEventStateManager.cpp

浏览器也定义了setter方法,它们将赋值赋予onclick属性并将其转换为事件侦听器注册。请参阅从nsEventReceiverSH::SetProperty调用的http://hg.mozilla.org/mozilla-central/file/e60b8be7a97b/dom/base/nsDOMClassInfo.cpp#l7624,并处理名称(此代码中为id)通过IsEventName测试的属性。

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

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

答案 1 :(得分:4)

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