J'ai modifié l'exemple de quelqu'un d'autre et je pense que c'est plus compact comme ça ! Pour paraphraser les mots d'autres personnes, lorsqu'un objet DOM contient une référence à un objet Js (comme un gestionnaire d'événements) et que cet objet Js contient une référence à l'objet DOM, une référence circulaire suffit, donc sous ie, une fuite de mémoire s'est produite . Cliquez sur "Exécuter le code" et ouvrez le Gestionnaire des tâches pour voir les modifications de la mémoire. Testé sous ie8 et ff respectivement, la différence est inutile de le dire.
exécuter le code
Copiez le code comme suit :
<html>
<tête>
<title>Fuite de mémoire</title>
<style>
corps{
remplissage : 10 px ;
}
</style>
</tête>
<corps>
</corps>
<script>
var q = [];
variable n = 0 ;
setInterval(fonction(){
q.push(makeSpan());
si(q.longueur>=10){
var s = q.shift();
si(s){
s.parentNode.removeChild(s);
}
}
n++;
},10);
fonction makeSpan(){
var s = document.createElement("span");
document.body.appendChild(s);
var t=document.createTextNode("*** " + n + " ***");
s.appendChild(t);
s.onclick=fonction(e){
s.style.backgroundColor="rouge";
alerte(n);
} ;
retourner s ;
} ;
</script>
</html>
Alors, comment le résoudre sous ie ?
Lors de la suppression d'un nœud, rompez manuellement la référence circulaire et modifiez légèrement le code setInterval à l'intérieur comme suit :
Copiez le code comme suit :
setInterval(fonction(){
q.push(makeSpan());
si(q.longueur>=10){
var s = q.shift();
si(s){
s.onclick = null;//La clé est ici
s.parentNode.removeChild(s);
}
}
n++;
},10);