Показать сообщение отдельно
  #10 (permalink)  
Старый 28.11.2008, 03:21
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

И что этим кодом можно увидеть? Скачки в несколько килобайт используемой памяти, связаны с работой сборщика мусора. Не в одном браузере утечек памяти не наблюдается.

Вот во время написания фреймворка, я столкнулся с проблемой: при удалении узла через 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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript">
window.onload = function() {
	// Test 1
	var div = document.getElementById('test1');
	document.body.removeChild(document.getElementById('conteiner1'));
	alert(div.id);
	
	// Test 2
	var div = document.getElementById('test2'), cont = document.getElementById('conteiner2');
	while(cont.firstChild) cont.removeChild(cont.firstChild);
	document.body.removeChild(cont);
	alert(div.id);
		
	// Test 3
	document.body.removeChild(document.getElementById('conteiner3'));
	alert(document.getElementById('test3'));
};
</script>
</head>
<body>
	<div id="conteiner1">
		<div id="test1">Test</div>
	</div>

	<div id="conteiner2">
		<div id="test2">Test</div>
	</div>
	
	<div id="conteiner3">
		<div id="test3">Test</div>
	</div>
</body>
</html>

Это проблема стала еще более существенной из-за использования кэша по идентификаторам. Решить смог только удалением кэша после операций, связанных с удалением узлов и изменением идентификатора, хотя до сих пор остаются моменты, когда можно попасть в такую ситуацию.

Это конечно не баг, а особенность, но даже метод removeNode в IE, который принимает параметр булевского типа, для явного указания того, что дочерние узлы должны быть удалены, в случае наличия ссылки на элемент, не делает этого

Впрочем, так ведет себя любой объект — остается в памяти, пока есть хоть одна ссылка на него
var obj = {a: 'aa'}, c = obj;
obj = null;
alert(c.a);


Кстати, чтобы оставить в памяти удаляемый узел, нужно написать так
var removedNode = parent.removeChild(node);

Последний раз редактировалось Octane, 28.11.2008 в 03:50.
Ответить с цитированием