Estoy tratando de visualizar la manipulación de datos modificables dinámicamente con elementos DOM (agregarlos/eliminarlos). Descubrí un comportamiento muy extraño en casi todos los navegadores: después de eliminar un elemento DOM y luego agregar uno nuevo, el navegador no libera la memoria tomada por el elemento DOM eliminado. Vea el código a continuación para entender a qué me refiero. Después de ejecutar esta página, comerá paso a paso hasta 150 MB de memoria. ¿Alguien puede explicarme este extraño comportamiento? ¿O tal vez estoy haciendo algo mal?La adición/eliminación cíclica de nodos DOM causa pérdidas de memoria en JavaScript?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<script type="text/javascript">
function redrawThings() {
// Removing all the children from the container
var cont = document.getElementById("container");
while (cont.childNodes.length >= 1) {
cont.removeChild(cont.firstChild);
}
// adding 1000 new children to the container
for (var i = 0; i < 1000; i++) {
var newDiv = document.createElement('div');
newDiv.innerHTML = "Preved medved " + i;
cont.appendChild(newDiv);
}
}
</script>
<style type="text/css">
#container {
border: 1px solid blue;
}
</style>
</head>
<body onload='setInterval("redrawThings()", 200);'>
<div id="container"> </div>
</body>
</html>
Solo una nota al margen: no use una cadena como parámetro para ['setInterval'] (https://developer.mozilla.org/en/DOM/window.setInterval):" No se recomienda el uso de esta sintaxis por las mismas razones que usar [eval()] (https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/Eval#Don%27t_use_eval%21) " –
Gracias por la nota Marcel! No sabía esa sintaxis. –