27

ページを iframe に読み込むリンクがあります。Google Chrome のメモリ ヒープ プロファイラを使用してメモリ内のデータの蓄積を監視していたところ、メモリにリークが発生していることに気付きました。

ページを読み込んで、最初のスナップショットを撮りました2.69 MB。ページをiframeに開くリンクをクリックし、別のスナップショットを撮って14.58 MB合計しました. 次の jquery スニペットを使用して iframe を削除しました。

$('#myframe').unbind();
$('#myframe').remove();
/*
* By the way, I also tried $('#myframe > *') as a selector. 
* It still didn't work. Even if it would, it doesn't look like a viable solution to me.
* It looks too resource intensive.
*
* I forgot to mention that I am not using Ajax to load my pages
*/

私は別のスナップショットを取り、初期値からの5.28 MB偏差を示すものを取得しました。これは、2.59 MB私の理解によれば、メモリリークを示しています。

さて、私の質問は次のとおりです: iframe (読み込まれたドキュメントを含む) を削除すると、ガベージ コレクターは、そのドキュメントに含まれるすべてのオブジェクトもメモリから削除する必要があると判断しませんか? または、これを手動で行う必要がありますか?

ドキュメントをiframeにロードしても、そのサイズは親ページのメモリ使用に影響しないと思いました。別のウィンドウと見なされると思いますが、明らかに、それは十分な情報に基づいた仮定ではありませんでした。

これに取り組む方法について何か提案はありますか?

ありがとうございました。

4

3 に答える 3

20

iframe で、削除する前にリロードをトリガーしてから削除します。

<a href="#">Remove</a>
<iframe src="url" />​

$('a').click(function(){
    $('iframe')[0].contentWindow.location.reload();
    setTimeout(function(){
       $('iframe').remove();
    }, 1000);
});​

デモはこちら

さらに、手動でクリーンアップすることもできます。つまり、Cookie または HTML5 localStorage にデータがある場合です。

window.onbeforeunload = function(){
    $(document).unbind().die();    //remove listeners on document
    $(document).find('*').unbind().die(); //remove listeners on all nodes
    //clean up cookies
    /remove items from localStorage
}
于 2012-09-01T17:25:56.310 に答える
2

iframe のオブジェクトがメイン ウィンドウのオブジェクトで参照されている場合、そのオブジェクトは DOM から削除されないため、次のような場合:

メインウィンドウ:

var object = {};
function iframe_call(data){
    object.iframe_data = data.something
}

iframe:

function onClick(){
    parent_object.iframe_call(this);
}

これは、特に DOM オブジェクトを参照する場合に発生します。

于 2012-08-29T13:00:04.110 に答える
0
var frame = document.getElementById("myframe");
frame.src = "about:blank";

これは私から働き、メモリリークを防ぎました。iframe の親を破棄する必要がある場合は、メモリ リークを防ぐために少し遅らせてください。

于 2016-11-27T16:49:15.970 に答える