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 实现有很多限制,但您应该能够做一些更简单的事情。