Comment faire pour supprimer des éléments du DOM sans fuite de mémoire?
Mon JavaSript code crée une liste de LI
éléments. Quand je l'ai mise à jour de la liste, l'utilisation de la mémoire se développe et ne se couche jamais. Je l'ai testé dans le tamis et il montre que le navigateur conserve tous éléments qui ont été censés être supprimé par $.remove()
ou $.empty
jQuery commandes.
Que dois-je faire pour enlever les nœuds DOM sans la fuite de mémoire?
Voir mon autre question pour le code spécifique.
Vous devez vous connecter pour publier un commentaire.
Les DOM conserve tous les nœuds DOM, même si elles ont été supprimées de l'arbre du DOM lui-même, la seule façon de supprimer ces nœuds est de faire un rafraichissement de la page (si vous mettez de la liste dans une iframe de l'actualisation ne sera pas aussi perceptible)
Sinon, vous pouvez attendre que le problème d'obtenir assez mauvais que les navigateurs garbage collector est forcé dans l'action (en parlant des centaines de mégaoctets de nœuds inutilisés ici)
La meilleure pratique est de réutiliser les nœuds.
EDIT: Essayez ceci:
Pour l'utiliser dans votre contexte, vous serait-il faire comme ceci:
C'est plus un FYI que d'une réelle réponse, mais il est également tout à fait intéressant.
Du W3C DOM de base spécification (http://www.w3.org/TR/DOM-Level-2-Core/core.html):
En d'autres termes: gestion de la mémoire est laissé à la mise en œuvre de la spécification DOM dans différentes langues. Vous devez regarder dans la documentation de la DOM implémentation en javascript afin de trouver une méthode pour supprimer un objet DOM à partir de la mémoire, qui n'est pas un hack. (Il y a cependant très peu d'informations sur le MDC site sur ce sujet).
une note surjQuery#remove
etjQuery#empty
: à partir de ce que je peux dire, aucune de ces méthodes n'est rien d'autre que de retirerObject
s de DOMnode
s ou en supprimant des DOMnode
s de ladocument
. Ils ne supprimer Que, bien sûr, ne signifie pas qu'il n'y a pas de mémoire allouée à ces objets (même si elles ne sont pas dans ledocument
plus).Edit: Le passage ci-dessus est superflu puisque de toute évidence jQuery ne peut pas faire des merveilles et de travailler autour de la DOM de la mise en œuvre du navigateur utilisé.
jQuery
.Avez-vous enlevé les écouteurs d'événement? Que peut provoquer des fuites de mémoire.
Le code ci-dessous n'a pas de fuite sur mon IE7 et les autres navigateurs:
Peut-être vous pouvez essayer de repérer quelques différences avec votre code.
Je sais que IE fuites beaucoup moins lorsque vous insérez d'abord le nœud du DOM avant de faire quoi que ce soit, par exemple: l'ajout d'événements ou de remplir ses
innerHTML
propriété.Si vous avez de "post-fix" de fuite, et il doit le faire sans avoir à réécrire tout le code pour prendre des fermetures, des circulaires, des références, etc en compte, l'utilisation de Douglas Crockfords de Purge méthode avant de supprimer:
http://javascript.crockford.com/memory/leak.html
Ou de l'utilisation de cette fermeture-fix solution de contournement:
http://laurens.vd.oever.nl/weblog/items2005/closures/