Борьба с утечками памяти (Drip, sIEve и все все все)
Для борьбы с утечками пробую Drip, sIEve. Результаты получаю противоречивые. Кому верить?
Начнем с того, что я понимаю, что и Drip и sIEve используют ядро исключительно установленного в ситеме IE, если не прав поправьте. Идем далее ![]() это скрин работающего sIEve. inUse это как я понял количевство задейвствованных DOM узлов, колонка leaks это счетчик утечек. Ну и что мы видим? типа все утекло? ну немогу я понять эту картинку, не знаю может этот код прольет свет на глюк в sIEve или мою бесшабашность. //Создания 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); } Самая соль в этих строчках // 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 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; } На этот раз вся соль в строчках //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.... |
Часовой пояс GMT +3, время: 10:51. |