Me he dado cuenta de que asignarle un valor al atributo de ID a los objetos DOM creados dinámicamente hace que IE9 pierda memoria. ¿Alguien más ha experimentado esto y, lo que es más importante, conoce alguna solución alternativa? No se filtra en otros navegadores, ¡incluso IE6 pasa!Fuga de memoria IE9 para objetos DOM dinámicos con el atributo de ID
Demostración de código de fugas:
Simplemente añade y elimina filas de una tabla de forma continua y asigna una identificación para cada fila que se utilizará para la búsqueda posterior.
No se produce ninguna fuga sin "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>
me di cuenta de que la eliminación de todas las celdas de la fila de la tabla hace que la pérdida de memoria a contraerse, así que supongo que IE se aferra a la fila después de su sido retirado de la mesa.
También probé una solución temporal que agregaba las filas de la tabla creada en un objeto Javascript para usar como tabla hash en lugar de confiar en getElementById (row.id) pero que también se filtró por algún motivo que no puedo ver.
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];
¿Intentó asignar la identificación con 'setAttribute'? En teoría, no debería hacer ninguna diferencia, pero nunca sabemos ... – bfavaretto
Lo intenté, pero no hizo ninguna diferencia. –
¿Hay algún problema en el funcionamiento lento de este código o en el IE que consume demasiada memoria? ¿Intentó insertar en DOM una vez, primero recopilando todo el HTML nuevo en alguna variable? – shershen