我试图弄清楚 DOM 如何跟踪事件处理程序,无论是通过使用 jQuery、addEventListener 还是通过 HTML 属性(例如 onload="myFunc()")进行绑定。
我读到 jQuery 使用 .data() 方式来存储 jQuery 绑定的事件处理程序...但是其他的呢?他们去哪里?我知道 Webkit 的检查器工具通过检查“元素”选项卡中的元素来显示事件侦听器,但它从哪里获取该信息?
顺便说一句,在使用 Chrome 的 Web 检查器进行的一些测试中,我使用控制台通过引入<script>
标签,从而覆盖jQuery
and $
变量。显然,替换之前使用 jQuery 绑定的事件丢失了,因为在此过程中引入了新的 .data() 接口。
然而,那些“丢失”的处理程序仍然绑定到某些事件,因为它们实际上最终会在事件触发时被调用。假设我想完全删除它们,或者用我自己的处理程序取代它们?这就是为什么我想知道如何在 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 分配一个通用处理程序(using addEventListener
or attachEvent
,任何可用的)你永远不会看到的。当事件发生时,它会查看event.type
,然后查找该元素的.data()
查看是否有该类型的处理程序,如果有,则调用它们。
所以如果你有一些脚本被覆盖jQuery.cache
,您实际上已经孤立了这些处理程序。您无法删除绑定的处理程序addEventListener
除非您有对该处理程序的引用。由于 jQuery 的通用处理程序也存储在jQuery.cache
,除非你破坏元素本身,否则无法解除绑定。
我不记得通用处理程序是否有引用jQuery.cache
或者只是其中的一个子集。它所保存的引用会对可能存在的泄漏数据量产生影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)