Quel est le but de $ .cache dans jQuery?
Je vois que les gestionnaires d'événements enregistrés par .on()
sont détenus dans des $.cache
.
Je vois aussi que les gestionnaires d'événements sont également organisés dans $(elem).data()
.
Les objets détenus dans $.cache
consulter les nœuds DOM, sur lequel les événements sont enregistrés. Cela conduit à la fuite de mémoire lorsque les nœuds sont détachées, et de ce fait, .off()
appels obligatoire.
J'ai une situation où je ne sais pas quand le nœud DOM (à laquelle j'attache le gestionnaire d'événement) est détaché. Bien que je ne peux contenir la référence à ce nœud DOM dans mon code et d'appel .off()
à nettoyer, il ne semble pas agréable, car il n'est pas simple de savoir quand le nœud DOM est en cours de suppression.
Quelle est la meilleure façon de le faire?
source d'informationauteur user968903
Vous devez vous connecter pour publier un commentaire.
Si vous allez à l'utilisation de jQuery, vous doit l'utilisation de son API pour la suppression d'éléments, et vous devez utiliser les méthodes appropriées, sinon, comme vous l'avez indiqué, vous aurez des fuites de mémoire.
Si vous ne savez pas quand le nœud DOM est supprimé, et si elle est à l'origine d'une fuite, je suppose que cela signifie que vous utilisez un autre à côté de la bibliothèque jQuery. Ce n'est pas une bonne idée pour cette raison.
Vous devez vous assurer que tous les éléments affectés par jQuery sont enlevés par jQuery. Il y a également quelques données stockées dans
$.cache
que vous n'avez pas défini de manière explicite. Cela signifie que tous éléments doivent être enlevés avec jQuery, au lieu de seulement ceux que vous pense de données peuvent avoir.À associer des gestionnaires et d'autres données avec des éléments. Le lien entre les données et les éléments est en fait un numéro de série stockées sur une propriété expando sur l'élément.
Si vous supprimez l'élément sans jQuery, les données associées dans
$.cache
est orphelin.Le but de cette approche était de prévenir d'éventuelles fuites. Malheureusement, il crée potentiellement plus graves fuites.
J'ai couru dans une situation similaire où knock-out est utilisé pour ajouter et supprimer des dom arbres à partir du document. Cependant, jquery est utilisé pour brancher des écouteurs d'événement à ces dom arbres. Lorsque knock-out supprime des éléments du dom à partir de ce document que les auditeurs ne sont pas indépendant si l'arbre du dom n'est jamais admissible pour la collecte des ordures. Nous avons ajouté une fonction nettoyage que les chaluts à travers le jquery $.cache chaque fois que les modifications de hachage et trouve même des gestionnaires qui sont liés à dom arbres qui ne sont pas dans le document. Ensuite, il délie les auditeurs et donc de faire de l'arborescence dom admissibles pour la collecte des ordures et de la fixation de la plupart de ces fuites que nous voyons c'est à dire de voyage tour ronde de l'application utilisée pour une fuite de 13MO maintenant il fuit à seulement 3 MO avec ces changements.