小编D. *_* G.的帖子

使用开发人员工具识别javascript闭包

我目前正在开发一个纯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清除数组并允许所有元素被标记为删除?(注意:这是内存泄漏源的当前主要嫌疑人)

javascript

7
推荐指数
1
解决办法
176
查看次数

jquery .remove()是否在后代DOM元素上触发.off()

所以,我知道当我在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()?

javascript jquery memory-leaks

3
推荐指数
1
解决办法
1595
查看次数

标签 统计

javascript ×2

jquery ×1

memory-leaks ×1