Я заметил, что присвоение атрибуту ID значения динамически создаваемым объектам DOM приводит к утечке памяти в IE9.Кто-нибудь еще испытывал это и, что более важно, знал о каких-либо обходных решениях?Он не протекает в других браузерах, даже IE6 проходит!
Демонстрация кода утечки:
Он просто непрерывно добавляет и удаляет строки из таблицы и назначает идентификатор каждой строке, которая будет использоваться дляпоиск позже.
Не возникает утечка без "row.id = eid;"
<html>
<head>
<script type="text/javascript">
function addRow(tbl, index) {
var row = tbl.insertRow(index);
var eid = "loongrowid" + count;
row.id = eid;
for (var i = 0; i < 9; i++) {
row.insertCell(i);
}
return row;
}
function removeTableRow(tbl, index) {
var row = tbl.rows[index];
tbl.deleteRow( index );
}
var count = 1;
function fillRow(row){
row.cells[0].innerHTML = '<input type="checkbox"' + ' checked="checked"' + ' />';
for (var i = 1; i < 9; i++) {
row.cells[i].innerHTML = count + " c";
}
++count;
}
var added = false;
function dostuff()
{
var tbl = document.getElementById("tbl");
var i;
if (added)
{
for (i = 0; i < 20; ++i)
{
removeTableRow(tbl,1);
}
}
else
{
for (i = 0; i < 20; ++i)
{
var row = addRow(tbl, i+1);
fillRow(row);
}
}
added = !added;
setTimeout(dostuff, 1);
}
</script>
</head>
<body onload="setTimeout(dostuff, 1)">
<h1 id="count">TESTING</h1>
<table id="tbl" style="width:100%;">
<tr>
<th>selected</th>
<th>date</th>
<th>time</th>
<th>place</th>
<th>device</th>
<th>text</th>
<th>state</th>
<th>status</th>
<th>quality</th>
</tr>
</table>
</body>
</html>
Я заметил, что удаление всех ячеек из строки таблицы приводит к уменьшению утечки памяти, поэтому я предполагаю, что IE удерживаетв строку после ее удаления из таблицы.
Я также попытался обойти эту проблему, добавив строки созданной таблицы в объект Javascript, который будет использоваться в качестве хеш-таблицы, вместо того, чтобы полагаться на getElementById (row.id) но это также просочилось по какой-то причине, которую я не вижу.
var hash = [];
// when creating row
row.extid = eid; // Note: this by itself causes no leak
hash[eid] = row;
// when removing row
delete hash[row.extid];