【问题标题】:jQuery Draggable: memory leakjQuery Draggable:内存泄漏
【发布时间】:2016-05-12 01:35:45
【问题描述】:

我有一个简单的 html 表,它正在由一些 websocket 处理程序定期更新:

<table class="schedule">
    <tr>
        <th>Header 1</th>
        <th>Header 2</th>
        <th>Header 3</th>
        ...
    </tr>
    <tr>
        <td class="order"><div>Text 1</div></td>
        <td class="order">Text 2</td>
        <td class="order">Text 3</td>
        ...
    </tr>
</table>

(总共 14 列和大约 10-20 行,每行中的第一个单元格有一个没有类的 div 元素;行也没有 css 类。)

每次更新时都会从表中删除所有行/单元格,并且只有在动态添加新的“订单”单元格之后; dom 中没有重复的表(选中);单元格必须是可拖动的,所以如果我在更新表格的函数末尾添加以下行,页面会在堆中泄漏大约 1 mb,向 DOM 添加大约 200 个新侦听器和大约 200 个新节点。 GC 从不收集这些对象:

var dnd = $("table.schedule td.order").draggable();

如果注释该行一切正常,GC 会收集所有内容。我怀疑问题出在我的选择器上,但我现在花了几个小时使用 Chrome 的工具,但仍然看不到问题出在哪里。非常感谢任何帮助。

【问题讨论】:

    标签: javascript jquery performance jquery-ui memory-leaks


    【解决方案1】:

    您可能正在对现有的可拖动元素重新初始化draggable(),添加新的侦听器和其他东西。

    尝试使用destroy 之类的方法

    $("table.schedule td.order").draggable("destroy").draggable();
    

    如果您可以改用sortable 小部件,它有一个refresh 可以识别可能更适合您的新元素。

    【讨论】:

    • 根据我的测试,在我的情况下,在从表中删除行之前销毁小部件并在更新完成后初始化新的小部件只会减慢整个事情的速度,但没有任何完全“清洁”效果。
    • @Pikkolat 可能您的其余代码存在内存泄漏。你应该分享一个minimal reproducible example...
    • 正如我在问题中提到的,如果我只是用可拖动的方式注释掉该行,其他一切都可以完美运行。所以,我认为其余代码中没有任何漏洞。
    • 如果您需要其他人的进一步帮助,您需要提供更多信息。我认为没有人会为了帮助您而创建这样的演示。如果您确定这是 jQuery UI 的错误,请在他们的网站上提出错误报告,即使他们会要求您进行演示。你是那个寻求帮助的人。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 2013-04-02
    相关资源
    最近更新 更多