13

特别是蜘蛛猴

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

处理程序在哪里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

4

2 回答 2

9

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

点击事件由浏览器代码(嵌入 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 事件规范,Gecko 实现有很多限制,但您应该能够做一些更简单的事情。

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

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

于 2011-04-22T18:53:19.990 回答