[jquery-ui]如何控制 IE6 + jQuery + jQuery ui 的内存泄漏问题?

标签: jQuery jQuery-UI IE6
发布时间: 2011/5/26 15:07:41
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

这是一对夫妇 datepickers 示例页 。下面是这滴结果:

alt t<a href='/Tag/Ext'>ext</a>

此页泄漏无限期地在 IE6sp1 时重复单击刷新按钮 (IE6sp3 +、 Opera 9、 Chrome2,和 FF3 + 似乎好)。内存上涨,永远不会落下,直到我其实完全关闭浏览器。

我也试着使用 jquery (r6414) 的最新每夜和最新稳定的 UI (1.7.2),但它并没有作出任何差异。我试过各种事情没有成功 (CollectGarbage-恩锐克,别人)。

我在寻找一个解决方案以外的其他"使用不同的浏览器!!1",我没有任何控制的。任何帮助将不胜感激 !

更新 1:添加该按钮事件循环,这就是发生 (突然落客是当我终止 IE):alt text

更新 2:我提交的 bug 报告 (祈祷)。

更新 3:这也是 邮寄列表上。

更新 4:(如在邮件列表中的报告) 这不起作用,并实际上使事情更糟:

$(window).bind("unload", function() {
  $('.hasDatepicker').datepicker('destroy');
  $(window).unbind();
});

它是不够的只是调用销毁。我仍滞留这一和获取非常靠近翻录 jquery 的项目。我爱它 (我真的做 !),但如果它坏了,我不能使用它。

更新 5:起点赏金,另一个 550 到一个有用的人 !

更新 6:一些更多的测试表明此漏洞在 IE6 和 IE6sp1 中, 存在,但已被固定在 IE6sp2 +。现在,谈到目前为止,我的答案 … …

到目前为止所有答案都了其中的任何一个:

  1. IE6sp0/sp1 用户放弃或忽略它们
  2. Jquery 的调试和解决自己的问题
  3. 我不能复制问题。

我知道乞丐不能挑挑拣拣,但那些根本不回答我的问题。

我不能放弃我的用户。他们组成的有钱的 25%。这是一个自定义的应用程序,面向客户,旨在 IE6 的工作。不是放弃 IE6sp0 选项 / sp1。它不是一个选项来告诉我,只是处理它的客户。它太快五分钟后,一些较弱的机器,不可泄漏。

此外,当爱成为 JS 忍者,因此我可以搜寻晦涩的内存泄漏 (授予这是 MS 的错,不是 jquery) 的 jquery 代码中,我不明白发生。

最后,多人纷纷转载的问题,在这里和在邮件列表中。如果您不能复制,您可能有 IE6SP2 + 中,或您可能不会刷新不够。

显然这个问题是非常重要的事情 (因此 6 修订,赏金,等等) 所以我愿意接受新的思想,但请牢记这些三个建议都不会为我工作。

感谢所有为您的思考和见解。请保持他们的到来 !

更新 7:已经结束的赏金和基思的答案是这么自动获很抱歉只有半点禀 (因为我自己没有选择答案),但我还真呆,一半是公平。

我希望 jquery/jquery-ui 团队可以解决此问题,但恐怕我将不得不作为可能 (现在) 用于注销并停止使用 jquery 的部分或全部。感谢大家对你的帮助和考虑。如果有人来随着真正解决我的问题,请邮寄和我会想出一些方法来报答你。

解决方法 1:

我不想说这,你的做法是正确的、 专业的但我会忍不住,就让它。

后果的不确定这是 IE6 用户会发现他们的机器变慢,慢和最终完全崩溃,或者更有可能崩溃 IE6。

那又怎样?

真的- 为什么这是你的问题吗?

你一定不是能与此泄漏,只有视察,他们将看到的 IE6 崩溃定期无论你做,因为这是什么。

它不太可能仍在 IE6 的人甚至可以指出作为一个您泄漏的应用程序。

最后当 IE6 不会崩溃,报告为罪魁祸首-IE6 你可以合法地指出这是 Microsoft 已在新版本中修复的 IE6 中的错误。

你昂贵的时间更好地用于提高用户不困在旧式的地狱中的应用 — — 您的应用程序应基本上工作对于 IE6 用户,但这种问题可以吸走所有你的时间并不解决他们的问题。IE6 仍将会骑,不受支持,崩溃的浏览器的安全漏洞。

我怀疑 jQuery 咄咄逼人,我采取了类似的观点。也要做一些十分丑陋的东西,绕过这种错误在 IE6,包括是 DOM 工作,停止泄漏,但实际上很慢。


更新

好吧,这并不是简单的问题,要解决-MS 描述了 IE6 bug 并提供有关如何解决它的意见在这里: http://msdn.microsoft.com/en-us/library/bb250448 (VS.85).aspx

基本上这不是问题 javascript 或 jQuery-实际问题时的 IE6 DOM 中的 HTML 元素添加到页面 (通过 javascript,而不是在页加载时) IE 无法垃圾收集他们除非它们非常具体的方式创建。

这是回前从如何 jQuery UI 生成的元素 (请参见上面的链接中的 DOM 插入顺序错误),所以这不是东西,jQuery 咄咄逼人或您可以很容易地解决。

你是怎么解决这个问题的呢?嗯,您可以继续使用传统的弹出式日历的 IE6 或您可以编写您自己的人。

我建议前,但如果您真的要建,后者有要遵循的基本规则:

  1. 总是添加元素自上而下 — — 如果您想要建表,例如添加 <table> 元到页的 DOM,然后添加 <tr> 然后 <td> 等等。这是回前要快得多,生成整个表,然后将其添加到 DOM,不幸的是,这是 IE6 失去它的轨道的位置的不同而不同。

  2. 只使用 CSS 和 HTML 3.2 属性-声音哑,但 IE6 创建额外的对象存储额外的属性 (或 'expando' 属性) 和这些还泄漏。

  3. 有点相关 (2),但如 @ gradbot 提到 IE6 有问题垃圾收集 javascript 因素 — — 如果它们引用内从该元素时激发的事件的 DOM 元素可以获得问题。这也被雪上加霜的 javascript 对有 'expando' 属性的 DOM 元素的引用。

如果你看一看在线可能已坚守这些规则的下拉 DHTML 日历-快速不漂亮,或可配置为 jQuery UI 之一,但我敢肯定的是我见过这件事而渗漏的 IE6。

我认为最好的方法是保持一样静态尽可能-例如您可以加载页面的日历网格 (周数和天列标题) 和动态加载数字 (和别的)。创建天数字为链接,使用 javascript 在 href-不最佳的做法,但在 IE6 中泄漏的可能性远低于正常。

解决方法 2:

很明显你已经被描述的问题源于 IE6,你不能破坏与软件修补程序中存在一个缺陷 (无论是 jQuery 更新、 手动调用 CollectGarbage 或一些其他 JavaScript/DOM 黑客)。

有三个选项,在我看来,这会解决此问题。

  1. 我可以想象您的客户/用户的某些公司标准或规管,因为使用 IE6 SP0,或甚至是因为他们仍然使用某些较旧的 web 应用程序不支持较新的浏览器。如果它不是升级至 IE7 (或因此 IE8) 的选项,你可以与您的客户接触 IT 部门和礼貌地指出用最新的 service pack 更新 IE6 不只修正所付出的应用程序问题但也修补无疑在 IE6 SP0 中存在的许多安全性和性能缺陷。不可否认,这可能不舒适的情况下,但它可能解决所遇到的情况下,同时仍然允许他们使用的浏览器需要不论因任何理由。

  2. 如果你能说服客户的 IE6 是陈旧的 IT 部门,他们可能会愿意让您升级到较新的浏览器的用户。它不是说 IT 部门运作的人会更多愿意强制升级软件,如果他们知道这是要么) 千疮百孔的安全漏洞的雇员或 b) 接近尾声支持日期 (因为 IE6 SP0 是) 的一片。因此它仍有一段时间,但指出,随着其他缺陷/限制你可以找到的也许会使他们认真考虑升级越早至 2010 年 7 月 13 日-支持 IE6 SP0 XP Pro SP2 上。

  3. 然后如果你不能说服任何人都可以升级他们的浏览器,IE6 SPX,或 IE7/8,那么我就不知道是否可以选择,但在您的页面中,删除有问题的控制和追求不同的选项,直到用户的浏览器允许它。有可用的日期选取器控件确实很多实现在线,就会满足您的需要。它不可能为时髦的 jQuery 版本,作为,但你不在此时有许多其他选项。

我希望你找到解决办法 !

解决方法 3:

请尝试删除这些对象后销毁 datepicker 对象:

$.datepicker = null;
$.fn.datepicker = null;

解决方法 4:

这个问题是 jQuery,只有 IE6 部分或 jQuery 的一般部内,缺乏 IE6 especific 代码 (如评论所述)。不管怎样,它仍然是中需要解决的 jQuery 的错误。关于: 空白你就不得不 挖自己陷入 jQuery文件的 bug 票。如果您管理来解决它,别忘了比较重视错误追踪系统,所以该项目获取好一点。;)

如果我得到一些空闲的时间,我会尽力帮你。

编辑

好了,这个问题似乎迁出。

您正面临着的泄漏是 IE 6 SP 0 唯一的问题,泄漏您使用什么 JS 框架,就会造成的 dom。 不事 IE 的方法,不能正常工作。

您当前的选项有:

  • 死尝试 获取您的用户升级到较新版本/服务包的 IE 6
  • (在泄漏) 死于 IE (失去客户) 或
  • 试图在 IE 上工作而死亡。

但这不会 necesarily 意味着您不能解决这个问题。怎么样只想一边通过 wole 的事吗?

显示每个非 IE 6 SP 0 用户只有 IE 6 SP 0,jQuery datepicker,IE 的 条件注释的另一个更有弹性 (和可能基本) datepicker。这样您可以在软件中,保持眼睛糖果/功能,并允许 IE 6 用户具有相同的基本功能。

可能不是一个干净的选项,但是您仍然能够使用您所希望的和 IE6 仍然能够工作而不漏。

只有 问题将是你能有更大的负担,因 degug 两个不同的 datepickers。但你要调试 IE 6 所以不管怎样,目前可能最好的方式。

解决方法 5:

IE 6 的问题是它有两个垃圾收集器。一个用于 JavaScript,另一个用于 dom。因此,例如如果你函数附加到 DOM 事件,然后删除的 DOM 元素函数将仍然存在于内存中。

签出该 幻灯片放映。它是位舌,脸上的,但它是很好的信息。

他们在 IE 7 中的 修正此问题 。我试着 windows 7 在 IE8 中的页面,我还没看到内存泄漏。

解决方法 6:

这里的问题在于比 '只是' jquery 深一点。随着许多其他浏览器"泄漏"循环引用 DOM 对象和对象的侦听器之间的 Jquery。说你有一个侦听器,已附加到它的输入的字段,那么您移除 dom 中的元素,并在您的代码中没有任何引用的侦听器。现在任何现代的浏览器 (> = ie7、 ff、 铬、 野生动物园、 歌剧) 将住在一起,和垃圾收集,而 IE6 会认为因为有一个侦听器附加到 dom 元素它应该不是垃圾收集的 dom 本身的侦听器。

若要避开他们有些人所强调的例如在 Google Doctype 事件代码 使用了非常复杂的设计模式。要解决此问题的 IE6 你会真的需要重写 jquery IE6 问题的解决和/或切换到另一个库使用和/或不附加任何 DOM 事件的应用程序中的事件侦听器的一部分。

解决方法 7:

http://dev.jqueryui.com/ticket/4644 说,他们将在 1.3.3 修复版本。里程碑 1.8: http://dev.jqueryui.com/milestone/1.8

解决方法 8:

"使用不同的浏览器!!1"

但严重的是,深入探讨 jquery 的调试版本、 拉出萤火,和调试线为线。

解决方法 9:

您可以尝试此演示 在这里。它使用相同的方法,如道场实现从 dom 中删除元素。一些快速测试它似乎缓解泄漏,不充分而变得更好。

更新花一点时间,对此我确信它是与 datepicker 本身无关。

我的测试表明通过只重新加载虚拟页每 1 秒 ie 看到内存泄漏。如果您然后将包含在此页面上的 jquery 泄漏稍微增加 (架空的解析脚本) 如果您然后将 jquery ui 添加到组合又是另一个些微的内存泄漏。

为了证明此是否您避免重新加载页面,而有一个按钮,只会增加投入,对其创建的 datepicker,然后将其删除,您将看到很小,如果任何泄漏。

解决方法 10:

供 IE6 的最佳调试器是 Visual Studio。(将工作甚至免费的版本)。作为珍提到,如果您的问题只发生在 IE6 您要调试的 IE6,特别重视代码仅在运行存在。

赞助商