8

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

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

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

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

4

1 回答 1

10

对于类似 的方法addEventListener,它们在常规 JavaScript 代码中并不直接可见。它们存储在内部。


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

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

有效地变成这样:

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

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


.data()关于 jQuery,您是对的,它们存储在jQuery.cache.

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


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

我不记得通用处理程序是否有引用jQuery.cache或只是它的一个子集。它确实持有的参考将对可能存在多少泄漏数据产生影响。

于 2012-10-05T22:54:30.537 回答