javascript - 事件处理在 JavaScript 内部是如何工作的?

标签 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

最佳答案

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 函数的调用的粘合剂。

因此,在您的情况下,您需要某种类型的监听器注册/注销机制,然后您的实现将触发事件并将它们分派(dispatch)给监听器。你如何做这最后一部分是开放式的;由于需要实现 DOM 事件规范,Gecko 实现有很多限制,但您应该能够做一些更简单的事情。

关于javascript - 事件处理在 JavaScript 内部是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5758363/

相关文章:

php - 在 PHP 中,为什么 "or die()"有效,而 "or return"无效?

javascript - 直到用户点击图像才在 Canvas 上绘制?

c# - 在 C# 中引发事件的这些可能性之间有什么区别?

asp.net - 使用带有代码隐藏的网络表单通过反射引发事件

javascript - 浏览器 JavaScript 创建自定义事件

windows-10-universal - 什么是 WCI 重分析点(标签 0x80000018)?

php - array_merge 与 union 在 PHP 中的性能

javascript - Fotorama 箭头不显示

javascript - 有没有办法使用 "+="将 1 添加到变量?

javascript - react 带: "Adjacent JSX elements must be wrapped in an enclosing tag"?