防止動(dòng)態(tài)加載JavaScript引起的內(nèi)存泄漏問題
更新時(shí)間:2009年10月08日 18:06:32 作者:
利用Script標(biāo)簽可以跨域加載并運(yùn)行一段JavaScript腳本, 但Neil Fraser先前已指出,腳本運(yùn)行后資源并沒被釋放,即使是Script標(biāo)簽移除后。
為了釋放腳本資源,通常在返回后還要一些進(jìn)行額外的處理。
script = document.createElement('script');
script.src =
'http://example.com/cgi-bin/jsonp?q=What+is+the+meaning+of+life%3F';
script.id = 'JSONP';
script.type = 'text/javascript';
script.charset = 'utf-8';
// 標(biāo)簽加到head后,會(huì)自動(dòng)加載并運(yùn)行。
var head = document.getElementsByTagName('head')[0];
head.appendChild(script)
實(shí)際上很多流行的JS庫(kù)都采用這種方式,創(chuàng)建一個(gè)scritp標(biāo)簽,賦予一個(gè)ID后加載腳本(比如YUI get()),加載完并回調(diào)后清除該標(biāo)簽。問題在于當(dāng)你清除這些script標(biāo)簽的時(shí)候,瀏覽器僅僅是移除該標(biāo)簽結(jié)點(diǎn)。
var script = document.getElementById('JSONP');
script.parentNode.removeChild(script);
當(dāng)瀏覽器移除這標(biāo)簽結(jié)點(diǎn)后的同時(shí)并沒對(duì)結(jié)點(diǎn)內(nèi)JavaScript資源的進(jìn)行垃圾回收,這意味著移除標(biāo)簽結(jié)點(diǎn)還不夠,還得手動(dòng)的清除script標(biāo)簽結(jié)點(diǎn)的內(nèi)容:
// Remove any old script tags.
var script;
while (script = document.getElementById('JSONP')) {
script.parentNode.removeChild(script);
// 瀏覽器不會(huì)回收這些屬性所指向的對(duì)象.
//手動(dòng)刪除它以免內(nèi)存泄漏.
for (var prop in script) {
delete script[prop];
}
}
復(fù)制代碼 代碼如下:
script = document.createElement('script');
script.src =
'http://example.com/cgi-bin/jsonp?q=What+is+the+meaning+of+life%3F';
script.id = 'JSONP';
script.type = 'text/javascript';
script.charset = 'utf-8';
// 標(biāo)簽加到head后,會(huì)自動(dòng)加載并運(yùn)行。
var head = document.getElementsByTagName('head')[0];
head.appendChild(script)
實(shí)際上很多流行的JS庫(kù)都采用這種方式,創(chuàng)建一個(gè)scritp標(biāo)簽,賦予一個(gè)ID后加載腳本(比如YUI get()),加載完并回調(diào)后清除該標(biāo)簽。問題在于當(dāng)你清除這些script標(biāo)簽的時(shí)候,瀏覽器僅僅是移除該標(biāo)簽結(jié)點(diǎn)。
復(fù)制代碼 代碼如下:
var script = document.getElementById('JSONP');
script.parentNode.removeChild(script);
當(dāng)瀏覽器移除這標(biāo)簽結(jié)點(diǎn)后的同時(shí)并沒對(duì)結(jié)點(diǎn)內(nèi)JavaScript資源的進(jìn)行垃圾回收,這意味著移除標(biāo)簽結(jié)點(diǎn)還不夠,還得手動(dòng)的清除script標(biāo)簽結(jié)點(diǎn)的內(nèi)容:
復(fù)制代碼 代碼如下:
// Remove any old script tags.
var script;
while (script = document.getElementById('JSONP')) {
script.parentNode.removeChild(script);
// 瀏覽器不會(huì)回收這些屬性所指向的對(duì)象.
//手動(dòng)刪除它以免內(nèi)存泄漏.
for (var prop in script) {
delete script[prop];
}
}
相關(guān)文章
js 只能輸入數(shù)字和小數(shù)點(diǎn)的文本框改進(jìn)版
以前的版本不能輸入退格鍵等功能。2009-04-04bootstrap table實(shí)現(xiàn)合并單元格效果
這篇文章主要為大家詳細(xì)介紹了bootstrap table實(shí)現(xiàn)合并單元格效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12iframe的onreadystatechange事件在firefox下的使用
firefox不支持iframe的onreadystatechange事件,不過有個(gè)方法可以實(shí)現(xiàn)同等的效果,需要的朋友可以參考下2014-04-04js使用html()或text()方法獲取設(shè)置p標(biāo)簽的顯示的值
html()方法可以用來(lái)讀取或者設(shè)置某個(gè)元素中的HTML內(nèi)容,text()方法可以用來(lái)讀取或者沒置某個(gè)元素中的文本內(nèi)容2014-08-08