附加到knockout的事件侦听器导致的内存泄漏删除了dom元素

时间:2014-08-21 20:52:18

标签: javascript jquery memory-leaks typescript knockout-2.0

我正在使用knockout,它是foreach绑定将表行绑定到表中。我没有更新UI来添加或删除行,这些都是由淘汰完成的。我也使用tipped js库向这些行添加工具提示。问题是我没有引用tipped js的typescript或typescript d.ts定义中的行。我得到了这个丑陋的代码。

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

这只会添加一次事件,然后再将其跳过。

问题在于,虽然在删除行时,knockout会删除它自己的绑定,但tipped却没有。这会导致内存泄漏,因为越来越多的事件侦听器留给页面上不再存在的元素。它们永远不会被垃圾收集。

该解决方案是否是一个自定义的foreach绑定,可以添加和删除我的tipped?

1 个答案:

答案 0 :(得分:0)

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

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)