ホームページ  >  記事  >  ウェブフロントエンド  >  jQuery を使用して IE_jquery で iframe アドレスをリセットする場合のメモリ リークの問題の解決策

jQuery を使用して IE_jquery で iframe アドレスをリセットする場合のメモリ リークの問題の解決策

WBOY
WBOYオリジナル
2016-05-16 16:15:281318ブラウズ

ページには iframe があります:

コードをコピーします コードは次のとおりです:



a.html の内容は次のとおりです:

コードをコピーします コードは次のとおりです:



<頭>

ここにタイトルを挿入

<スタイル>
.hack{
/* 1. すべてのブラウザで有効 */
背景色:緑;
/* 2. IE8~IE10、Operaは有効ですが、Opera互換性は無視できます */
背景色:青 /* 3. IE9~IE10が有効、2と組み合わせる、まず2にIE8用を書き、この記事ではIE9|IE10用 */
背景色:赤9 /* 4. IE7 は有効であり、23 と組み合わせると IE7/IE8/(IE9|IE10) を区別できます */
背景色:黄色;
}
/* IE10 の場合 */
@media screen と (-ms-high-contrast: active)、(-ms-high-contrast: none) {
.hack{
背景色:ピンク;
}
}






サフィックス「9」は IE6/IE7/IE8/IE9/IE10 で有効です サフィックス" サフィックス「9」 接頭辞「*」は IE7

で有効です プレフィックス「 」は IE7
で有効です セレクター プレフィックス @media screen および (-ms-high-contrast: active)、(-ms-high-contrast: none)

IE10 で有効


コードをコピーします

コードは次のとおりです:



SPAN




b.html の内容は次のとおりです:


コードをコピーします

<頭>

ここにタイトルを挿入



SPAN





インターネット上では、次のような書き方をするとメモリリークを軽減できるという噂があります。

コードをコピーします

コードは次のとおりです: var FrameDom = $('iframe:eq(0)')[0]; var FrameWin = FrameDom.contentWindow;
試してみてください{
FrameWin.document.write(''); FrameWin.document.clear(); }キャッチ(e){}; FrameDom.src = 'b.html';



それで、その効果は何ですか?


書き方1:URLを直接設定する

コードをコピー

コードは次のとおりです:


var flag = true;
var FrameDom = $('iframe:eq(0)')[0];
$('ボタン').on('クリック',function(){
if(フラグ){
var FrameDom = $('iframe:eq(0)')[0];
var FrameWin = FrameDom.contentWindow;
/*
試してみましょう{
FrameWin.document.write(''); FrameWin.document.clear(); }キャッチ(e){}; */
FrameDom.src = 'b.html';
フラグ = false;
}その他{
var FrameDom = $('iframe:eq(0)')[0];
var FrameWin = FrameDom.contentWindow;
/*
試してみましょう{
FrameWin.document.write(''); FrameWin.document.clear(); }キャッチ(e){}; */
FrameDom.src = 'a.html';
フラグ = true;
}
//$('#console').append(flag ? 'a.html に切り替える': 'b.html に切り替える');
});



sIEve を使用したテスト: #leaks は、切り替えるたびに約 28 ずつ増加します。


書き方2:オンラインでの書き方

コードをコピーします

コードは次のとおりです: <スクリプト> var flag = true; var FrameDom = $('iframe:eq(0)')[0]; $('ボタン').on('クリック',function(){
if(フラグ){
var FrameDom = $('iframe:eq(0)')[0];
var FrameWin = FrameDom.contentWindow;
試してみましょう{
FrameWin.document.write(''); FrameWin.document.clear(); }キャッチ(e){}; FrameDom.src = 'b.html';
フラグ = false;
}その他{
var FrameDom = $('iframe:eq(0)')[0];
var FrameWin = FrameDom.contentWindow;
試してみましょう{
FrameWin.document.write(''); FrameWin.document.clear(); }キャッチ(e){}; FrameDom.src = 'a.html';
フラグ = true;
}
//$('#console').append(flag ? 'a.html に切り替える': 'b.html に切り替える');
});




sIEve を使用したテスト: #leaks は、切り替えるたびに約 28 ずつ増加します。書き方と変わりません





書き方 3:


コードをコピーします

コードは次のとおりです:

var flag = true;

var FrameDom = $('iframe:eq(0)')[0];

$('ボタン').on('クリック',function(){

フラグ = false;
}その他{
/*
試してください{
FrameDom.contentWindow.document.write(''); フレームDom.contentWindow.document.clear(); フレームDom.contentWindow.close(); }キャッチ(e){};
*/
$('iframe:eq(0)').remove();
$('body').append("");
フラグ = true;
}
});

sIEve テストの使用: 平均 #leaks は 3 で、最初の 2 つとは大きな違いがあります

書き方 4: 方法 3 でコードの一部がコメント化されていることに注意してください。コメントを削除するとどうなりますか?

コードをコピーします コードは次のとおりです:

var flag = true;
var FrameDom = $('iframe:eq(0)')[0];
$('ボタン').on('クリック',function(){
if(フラグ){
試してください{
FrameDom.contentWindow.document.write(''); フレームDom.contentWindow.document.clear(); フレームDom.contentWindow.close(); }キャッチ(e){};
$('iframe:eq(0)').remove();
$('body').append("");
フラグ = false;
}その他{
試してください{
FrameDom.contentWindow.document.write(''); フレームDom.contentWindow.document.clear(); フレームDom.contentWindow.close(); }キャッチ(e){};
$('iframe:eq(0)').remove();
$('body').append("");
フラグ = true;
}
});






この書き込み方法と方法 3 の間に明らかな違いはありません。切り替えるたびに #leaks は 3 ほど増加します
したがって、iframe アドレスのリセットによるメモリ リークを解決する最善の方法は、iframe アドレスを強制終了して別のアドレスを追加することであると結論付けることができます。

オンライン送信は信頼できない可能性があります

注: ローカル テスト環境は WIN7 x64 IE9 です

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。