0

我试图摆脱 IE8 中的内存泄漏,这是由 iframe 导航期间事件处理程序和 DOM 元素之间的引用循环引起的。我无法修改页面上的其他脚本。

所以想法是遍历 DOM 和 window 对象并取消所有字段以确保没有 DOM 元素引用事件处理程序。

现在的问题是我需要在所有其他卸载处理程序运行后执行此操作,因为其他处理程序可能取决于我要取消的字段。

我尝试在父窗口中的某处导航之前存储文档对象,然后在 iframe 中的导航完成(onload 事件)后,对存储的文档对象运行清理。但是,显然,您不能这样做,因为在旧页面被卸载后访问该文档变得非法(访问错误)。

我尝试的另一种方法是找到添加窗口卸载处理程序的方法,这将保证被称为最后一个,但是,到目前为止我还没有成功。为了实现这一点,我尝试调用卸载事件的所有处理程序,清理它们,然后运行我的代码,但我没有找到手动触发卸载事件的方法。

有任何想法吗?不幸的是,页面使用 jQuery 和 Microsoft Ajax,它们有自己的卸载处理程序。特别是,我的无效化破坏了 MS Ajax 卸载处理程序,因为它删除了所有库名称空间。

4

1 回答 1

0

我认为如果您一开始不知道它们是如何连接的,就不可能保证删除所有事件侦听器。

IE 8 使用attachEvent,所以如果添加了一个监听器,例如:

element.attachEvent('onclick', function(){...});

那么你就无法知道听者是依附的。将onclick属性设置为某个新值(例如 '')不会删除侦听器,也不会通过attachEvent添加另一个侦听器。在 DOM 兼容的浏览器中,将元素替换为自身的克隆将删除侦听器,但在使用attachEVent的 IE 中则不会。

避免内存泄漏的策略通常涉及不创建涉及 DOM 元素的循环引用。

删除所有侦听器的策略通常依赖于保留已添加内容的列表,然后在页面卸载之前显式删除它们。

如果您无法控制页面中的所有代码,两者都可能很困难并且无法保证。

于 2013-07-31T05:51:37.797 回答