【问题标题】:Massive IE7 Memory Leaks when destroying a JQuery UI dialog on close关闭时破坏 JQuery UI 对话框时出现大量 IE7 内存泄漏
【发布时间】:2011-11-03 16:19:50
【问题描述】:

我已经到处寻找答案,甚至对这个特定问题的引用都无济于事。我正在使用 JQuery UI 1.8.7 和 JQuery 1.5.1。我有一个对话框,我不仅要在关闭时销毁,还要在关闭时从 DOM 中删除。这在 Firefox 中运行良好。然而,当我在 IE7 中做同样的事情时,我看到浏览器的内存使用量出现了 6MB 的峰值,并且在我完全关闭浏览器之前,这个内存永远不会被回收。所以我的第一个想法是,我的对话框中的某些东西导致了内存泄漏。我删除了我添加的所有内容,并使用以下代码制作了一个简单的对话框:

$('<div id="testMe">hello</div>').dialog({
    modal: true,
    autoOpen: true,
    close: function() { $(this).dialog('destroy'); }
});

当我打开此对话框时,将其关闭,然后刷新浏览器。我总是得到比以前多 6MB 的内存。如果我打开这个对话框,然后在关闭它之前刷新浏览器,那么我根本看不到任何内存峰值。我不知道是什么原因造成的——我发现了一堆关于一般 JQuery UI 内存泄漏的线程,但是没有一个修复程序可以解决我的问题。

我还认为我的项目中可能有其他一些代码妨碍了我。情况并非如此 - 如果我使用这个 jsFiddle 示例做同样的事情,我也会得到一个内存峰值! (http://jsfiddle.net/n68Af/1/)。在这一点上,我不知道还能去哪里或做什么。我需要销毁这些对话框并将它们从 DOM 中删除 - 在我们的(非常大的)应用程序中已经有相当多的对话框实例依赖于对话框 Div 在关闭后不再位于 DOM 中的事实。

编辑:更改模式标志的值无效。另外,我意识到我的示例没有从 DOM 中删除元素。无论我是否这样做,内存泄漏仍然存在。我实际项目中的代码只是使用 $(this).remove() 从 dom 中删除元素。我简化了这个例子,因为真正的问题是“销毁”调用留下了某种循环引用或导致我提到的 6MB 内存峰值的东西。

编辑:在进一步研究之后,我使用的 JQuery UI 小部件似乎并不重要(我尝试了 Dialog、我自己的自定义小部件和 Button)。只要我从 DOM 中删除小部件引用的元素,我就会在 IE7 中看到巨大的内存泄漏。如果我将元素移动到 DOM 中的其他位置,也会发生内存泄漏。我尝试创建一个“垃圾箱”DIV,我将对话框的所有内容移动到其中而不是完全删除它们,并且发生了相同的峰值。

任何帮助或指导将不胜感激。提前谢谢各位!

【问题讨论】:

  • 你能在没有 modal = true 的情况下进行测试吗(抱歉没有 IE)- 就像这里的这个 SO 问题一样 -> stackoverflow.com/questions/2095095/…
  • 将 modal 设置为 false 会在显示对话框时消除初始内存峰值。但是,刷新网页时仍会增加约 6MB。
  • 您是否在 jQuery 跟踪器上提交了错误?
  • 我还没有添加一个错误...一旦我输入了一个我会在这里链接它
  • 这个问题已经安静了一会儿。有人在这方面取得任何进展吗?

标签: javascript jquery jquery-ui memory-leaks


【解决方案1】:
$('<div id="testMe">hello</div>').dialog({
    modal: true,
    autoOpen: true,
    close: function() { $(this).dialog('destroy').remove(); }
});

这将从 DOM 中完全删除对话框

【讨论】:

  • 查看我对原始帖子的编辑。从 DOM 中删除元素不是问题。问题是为什么 IE7 在销毁对话框时会出现如此巨大的内存泄漏
【解决方案2】:

为什么会发生这种情况,我不确定。自从 IE 启动以来,IE 就有一段奇怪的错误的历史。您最好的选择是将您的 jQuery 库update 更新到最新版本。如果这不起作用,您可以尝试create your own dialog,这并不难。

问题可能在于从 DOM 中删除元素似乎有问题。在这种情况下,您可以重复使用对话框对象和元素,这样就不需要.remove()

【讨论】:

  • 为什么投反对票?如果您不同意,我想对此提出一些意见。
猜你喜欢
  • 1970-01-01
  • 2016-05-28
  • 2021-03-03
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多