【发布时间】:2012-02-13 15:05:11
【问题描述】:
我有一个 div,我经常在其中创建子 div,然后将它们删除。插入函数如下所示。
var insert = function(container, content) {
content = $(content);
container.append(content);
return content;
};
var newContent = insert($('#container'), '<div>new content</div>');
// later
newContent.remove();
容器是一个 jQuery 对象。 content 是一个类似<div>new content</div> 的字符串。稍后,该新内容将被删除。
div 已从 dom 中正确删除,但使用 chrome 的分析功能,我可以看到内存不断增长。配置文件显示了一个字符串列表,其中数千个是我删除的内容。跟踪下来,我看到 jquery 有一个名为 Fragments 的属性。
$.fragments 是一个映射,其中键字符串是 html 片段(字面意思是 <div>new content</div> 是键字符串),值是 DocumentFragment 对象。
DocumentFragment 对象包含一个属性“native”,该属性包含一个“分离的 DOM 树”类型的值。还有我的分离对象。
问题似乎在于 jQuery 没有刷新这个 $.fragments 集合。我正在使用 jQuery 1.7.1。
我可以看到的一个可能原因是地图的键是插入的 html,但是当我开始删除片段时,我已经更改了 newContent div 的属性。
一种可能的解决方案是保留一个未使用的新内容 div 池并重新使用它们。我真的不想这样做,但这可能是合理的。
【问题讨论】:
-
如果这是真的,您可能应该为 jQuery 团队创建一个问题,以便可以解决它。 jQuery bug reporting site
-
如果您不想重复使用 div,请通过创建元素来正确创建元素,然后为其赋予属性和内容。当您执行这些操作时...
$('<div>') $('<div/>') $('<div></div>')...jQuery 将使用document.createElement()。从 HTML 字符串创建 DOM 节点是 IMO 的一种丑陋做法。 -
为什么 newContent = $('new content') 不如 newContent = $('').text('new content') 合适? “新内容”越复杂,我就越不想以编程方式设置属性、样式和内容。
标签: jquery memory-leaks