我目前正在开发一个纯javascript的网站,并且在很大程度上依赖于jQuery和jQuery UI库(这个网站不是供一般公众使用,因此渐进增强不是这个项目的严格要求).我在执行以下代码时遇到严重的内存泄漏:
oDialogBox = $("<div>...</div>");
/* Add useful things to the dialog box here */
oDialogBox.appendTo("body");
oDialogBox.dialog({
/* Other dialog box settings here */
close: function(event, ui) {
oDialogBox.dialog("destroy");
oDialogBox.remove();
oDialogBox = null;
}
});
Run Code Online (Sandbox Code Playgroud)
在此对话框中的任何给定时间,我正在创建,删除和修改大量jQuery UI按钮实例,多选(根据Eric Hynds创建的Multiselect小部件)和单击事件处理程序.据jQuery UI的文件,有关oDialogBox调用一个.remove()应导致所有子控件绑定被删除和.然而,我的独立DOM树显示了GC没有收集的大量垃圾元素.
我很可能错过了一大堆需要安全完成的闭包.我该怎么做:
1)如何识别哪个闭包保持给定的分离DOM对象(在Firefox或Chrome中)?
2)假设已经识别出完整的闭包集,那么除了将变量置零之外还需要做什么来确保标记DOM元素以进行垃圾收集?
3)我还注意到我的页面存储的数组列表是巨型的,并且包含对未被GC收集的DOM元素的引用.是否有记录的最佳实践从javascript清除数组并允许所有元素被标记为删除?(注意:这是内存泄漏源的当前主要嫌疑人)
所以,我知道当我在DOM中的一个元素上执行.remove()时,它及其所有子节点都被删除并标记为删除/垃圾收集.类似地,所有元素的jQuery UI小部件将触发它们的"destroy"方法,并且将删除.data()空间中的所有条目.在决定清理我的DOM树的一部分时,我需要知道的是删除实际上也会明确触发每个元素的.off(),还是我自己需要这样做?
例如,假设我有一系列div如此:
<div id="A-1">
<div class="HasEventListener DelegatedEventBindPoint id="B-1">
<button class="CreatesDelegatedEvent" id="C-1" />
</div>
<button class="HasEventListener NonDelegatedEvent" id="B-2" />
</div>
Run Code Online (Sandbox Code Playgroud)
因此,如果我执行$("#A-1").remove(),这是否有效地调用类似于$(".HasEventListener")的命令.off()?