Sto provando a visualizzare dati modificabili dinamicamente che manipolano con elementi DOM (aggiungendoli/rimuovendoli). Ho scoperto un comportamento molto strano di quasi tutti i browser: dopo aver rimosso un elemento DOM e aggiungerne uno nuovo, il browser non libera la memoria prelevata dall'elemento DOM rimosso. Vedere il codice qui sotto per capire cosa intendo. Dopo aver eseguito questa pagina mangerà passo-passo fino a 150 MB di memoria. Qualcuno può spiegarmi questo strano comportamento? O forse sto facendo qualcosa di sbagliato?L'aggiunta/rimozione ciclica dei nodi DOM causa perdite di memoria in 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 a margine: non utilizzare una stringa come parametro per ['setInterval'] (https://developer.mozilla.org/en/DOM/window.setInterval):" L'uso di questa sintassi non è raccomandato per gli stessi motivi dell'utilizzo di [eval()] (https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/Eval#Don%27t_use_eval%21) " –
Grazie per la nota Marcel! Non sapevo quella sintassi. –