Для борьбы с утечками пробую 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....