代码之家  ›  专栏  ›  技术社区  ›  thomasrutter

难以使用IE Javascript泄漏检测器

  •  7
  • thomasrutter  · 技术社区  · 14 年前

    当使用某些Javascript代码模式时,微软的IE6和IE7浏览器会出现内存泄漏。早在IE6的早期,我就发现了很多关于泄漏模式的信息。不过,据我所知,其中许多(但不是全部)是在IE7和IE6的服务包中修复的。我找不到一个可靠的信息来源,关于那些修补过的IE6和IE7版本仍然存在哪些漏洞。

    有两种工具可以检测泄漏模式。但我似乎不能用我想要的方式使用它们!

    • 微软(Microsoft)的(V2)内存泄漏检测器在我的代码中根本没有发现任何泄漏,即使我使用了应该泄漏的模式。这可能是因为我在运行IE8——有没有什么非头痛的方法可以让它假装是IE6或IE7?

    • 滴水和筛子似乎发现了大量的“孤儿”泄漏。当然,这些肯定是误报——实际上,我添加到文档中然后再次删除的每个元素都会列出,我不相信我会保留对它们的引用。如果它们是真的,我如何才能找到它们在我的代码中泄漏的位置?这些工具有一个“属性”特性,它什么也不显示,使它看起来像是坏的。同样,我也不知道这些泄漏是与IE6或IE7相关,还是仅仅与IE8相关,IE8是我安装的IE版本。

    所以我真的很想知道什么类型的内存泄漏仍然是IE6和IE7的补丁版本的问题,以及如何在我的实时代码中有效地找到它们,使用工具来帮助我。

    有什么帮助吗?

    1 回复  |  直到 11 年前
        1
  •  2
  •   gblazex    14 年前

    我认为没有一个有效的工具来检测内存泄漏。然而,有一个软件,你可以用来在你的电脑上模拟IE6-7-8,它叫做 IE Tester .

    Internet Explorer最常见的漏洞是与JScript的交互。

    当DOM对象包含引用时 到JavaScript对象(这样的事件 处理功能),当 JavaScript对象包含引用 到那个DOM对象,然后循环 结构形成。 - http://javascript.crockford.com/memory/leak.html

    这种循环结构是IE很难处理的。您应该了解循环引用是如何形成的(通过 关闭 ). 第一步是在删除DOM元素之前清理它们。

    这可以通过这样一个通用函数来完成:

    function purge(d) {
        var a = d.attributes, i, l, n;
        if (a) {
            l = a.length;
            for (i = 0; i < l; i += 1) {
                n = a[i].name;
                if (typeof d[n] === 'function') {
                    d[n] = null;
                }
            }
        }
        a = d.childNodes;
        if (a) {
            l = a.length;
            for (i = 0; i < l; i += 1) {
                purge(d.childNodes[i]);
            }
        }
    }
    

    每次从DOM中删除需要使用的元素时 purge 先说吧。你甚至可以写一个包装

    function safeRemove(el) {
      purge(el);
      el.parentNode.removeChild(el);
    }
    

    当然,这只是一个起点,因为它不会帮助您在其他地方(比如DOM2事件处理程序,或者其他任何地方)进行引用 关闭 ). 您应该检查移除元素的位置,并找出哪些函数引用它们。

    这个问题似乎仍然存在于IE6—7—8中。