gpt4 book ai didi

internet-explorer - 是否可以在没有内存泄漏的情况下在 IE 中使用 iframe?

转载 作者:行者123 更新时间:2023-12-03 10:43:27 26 4
gpt4 key购买 nike

所有版本的 IE(包括 10 个)似乎都保留了 iframe 分配的大量内存,直到 window.top.unload 发生。这对可能在其整个生命周期中创建许多 iframe 的长期页面造成了相当大的挑战。可以在此处找到该问题的简化示例:

http://pastebin.com/FmZ7iMHB

该示例使用 iframe 的 Wikipedia 页面来放大问题,但即使是带有单个图像的简单页面也会泄漏。

简而言之,在 IE 中销毁 iframe 后,下次页面触发垃圾收集时,您会获得一些但不是全部的内存(通常大约 25% 的 iframe 使用的内存陷入困境)。刷新或导航到新页面 (window.top.unload) 将释放大部分或全部剩余内存。

sIEve 等工具中无法检测到这种特殊的泄漏。和微软的JS Memory Leak Detector .我已经阅读了我能找到的关于 IE 中泄漏 iframe 的所有内容,但我遇到的解决方案没有运气。

有谁知道这个问题的解决方案或解决方法?我唯一的缓解策略是在父页面销毁它之前从 iframe 中进行尽可能多的清理,但是当你不控制被框架化的页面时,这无济于事。

最佳答案

我整理了一个用于清理 iframe 的 jQuery 插件,在某些情况下可以防止内存泄漏:

(function($) {
$.fn.purgeFrame = function() {
var deferred;

if ($.browser.msie && parseFloat($.browser.version, 10) < 9) {
deferred = purge(this);
} else {
this.remove();
deferred = $.Deferred();
deferred.resolve();
}

return deferred;
};

function purge($frame) {
var sem = $frame.length
, deferred = $.Deferred();

$frame.load(function() {
var frame = this;
frame.contentWindow.document.innerHTML = '';

sem -= 1;
if (sem <= 0) {
$frame.remove();
deferred.resolve();
}
});
$frame.attr('src', 'about:blank');

if ($frame.length === 0) {
deferred.resolve();
}

return deferred.promise();
}
})(jQuery);

此代码通过在清理其内容之前将帧 src 更新为“about:blank”来处理跨域帧。要使用该插件,请调用 $frame.purgeFrame()否则你会调用 $frame.remove() .

正如 Josh 所指出的,显示图像的 iframe 似乎与内存泄漏有关。例如,创建指向 google.com 的 iframe会在 IE7 和 IE8 中产生内存泄漏。使用上面的插件可以防止这些泄漏。

不幸的是,该插件并非在所有情况下都有效。指向 //en.wikipedia.org/wiki/Memory_leak 的 iframe 似乎没有多大帮助.

我用于测试内存泄漏和测试上述插件的代码位于 https://gist.github.com/3125807

正如 Josh 所说,内存泄漏实际上是 IE8 中的伪泄漏。然而,在 IE7 中,即使父窗口卸载,内存也不会被回收。

关于internet-explorer - 是否可以在没有内存泄漏的情况下在 IE 中使用 iframe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8407946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com