【问题标题】:using jQuery remove() causes memory leak使用 jQuery remove() 会导致内存泄漏
【发布时间】: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 是一个类似&lt;div&gt;new content&lt;/div> 的字符串。稍后,该新内容将被删除。

div 已从 dom 中正确删除,但使用 chrome 的分析功能,我可以看到内存不断增长。配置文件显示了一个字符串列表,其中数千个是我删除的内容。跟踪下来,我看到 jquery 有一个名为 Fragments 的属性。

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

DocumentFragment 对象包含一个属性“native”,该属性包含一个“分离的 DOM 树”类型的值。还有我的分离对象。

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

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

一种可能的解决方案是保留一个未使用的新内容 div 池并重新使用它们。我真的不想这样做,但这可能是合理的。

【问题讨论】:

  • 如果这是真的,您可能应该为 jQuery 团队创建一个问题,以便可以解决它。 jQuery bug reporting site
  • 如果您不想重复使用 div,请通过创建元素来正确创建元素,然后为其赋予属性和内容。当您执行这些操作时...$('&lt;div&gt;') $('&lt;div/&gt;') $('&lt;div&gt;&lt;/div&gt;') ...jQuery 将使用document.createElement()。从 HTML 字符串创建 DOM 节点是 IMO 的一种丑陋做法。
  • 为什么 newContent = $('
    new content
    ') 不如 newContent = $('
    ').text('new content') 合适? “新内容”越复杂,我就越不想以编程方式设置属性、样式和内容。

标签: jquery memory-leaks


【解决方案1】:

看起来 jQuery 确实在使用 $.fragments 来加速 $("&lt;...&gt;")

我想使用$("&lt;div&gt;").html(...) 不会使用缓存,但它在语义上显然不同。

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

我不认为 jQuery 真的有办法跟踪片段缓存本身的使用情况,而 LRU 缓存之类的可能会更慢,更不用说实现更多麻烦了。

【讨论】:

  • 你明白了。我刚开始加快速度。真正的问题是我每次都创建一个简短但唯一的 HTML 字符串,而 jquery 正在尝试缓存它。我希望我可以告诉 jQuery 不要缓存它,但我可以创建元素并填写详细信息作为第二步。
  • 作为一种解决方法,您可以在执行任何操作之前强制 jQuery.support.checkClonejQuery.support.html5Clone 为 false。显然,这将阻止 jQuery 缓存片段。见github.com/jquery/jquery/blob/master/src/manipulation.js#L494
  • checkClone 工作。谢谢。在我创建它们时从 html 片段中提取独特的方面并在以后添加它们也可以。我将不得不考虑我上面所说的不是什么。
  • 我收回了。我不得不观察更长的时间。 checkClone + html5Clone 没有修复它。另一个更改确实解决了它。
猜你喜欢
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 2021-09-25
  • 2014-12-08
相关资源
最近更新 更多