我试图弄清楚 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 分配一个您从未见过的单一通用处理程序(使用addEventListener
或attachEvent
,任何可用的)。当事件发生时,它查看 event.type
,然后查找元素的 .data()
以查看是否有该类型的处理程序,如果有,则调用他们。
因此,如果您有一些脚本正在覆盖 jQuery.cache
,那么您实际上已经孤立了这些处理程序。您不能删除与 addEventListener
绑定(bind)的处理程序,除非您有对该处理程序的引用。由于 jQuery 的通用处理程序也存储在 jQuery.cache
中,因此除非您销毁元素本身,否则无法解除绑定(bind)。
我不记得具体的通用处理程序是否有对 jQuery.cache
的引用或只是它的一个子集。它所持有的引用会对可能存在的泄漏数据量产生影响。
关于javascript - Javascript 事件处理程序存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12755018/