gpt4 book ai didi

javascript - 如何在 Internet Explorer 中清理 JSONP 内存

转载 作者:数据小太阳 更新时间:2023-10-29 05:34:18 25 4
gpt4 key购买 nike

我是 JSONP 开发的新手,我发现 IE 7/8 不会清理 JSONP 脚本占用的内存。这会导致我的页面在运行几个小时后内存消耗非常高。

我环顾了 Internet,发现大多数修复都是基于 Neil Fraser 中的提示。 .从博客上说您需要使用如下代码删除脚本中的所有属性

    var tmp;
while (tmp = document.getElementById('JSONP')) {
tmp.parentNode.removeChild(tmp);

// this deletion will create error in IE.
for (var prop in tmp) delete tmp[prop];
tmp = null;
}

不幸的是,删除会在 IE 中产生“对象不支持此操作”的错误,并且不会释放内存。

所以我的问题是如何真正释放我的 JSONP 脚本的内存?

我把我的测试代码如下:

测试.html

<html><head></head><body><script>
var script,
head = document.getElementsByTagName('head')[0],
loadCount= 0,
uuid= 1,
URL= "memleaktest.js?uuid=",

clearConsole = function() {
var con= document.getElementById("console");
while (con.childNodes.length)
con.removeChild(con.childNodes[0]);
},

log = function(msg) {
var div= document.createElement("DIV"),
text= document.createTextNode(msg),
con= document.getElementById("console");

div.appendChild(text);
con.appendChild(div);
},

test = { "msg" : null, "data" : null };

var loaded= function() {
if (!test.msg)
return setTimeout(loaded,10);

log("loaded #" + loadCount + ": " + test.msg);

var tmp;
while (tmp = document.getElementById('JSONP')) {
tmp.parentNode.removeChild(tmp);

// not working in IE 7/8
// for (var prop in tmp) delete tmp[prop];
tmp = null;
}

test.msg = test.data = null;

if (--loadCount)
setTimeout(load, 100);
};

var load = function(){
var url= URL + (uuid ++);
log("load via JSONP: "+url);

script= document.createElement('script');
script.id = 'JSONP';
script.type = 'text/javascript';
script.charset = 'utf-8';
script.src = url;
head.appendChild(script);
setTimeout(loaded,1000);
};
</script>
<div>
<button onclick="loadCount=3; load();" name="asd" value="asdas">jsonp load</button>
<button onclick="clearConsole();" name="asd" value="asdas">clear Console</button>
</div>
<div id="console"></div>
</body></html>

内存泄漏测试.js

test.msg = "loaded #"+loadCount;
test.data = "test data with 1MB size";

您可以通过将代码粘贴到两个文件中并打开 Testing.html 来重现内存泄漏。

我使用 Drip 来跟踪泄漏,在 Drip 中你可以看到内存不断增加并且“<"script">”没有被删除。

非常感谢您的帮助!

最佳答案

您的问题已在您链接的博文中得到解答。请参阅最后一段。

As usual IE is the odd browser which requires a special case. IE doesn't like deleting native properties off of DOM nodes. Fortunately this doesn't matter, since IE allows one to reuse script tags. Just change the SRC property and it will fetch the new page immediately. Thus one only needs a single script tag in IE.

提供的代码适用于除 IE 以外的所有浏览器,在 IE 中这不是问题,因为您只需更改脚本标记的 src 属性,它就会重新启动。所以您的代码(仅适用于 IE)将只是:

var script = document.getElementById('JSONP');
if (!script) {
[create it once]
}
script.src = URL + (uuid ++);

关于javascript - 如何在 Internet Explorer 中清理 JSONP 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5244311/

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