我一直在使用Mootools(1.4)编写一些类/ coontrols,并注意到内存泄漏,在阅读了很多论坛页面后,我找到了大部分原因,并发现了sIEve。
在使用sIEve时,我决定对我创建的所有元素进行ID,以便更容易看到哪些元素未被正确释放,即将ID设置为“Header”+ randomnumber。在使用sIEve测试和更正代码来帮助我之后,我注意到页面仍在丢失内存,尽管sIEve现在表示我没有孤立的元素。
我简化了页面并继续测试,今天早上我发现了泄漏。
我已将页面缩小到最低限度以显示问题并删除任何javascript包含。
测试页面只是使用一个计时器来继续调用一个函数,用另一个DIV替换DIV的内容,没有事件,没有样式,基本可以。
对于被替换的DIV,使用唯一(随机)ID会导致泄漏。如果每次更换时都使用相同的ID,则不会发生内存泄漏。 (FF也没有泄漏,没有检查铬)。
任何人都可以告诉我,如果我做错了,是知道IE错误还是未知错误。
即使你没有解决方案,我希望这可能有用。
刚刚添加到JSFiddle IELeak
使用removeChild()with removeChild
更新了JSFiddle<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1 /DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Call the Plumber</title>
<script type="text/javascript">
var TestTimer;
function Test()
{
var rand = Math.random();
var id = rand; // this line will cause leak
// var id = "SameID"; // this line will be fine
document.getElementById("content").innerHTML = ""; // in or out this line makes no difference
document.getElementById("content").innerHTML = "<div id=\""+id+"\">"+rand+"</div>";
}
function Hammer()
{
for( var i=0; i<100; i++)
{
Test();
}
}
function Run()
{
TestTimer = setInterval( Hammer, 50 );
}
function Stop()
{
clearInterval( TestTimer );
}
</script>
</head>
<body>
<div id="page">
<div>
<p>This will leak</p>
<input type="button" onclick="Run()" value="Run" />
<input type="button" onclick="Stop()" value = "Stop"/>
<div id="content"></div>
</div>
</div>
</body>
</html>