javascript - 附加到剔除已删除 dom 元素的事件监听器导致内存泄漏

标签 javascript jquery memory-leaks typescript knockout-2.0

我正在使用淘汰赛,它是 foreach 绑定(bind)将表行绑定(bind)到表中。我不会更新 UI 来添加或删除行,这一切都是通过淘汰完成的。我还使用tipped js 库向这些行添加工具提示。问题是我没有引用 typescript 或 typescript d.ts 定义中用于tipped js的行。我用这段丑陋的代码让它工作。

setInterval(function () {
    Tipped.create('.tipped'); // create tooltips and listeners
    $(".tipped").removeClass("tipped"); // don't attach twice
}, 500);

这只会添加事件一次,然后在将来跳过它们。

问题是,尽管当删除一行时,knockout 会删除它自己的绑定(bind),但tipped 却不会。这会导致内存泄漏,因为页面上不再存在的元素会留下越来越多的事件监听器。它们永远不会被垃圾收集。

解决方案是自定义 foreach 绑定(bind)来添加和删除我的小费吗?

最佳答案

我不知道它是否漂亮,但它可以修复我的泄漏

setInterval(function () {
    Tipped.create('.tipped');
    $(".tipped").bind('destroyed', function () {
        Tipped.remove($(this));
    });
    $(".tipped").removeClass("tipped");
}, 500);

(function ($) {
    $.event.special.destroyed = {
        remove: function (o) {
            if (o.handler) {
                o.handler.apply(this, arguments);
            }
        }
    }
})(jQuery)

关于javascript - 附加到剔除已删除 dom 元素的事件监听器导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25435730/

相关文章:

javascript - 显示/隐藏 div javascript 触发 div 宽度

c++ - 在 C++ 中编写一个检查内存泄漏的测试用例

javascript - 有没有办法根据内容的大小(可能会有所不同)扩展 div?

javascript - 如何使用 jquery 删除类值

javascript - MS Word 类似于 HTML 中的 DOM 操作

java - 如何在 JavaScript 中从 servlet 传递值

javascript - 如何使用 jQuery 返回页面的完整 html?

c++ - 销毁 ALLEGRO_BITMAP* 的 vector

c++ - 这个 "on-fly"传递对象会遭受内存泄漏吗?

javascript - Spotify 应用程序 Api - 编码 URI/转义