8
votes

Les auditeurs d'événements JavaScript doivent-ils être supprimés avant de supprimer l'élément qu'ils sont attachés?

Supposons que j'ai joint une variété d'auditeurs d'événements à divers éléments de forme. Plus tard, je veux supprimer tout le formulaire.

est-il nécessaire (ou suggéré) de désenregistrer tous les gestionnaires d'événements existants sur le formulaire et ses éléments? Si oui, quel est le moyen le plus simple de supprimer tous les auditeurs sur une collection d'éléments? Quelles sont les répercussions de ne pas le faire? J'utilise le prototype, si cela compte.

Voici ce que je fais réellement. J'ai une forme simple, comme ceci: xxx

J'observe divers événements sur les entrées, par exemple: xxx

etc. .

Le formulaire est soumis via AJAX et la réponse est une nouvelle copie du formulaire. Je remplace l'ancienne forme avec une copie du nouveau fait quelque chose comme $ ('formulaire'). Remplacer (Newform) . Suis-je accumulant un groupe d'événements Cruft?


0 commentaires

3 Réponses :


4
votes

événements qui ne sont pas non enregistrés peuvent ne pas libérer leur mémoire automatiquement. Ceci est particulièrement un problème dans les versions plus anciennes d'IE.

prototype utilisé pour avoir un système de collecte automatique des ordures pour cela, mais la méthode a été supprimée dans la version 1.6. Il est documenté ici . Si l'élimination de la méthode signifie que la collection de déchets n'a plus lieu, ni la méthode n'est plus disponible publiquement, je ne sais pas. Notez également que ce n'était jamais appelé sur le déchargement de la page, ce qui signifie que si vos utilisateurs restent sur la même page pendant une longue période pendant longtemps tout en faisant beaucoup de mises à jour AJAX et DOM, la mémoire peut fuir dans une étendue inacceptable même pendant cette visite d'une page.


0 commentaires

0
votes

Il est toujours bon de supprimer tous les auditeurs d'événements d'éléments qui sont supprimés du DOM en cas de scénario que Jonas mentionné ci-dessous.


0 commentaires

3
votes

Ouais, un peu. Pas assez pour être un problème énorme, mais les versions plus anciennes d'IE vont fuir sous ces circonstances.

comme du prototype 1.6.1 (actuellement dans son candidat à la libération finale), la bibliothèque gère ce nettoyage sur la décharge de la page. Lorsque vous utilisez un prototype pour ajouter un observateur d'événement, il conserve une référence à cet élément dans un tableau; À la page Déchargez, il bouclait ce tableau et supprime tous vos observateurs. P>

Toutefois, si l'utilisateur va rester sur cette page pendant un moment, l'utilisation de la mémoire s'accumulera sur la vie de la page. Vous avez plusieurs options: p>

  1. Écoutez des événements sur un ancêtre em> du formulaire, celui qui ne se remplace jamais. Ensuite, dans votre gestionnaire, vérifiez où vient l'événement. (c'est-à-dire "," délégation d'événement ") p> li>

  2. désinscrire explicitement tous vos appels avant d'appeler élément # remplacer code>. Dans votre exemple, vous feriez: p>

    $('foo', 'bar').each(Element.stopObserving);
    


0 commentaires