Я писал несколько классов / coontrols, используя Mootools (1.4), и заметил утечку памяти, прочитав множество страниц форума, я нашел причины для большинства из них, а также обнаружил sIEve.
При использовании sIEve я решил идентифицировать все созданные мною элементы, чтобы было легче увидеть, какие из них не были освобождены должным образом, то есть, установив идентификаторы в «Header» + randomnumber. После тестирования и исправления кода с помощью sIEve, чтобы помочь мне, я заметил, что страница все еще теряла память, хотя теперь sIEve указывал, что я больше не терял элементы.
Я упростил страницу и продолжил тестирование, а сегодня утром обнаружил утечку.
Я уменьшил страницу до минимума, чтобы показать проблему, и удалил все включенные JavaScript.
Тестовая страница просто использует таймер, чтобы продолжать вызывать функцию, которая заменила содержимое DIV другим DIV, без событий, без стилей, настолько базовых, насколько это возможно.
Может показаться, что утечка вызвана использованием уникальных (случайных) идентификаторов для заменяемого DIV. Если я использую один и тот же идентификатор каждый раз, когда он заменяется, утечки памяти нет. (также нет утечки в FF, не проверен хром).
Может кто-нибудь сказать мне, если я делаю что-то неправильно, это известная ошибка IE или даже неизвестная.
Даже если у вас нет решения, я надеюсь, что оно может быть полезным.
Только что добавлено в JSFiddle IELeak
Обновлен JSFiddle с использованием removeChild () с removeChild
<!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>