使用jQuery remove()会导致内存泄漏

时间:2012-02-13 15:05:12

标签: jquery memory-leaks

我有一个div,我经常创建子div并稍后删除它们。 insert函数看起来像这样。

var insert = function(container, content) {
    content = $(content);
    container.append(content);
    return content;
};

var newContent = insert($('#container'), '<div>new content</div>');

// later
newContent.remove();

container是一个jQuery对象。 content是一个类似<div>new content</div&gt;的字符串。之后,该新内容将被删除。

div已从dom中正确删除,但使用chrome的分析功能,我可以看到内存增长和增长。该配置文件显示了一个字符串列表,其中数千个是我删除的内容。跟踪它,我发现jquery有一个叫做fragment的属性。

$.fragments是一个映射,其中键字符串是html片段(字面意思是<div>new content</div>是键字符串),值是DocumentFragment对象。

DocumentFragment对象包含属性“native”,其中包含“Detached DOM tree”类型的值。还有我的超然对象。

似乎问题是jQuery没有刷新这个$.fragments集合。我正在使用jQuery 1.7.1。

我可以看到的一个可能的原因是地图的键是插入的html,但是当我开始删除片段时,我已经改变了newContent div的属性。

一种可能的解决方案是保留一堆未使用的新内容div并重新使用它们。我

1 个答案:

答案 0 :(得分:1)

看起来jQuery正在使用$.fragments来加速$("<...>")

我认为使用$("<div>").html(...)不会使用缓存,但它在语义上显然不同。

您可以偶尔尝试自己刷新$.fragments,看看会发生什么。我有直觉,一切都会像预期一样,没有任何不良影响。

我认为jQuery确实没有办法跟踪片段缓存的使用情况,而LRU缓存或某些东西可能会慢一些,更不用说实施起来会更麻烦。