【发布时间】:2011-05-19 06:21:16
【问题描述】:
(注意:我在下面使用 jQuery,但问题确实是一个通用的 Javascript 问题。)
假设我有一个div#formsection,其内容使用 AJAX 反复更新,如下所示:
var formSection = $('div#formsection');
var newContents = $.get(/* URL for next section */);
formSection.html(newContents);
每当我更新这个 div 时,我都会trigger a custom event,它将事件处理程序绑定到一些新添加的元素,如下所示:
// When the first section of the form is loaded, this runs...
formSection.find('select#phonenumber').change(function(){/* stuff */});
...
// ... when the second section of the form is loaded, this runs...
formSection.find('input#foo').focus(function(){/* stuff */});
所以:我将事件处理程序绑定到一些 DOM 节点,然后删除这些 DOM 节点并插入新节点(html() 这样做)并将事件处理程序绑定到新的 DOM 节点。
我的事件处理程序是否连同它们绑定的 DOM 节点一起被删除了? 换句话说,当我加载新的部分时,是否有很多无用的事件处理程序堆积在浏览器内存中,等待对于不再存在的 DOM 节点上的事件,或者当它们的 DOM 节点被删除时它们被清除?
额外问题:如何自己测试?
【问题讨论】:
-
我们能否将其改写为“Do event handlers on a DOM node...”?我更愿意将 event 视为对 event handler 的实际调用——我什至可以将 event object 称为事件,但肯定不是事件处理程序。
-
@Martin Algesten - 好点,这不仅仅是偏好 - 我的措辞不正确,而你的措辞是正确的。 :) 会更新。
-
我对这个问题的答案非常感兴趣,但作为一个切线,避免这个问题的一种方法是利用事件冒泡。不是监听特定 DOM 节点上的事件,而是监听父节点(保持不变),然后识别事件的原始来源。这样,您就不必不断地将事件处理程序添加到新的 DOM 节点。 jQuery.live 在这方面非常有用。
-
哇!现在我可以回答了:)
-
视情况而定。如果您有一个包含 1000 行的表,则在表本身上注册一个单击处理程序要简单得多,然后读取
event.target属性以确定单击了哪一行。这不是为创建的每个新行分配处理函数。这当然可以被抽象掉(就像 jQuery 的live函数一样),但是无论如何增加的复杂性仍然存在。
标签: javascript dom javascript-events