Поймать утечку памяти в Internet Explorer

 
0
 
JavaScript
ava
Dionysius | 06.08.2007, 12:27
Использую библиотеку Sajax для реализации "живой" корзины для интернет-магазина. Принцип такой: пользователь кликает по значку корзины рядом с интересующим его товаром и тот добавляется в корзину (записывается информация в БД, а также происходит вывод информации в браузер).

Вот код функции, которая отображает в браузере данные, полученные от сервера:


function ShowCart(info_box_contents) {
var str;
var num = 0;
var len = info_box_contents.length;
var tab = d.getElementById('shop_cart');
tab.removeChild(tab.getElementsByTagName('TBODY')[0]);
var tbody = d.createElement("TBODY");
tab.appendChild(tbody);
var row = d.createElement("TR");
tbody.appendChild(row);
var td = d.createElement("TD");
row.appendChild(td);
td.innerHTML = '<img src="images/pixel_trans.gif" border="0" alt="" width="100%" height="1">';
for (var i in info_box_contents) {
row = d.createElement("TR");
tbody.appendChild(row);

td = d.createElement("TD");
if (info_box_contents[i]['align']) td.align = info_box_contents[i]['align'];
row.appendChild(td);
str = '';
if (i==0) {
str = ascii2str (info_box_contents[i]['text']);
}
else if (i==2) {
objStr = new String(info_box_contents[i]['text']);
str = objStr.replace('rub','руб');
}
else {
str = info_box_contents[i]['text'];
}
td.innerHTML = str;
}
row = d.createElement("TR");
tbody.appendChild(row);
td = d.createElement("TD");
row.appendChild(td);
td.innerHTML = '<img src="images/pixel_trans.gif" border="0" alt="" width="100%" height="1">';
}


После нескольких кликов IE вываливается. Отслеживал этот процесс через диспетчер задач Windows, получилась следующая картина: IE занимает около 20 Мб оперативки, затем несколько кликов - память "подскакивает" до 60 Мб и браузер вываливается.

Подскажите, пожалуйста, как можно найти эту утечку? Конструкций вроде elem.onclick = function(){ ... } не использую.

P.S. Функция конвертации символов:

function ascii2str (str) {
newstr = '';
objStr = new String(str);
arrStr = objStr.split(' ');
for (var j in arrStr) {
if (Number(arrStr[j])>127 && Number(arrStr[j])!=176 && Number(arrStr[j])!=177) num = Number(arrStr[j]) + 848;
else num = Number(arrStr[j]);
if (num==1016) newstr = newstr + "Ё";
else if (num==1032) newstr = newstr + "ё";
else if (num!=0) newstr = newstr + String.fromCharCode(num);
}
return newstr;
}


Пример в действии можно посмотреть здесь: хттп://market.z-nsk.ru/index.php/cPath/218_220
Comments (1)
ava
Dionysius | 07.08.2007, 11:36 #
Подсказали решение на одном форуме:
Поменял apendChild() на insertRow() и insertCell() и добиться зависания в IE уже не могу smile Вероятно, проблема была ещё в том, что я создавал элемент, затем добавлял ему свойства, и только потом вызывал метод apendChild(). А его нужно было вызывать перед заданием свойств.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit