IE下使用jQuery重置iframe地址時(shí)內(nèi)存泄露問(wèn)題解決辦法
頁(yè)面中有個(gè)iframe:
<iframe src='a.html'></iframe>
<button>測(cè)試IFRAME泄露</button>
其中a.html內(nèi)容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="jquery/jquery.min.js"></script>
<style>
.hack{
/* 1.所有瀏覽器都有效 */
background-color:green;
/* 2.IE8~IE10,Opera有效,但是Opera兼容性可以不考慮 */
background-color:blue\0;
/* 3.IE9~IE10有效,與2組合,在2中先寫(xiě)針對(duì)IE8的,在此條中針對(duì)IE9|IE10 */
background-color:red\9\0;
/* 4.IE7有效,與23組合能區(qū)分出IE7/IE8/(IE9|IE10) */
+background-color:yellow;
}
/* 針對(duì)IE10+ */
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
.hack{
background-color:pink;
}
}
</style>
</head>
<body>
后綴"\9" IE6/IE7/IE8/IE9/IE10都生效
后綴"\0" IE8/IE9/IE10都生效,是IE8/9/10的hack
后綴"\9\0" 只對(duì)IE9/IE10生效,是IE9/10的hack
前綴"*" 對(duì)IE7有效
前綴"+" 對(duì)IE7有效
選擇器前綴 @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none)
針對(duì)IE10有效
<input type='text' value='中文'></input>
<div class='hack' style="width:100px;
height:100px;"></div>
<div id="1" style="padding:5px;position:relative;background-color:green;margin:10px;border:20px solid red;width:100%;height:200px;">
</div>
<div id="2"></div>
<span>SPAN</span>
</body>
</html>
b.html內(nèi)容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="jquery/jquery.min.js"></script>
</head>
<body>
<span>SPAN</span>
</body>
</html>
網(wǎng)上有傳,如下寫(xiě)法可降低內(nèi)存泄露:
var frameDom = $('iframe:eq(0)')[0];
var frameWin = frameDom.contentWindow;
try{
frameWin.document.write('');
frameWin.document.clear();
}catch(e){};
frameDom.src = 'b.html';
那么效果怎樣呢?
寫(xiě)法一:直接設(shè)置URL
var flag = true;
var frameDom = $('iframe:eq(0)')[0];
$('button').on('click',function(){
if(flag){
var frameDom = $('iframe:eq(0)')[0];
var frameWin = frameDom.contentWindow;
/*
try{
frameWin.document.write('');
frameWin.document.clear();
}catch(e){};
*/
frameDom.src = 'b.html';
flag = false;
}else{
var frameDom = $('iframe:eq(0)')[0];
var frameWin = frameDom.contentWindow;
/*
try{
frameWin.document.write('');
frameWin.document.clear();
}catch(e){};
*/
frameDom.src = 'a.html';
flag = true;
}
//$('#console').append(flag ? '切換到a.html':'切換到b.html');
});
使用sIEve測(cè)試:每切換一次,#leaks增加28左右。
寫(xiě)法二:按網(wǎng)傳寫(xiě)法
<script>
var flag = true;
var frameDom = $('iframe:eq(0)')[0];
$('button').on('click',function(){
if(flag){
var frameDom = $('iframe:eq(0)')[0];
var frameWin = frameDom.contentWindow;
try{
frameWin.document.write('');
frameWin.document.clear();
}catch(e){};
frameDom.src = 'b.html';
flag = false;
}else{
var frameDom = $('iframe:eq(0)')[0];
var frameWin = frameDom.contentWindow;
try{
frameWin.document.write('');
frameWin.document.clear();
}catch(e){};
frameDom.src = 'a.html';
flag = true;
}
//$('#console').append(flag ? '切換到a.html':'切換到b.html');
});
</script>
使用sIEve測(cè)試:每切換一次,#leaks增加28左右。與寫(xiě)法一并沒(méi)有什么差別
寫(xiě)法三:
var flag = true;
var frameDom = $('iframe:eq(0)')[0];
$('button').on('click',function(){
if(flag){
/*
try{
frameDom.contentWindow.document.write('');
frameDom.contentWindow.document.clear();
frameDom.contentWindow.close();
}catch(e){};
*/
$('iframe:eq(0)').remove();
$('body').append("<iframe src='b.html'></iframe>");
flag = false;
}else{
/*
try{
frameDom.contentWindow.document.write('');
frameDom.contentWindow.document.clear();
frameDom.contentWindow.close();
}catch(e){};
*/
$('iframe:eq(0)').remove();
$('body').append("<iframe src='a.html'></iframe>");
flag = true;
}
});
使用sIEve測(cè)試:#leaks平均為 3,與前兩種相差巨大
寫(xiě)法四:注意到,寫(xiě)法三中注釋了一段代碼,去掉注釋會(huì)怎樣?
var flag = true;
var frameDom = $('iframe:eq(0)')[0];
$('button').on('click',function(){
if(flag){
try{
frameDom.contentWindow.document.write('');
frameDom.contentWindow.document.clear();
frameDom.contentWindow.close();
}catch(e){};
$('iframe:eq(0)').remove();
$('body').append("<iframe src='b.html'></iframe>");
flag = false;
}else{
try{
frameDom.contentWindow.document.write('');
frameDom.contentWindow.document.clear();
frameDom.contentWindow.close();
}catch(e){};
$('iframe:eq(0)').remove();
$('body').append("<iframe src='a.html'></iframe>");
flag = true;
}
});
此寫(xiě)法與寫(xiě)法3并沒(méi)有明顯差別,每次切換#leaks仍然增加3左右
因此可以得出結(jié)論,最好的解決重置iframe地址內(nèi)存泄露辦法就是 把它干掉,再添加一個(gè)!
網(wǎng)傳不一定靠譜啊
注:本機(jī)測(cè)試環(huán)境為 WIN7 x64 IE9
- jquery不會(huì)自動(dòng)回收xmlHttpRequest對(duì)象 導(dǎo)致了內(nèi)存溢出
- 使用jQuery Ajax功能時(shí)需要注意的一個(gè)問(wèn)題(內(nèi)存溢出)
- JQuery1.4+ Ajax IE8 內(nèi)存泄漏問(wèn)題
- JQuery Dialog的內(nèi)存泄露問(wèn)題解決方法
- js內(nèi)存泄露的幾種情況詳細(xì)探討
- Javascript 閉包引起的IE內(nèi)存泄露分析
- 容易造成JavaScript內(nèi)存泄露幾個(gè)方面
- 權(quán)威JavaScript 中的內(nèi)存泄露模式
- 關(guān)于js內(nèi)存泄露的一個(gè)好例子
- jQuery內(nèi)存泄露解決辦法
相關(guān)文章
js jquery獲取隨機(jī)生成id的服務(wù)器控件的三種方法
由于ASP.NET網(wǎng)頁(yè)運(yùn)行后,服務(wù)器控件會(huì)隨機(jī)生成客戶端id,jquery獲取時(shí)候不太好操作,下面為大家整理了三種方法,感興趣的朋友可以參考下哈,希望對(duì)大家有所幫助2013-07-07jQuery實(shí)現(xiàn)頁(yè)面滾動(dòng)時(shí)智能浮動(dòng)定位
本文主要介紹了jQuery實(shí)現(xiàn)頁(yè)面滾動(dòng)時(shí)智能浮動(dòng)定位的方法。附上完整代碼,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01JQuery防止退格鍵網(wǎng)頁(yè)后退的實(shí)現(xiàn)代碼
有時(shí)我們需要防止退格鍵的網(wǎng)頁(yè)后退,一般情況下最好不要這么用,因?yàn)閷?duì)UX體驗(yàn)不好2012-03-03- 把一個(gè)元素淡出或淡入可以達(dá)到更為生動(dòng)的效果,在任何一種情況下,都只是隨著時(shí)間來(lái)改變?cè)氐耐该鞫?/div> 2014-09-09
jQuery給div,Span, a ,button, radio 賦值與取值
這篇文章主要介紹了jQuery給div,Span, a ,button, radio 賦值與取值的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06JQuery中dataGrid設(shè)置行的高度示例代碼
dataGrid 設(shè)置行的高度在jquery中如何做到,下面有個(gè)不錯(cuò)的教程,感興趣的朋友可以參考下2014-01-01為jquery的ajax請(qǐng)求添加超時(shí)timeout時(shí)間的操作方法
這篇文章主要介紹了為jquery的ajax請(qǐng)求添加超時(shí)timeout時(shí)間的操作方法,文中通過(guò)一段簡(jiǎn)單的代碼給大家介紹jquery ajax超時(shí)設(shè)置方法,感興趣的朋友跟隨腳本之家小編一起看看吧2018-09-09最新評(píng)論