Я модифицировал чужой пример и думаю, что так он будет более компактным! Перефразируя слова других людей, когда объект DOM содержит ссылку на объект Js (например, обработчик событий), и этот объект Js содержит ссылку на объект DOM, циклической ссылки достаточно, поэтому, например, произошла утечка памяти. . Нажмите «Запустить код» и откройте диспетчер задач, чтобы увидеть изменения памяти. Проверено под ie8 и ff соответственно, разница само собой разумеется.
запустить код
Скопируйте код кода следующим образом:
<html>
<голова>
<title>Утечка памяти</title>
<стиль>
тело{
отступ: 10 пикселей;
}
</стиль>
</голова>
<тело>
</тело>
<скрипт>
вар q = [];
вар п = 0;
setInterval(функция(){
q.push(makeSpan());
если (q.length>= 10) {
вар s = q.shift();
если(а){
s.parentNode.removeChild(s);
}
}
н++;
},10);
функция makeSpan(){
var s = document.createElement("span");
document.body.appendChild(s);
var t=document.createTextNode("*** " + n + " ***");
s.appendChild(т);
s.onclick=функция(е){
s.style.backgroundColor="красный";
предупреждение (п);
};
вернуть с;
};
</скрипт>
</html>
Так как же это решить под ie?
При удалении узла вручную разорвите циклическую ссылку и слегка измените код setInterval внутри следующим образом:
Скопируйте код кода следующим образом:
setInterval(функция(){
q.push(makeSpan());
если (q.length>= 10) {
вар s = q.shift();
если(а){
s.onclick = null;//Ключ здесь
s.parentNode.removeChild(s);
}
}
н++;
},10);