Modifiqué el ejemplo de otra persona y creo que es más compacto así. Parafraseando las palabras de otras personas, cuando un objeto DOM contiene una referencia a un objeto Js (como un controlador de eventos), y este objeto Js contiene una referencia al objeto DOM, una referencia circular es suficiente, por lo que en ie se produjo una pérdida de memoria. . Haga clic en "Ejecutar código" y abra el Administrador de tareas para ver los cambios de memoria. Probado bajo ie8 y ff respectivamente, no hace falta decir la diferencia.
ejecutar código
Copie el código de código de la siguiente manera:
<html>
<cabeza>
<title>Pérdida de memoria</title>
<estilo>
cuerpo{
relleno: 10px;
}
</estilo>
</cabeza>
<cuerpo>
</cuerpo>
<guión>
var q = [];
varn = 0;
establecerInterval(función(){
q.push(makeSpan());
si(q.longitud>=10){
var s = q.shift();
si(s){
s.parentNode.removeChild(s);
}
}
n++;
},10);
función hacerSpan(){
var s = document.createElement("intervalo");
documento.body.appendChild(s);
var t=document.createTextNode("*** " + n + " ***");
s.appendChild(t);
s.onclick=función(e){
s.style.backgroundColor="rojo";
alerta(n);
};
devolver s;
};
</script>
</html>
Entonces, ¿cómo resolverlo en ie?
Al eliminar un nodo, rompa manualmente la referencia circular y cambie ligeramente el código setInterval dentro de la siguiente manera:
Copie el código de código de la siguiente manera:
establecerInterval(función(){
q.push(makeSpan());
si(q.longitud>=10){
var s = q.shift();
si(s){
s.onclick = null;//La clave está aquí
s.parentNode.removeChild(s);
}
}
n++;
},10);