powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Борьба с утечками памяти (Drip, sIEve и все все все)
3 сообщений из 3, страница 1 из 1
Борьба с утечками памяти (Drip, sIEve и все все все)
    #36192511
NT Man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для борьбы с утечками пробую Drip, sIEve. Результаты получаю противоречивые. Кому верить?
...
Рейтинг: 0 / 0
Борьба с утечками памяти (Drip, sIEve и все все все)
    #36192887
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NT Man,
Этовы о чём? Если о браузерах - у всех по разному мусорщик работает. Как-нибудь поконкретнее можно? Т.е. где и в чём проблема?
...
Рейтинг: 0 / 0
Борьба с утечками памяти (Drip, sIEve и все все все)
    #36192947
NT Man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShSerge, начнем с того, что я понимаю, что и Drip и sIEve используют ядро исключительно установленного в ситеме IE, если не прав поправьте.

Идем далее



это скрин работающего sIEve. inUse это как я понял количевство задейвствованных DOM узлов, колонка leaks это счетчик утечек. Ну и что мы видим? типа все утекло? ну немогу я понять эту картинку, не знаю может этот код прольет свет на глюк в sIEve или мою бесшабашность.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
//Создания IFrame для нужного url
function createIFrame(url) {
  var id = 'f' + Math.floor(Math.random() *  99999 );
  var div = document.createElement('div');
  document.body.appendChild(div);        
  div.innerHTML = '<iframe style="display:none" src="'+url+'" id="'+id+'" name="'+id+'" onload="sendComplete(this)"></iframe>';
  return document.getElementById(id);
}
// Действия по окончании
function sendComplete(iframe) {
  var doc;
  if(iframe.contentDocument) doc = iframe.contentDocument;
    else if(iframe.contentWindow) doc = iframe.contentWindow.document;
    else if(iframe.document) doc = iframe.document;
  if (doc.location == 'about:blank') return;
  if(ajax_loading_div) ajax_loading_div.style.display = 'none';
  setTimeout(function(){
	  purge2(iframe.parentNode);
//	  iframe.parentNode.parentNode.removeChild(iframe.parentNode)
	  iframe.parentNode.outerHTML = '';
//	  iframe.parentNode = null;
//      iframe = null;
	  }, 0 );
}

Самая соль в этих строчках
Код: plaintext
1.
//	  iframe.parentNode.parentNode.removeChild(iframe.parentNode)
	  iframe.parentNode.outerHTML = '';

Если раскоментировать iframe.parentNode.parentNode.removeChild и закоментировать iframe.parentNode.outerHTML, то в колонку leaks Ничего не попадет, зато колонка inUse будет после каждого создания/удаления iframe стабильно увеличиваться на 7 элементов.

Идем дальше... Dip-у это безразлично. т.е. кнопочка show DOM Leaks В обоих случаях покажет одинаковый результат. Но там есть другая засада.

Вот пример моей реализации обхода ограничений IE для функции innerHTML

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
function innerFunctIE (obj, html) {
	//Обход большого глюка IE.
    //http://msdn.microsoft.com/ru-ru/library/ms533897%28en-us,VS. 85 % 29 .aspx      
    var ro_tags = {COL: 1 ,  COLGROUP: 1 ,  FRAMESET: 1 ,  HEAD: 1 ,  HTML: 1 ,  STYLE: 1 ,  TABLE: 1 ,  TBODY: 1 ,  TFOOT: 1 ,  THEAD: 1 ,  TITLE: 1 ,  TR: 1 };
	var insobj = obj;
	purge(obj);
	var old_html = new Date().getTime().toString();
	var NN;
    var CN = document.createTextNode(old_html);
	var i =  0 ;
    while(obj.tagName in ro_tags){
		//NN = obj.cloneNode(false);
		NN = document.createElement(obj.tagName);
		NN.appendChild(CN);
		CN = NN;
		obj = obj.parentNode;
		i++;
	}
	if (NN) {
		//NN = obj.cloneNode(false);
		NN = document.createElement(obj.tagName);
		NN.appendChild(CN);
//		purge(NN);
		NN.innerHTML = NN.innerHTML.replace(old_html, html);
		for (j =  0 ; j < i; j++) NN = NN.firstChild;
		var child_node;
		//Все делаем через DOM методы, чтобы не покарежить нежные event-ы
		while (insobj.firstChild) insobj.removeChild(insobj.firstChild);
		for (var i =  0 ; child_node = NN.childNodes[i]; i) insobj.appendChild(child_node);

//		NN.outerHTML='';
//		NN = null;
//		document.body.appendChild(NN);
	} else obj.innerHTML = html;
}

На этот раз вся соль в строчках
Код: plaintext
1.
		//NN = obj.cloneNode(false);
		NN = document.createElement(obj.tagName);
если делать через NN = obj.cloneNode(false); то при выполнении приложения внутри Drip-а начинаются загадочные глюки в виде того, что последующий NN.appendChild(CN); ничего в итоге не может добавить. В самом IE и в sIEve такой проблемы нет, мне интересно почему так?
Идем дальше а нашел work around и его видно в оригинальном коде, это NN = document.createElement(obj.tagName); да теперь глюк ушел и везде теперь работает, но пока не могу никак избавиться от утечки, если верить Drip, которая получается от создания элементов посредством createElement. Да есть здесь один тонкий момент они не добавляются в DOM, но почему тогда не помогают многочисленные советы найденные по всему интернету, присваивать null объектам созданным посредством createElement?

В общем вопросов очень много, help....
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Борьба с утечками памяти (Drip, sIEve и все все все)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]