javascript - Javascript 事件处理程序存储在哪里?

标签 javascript events

我试图弄清楚 DOM 如何跟踪事件处理程序,是通过使用 jQuery、addEventListener 还是通过 HTML 属性(例如 onload="myFunc()")进行绑定(bind)。

我读到过 jQuery 使用 .data() 方法来存储由 jQuery 绑定(bind)的事件处理程序……但是其他的呢?他们去哪里?我知道 Webkit 的检查器工具通过检查“元素”选项卡中的元素来显示事件监听器,但它从哪里获得该信息?

顺便说一下,在使用 Chrome 的网络检查器进行的一些测试中,我使用控制台通过拉入 <script> 将实时站点上的 jQuery 版本替换为更新的版本。标签,从而覆盖 jQuery$变量。很明显,在替换之前使用jQuery绑定(bind)的事件丢失了,因为在这个过程中引入了一个新的.data()接口(interface)。

然而,那些“丢失”的处理程序仍然绑定(bind)到某些事件,因为它们实际上最终会在事件触发时被调用。假设我想完全删除它们,或者用我自己的处理程序取代它们?这就是为什么我想知道如何在 DOM 保存它们的任何地方访问实际的处理程序......并且没有 jQuery。

最佳答案

关于 addEventListener 等方法,它们在常规 JavaScript 代码中不直接可见。它们存储在内部。


关于内联处理程序,它们只是直接存储在 DOM 元素上,就像典型的处理程序一样,因此:

<a href="#" onclick='alert("foo");'>click</a>

有效地变成这样:

a_element.onclick = function(event) { alert("foo"); };

(较旧的 IE 不在函数中包含 event 参数。)


关于 jQuery,您说得对,它们存储在 .data() 中,或者更准确地说是 jQuery.cache

但是您的处理程序永远不会直接分配给元素。 jQuery 分配一个您从未见过的单一通用处理程序(使用addEventListenerattachEvent,任何可用的)。当事件发生时,它查看 event.type,然后查找元素的 .data() 以查看是否有该类型的处理程序,如果有,则调用他们。


因此,如果您有一些脚本正在覆盖 jQuery.cache,那么您实际上已经孤立了这些处理程序。您不能删除与 addEventListener 绑定(bind)的处理程序,除非您有对该处理程序的引用。由于 jQuery 的通用处理程序也存储在 jQuery.cache 中,因此除非您销毁元素本身,否则无法解除绑定(bind)。

我不记得具体的通用处理程序是否有对 jQuery.cache 的引用或只是它的一个子集。它所持有的引用会对可能存在的泄漏数据量产生影响。

关于javascript - Javascript 事件处理程序存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12755018/

相关文章:

android - mediaPlayer 停止时触发事件

vb.net - 文件保存为 xlsx 后,工作簿模块中的代码仍然运行

c# - 请解释一下这个 C# 代码片段

c++ - 在 C++ 中处理许多进程的中央数据缓冲区

javascript - Dojo promise 一切——但这需要等待所有 promise 的返回

JavaScript 到 C# 数值精度损失

javascript - IE 问题 : Gap between div & img

javascript - 尝试将 Redis 集成到 Node.js (TypeScript) 时出现断言错误

javascript - p5.j​​s Prim 算法迷宫生成 : Stuck in Infinite Loop

c# - 获取被点击按钮的文本值