Quelle est la Bonne Façon de Détruire une Carte d'Instance?
J'ai récemment développé un html5 application mobile. L'application a une page unique où la navigation de hachage événements de changement de remplacer la totalité du DOM. Une section de l'application a été une Carte Google map à l'aide de l'API v3. Avant que le div est retiré de la DOM, je veux supprimer les gestionnaires d'événements/d'auditeurs et de libérer plus de mémoire possible que l'utilisateur ne peut pas revenir à cette section.
Quelle est la meilleure façon de détruire une carte instance?
- Question connexe (2014): stackoverflow.com/questions/21142483/...
- Code pour tenter de supprimer tous les écouteurs d'événements sur une carte Google maps bug 35821412
Vous devez vous connecter pour publier un commentaire.
Je vais ajouter une deuxième réponse à cette question, parce que je ne veux pas supprimer l'arrière et de suite nous avons eu via les commentaires de suivi sur ma réponse précédente.
Mais je suis récemment tombé sur quelques informations qui s'adresse directement à votre question et donc je voulais la partager. Je ne sais pas si vous êtes au courant, mais au cours de la L'API Google Maps, les Heures de Bureau, le 9 Mai 2012 en Vidéo, Chris Broadfoot et Luc Mahe à partir de Google discuté de cette question très de stackoverflow. Si vous définissez la lecture de la vidéo à 12:50, c'est la section où elles discuter de votre question.
Essentiellement, ils admettent que c'est un bug, mais également ajouter qu'ils ne soutiennent pas vraiment de cas d'utilisation qui impliquent la création/destruction des cartes successives instances. Il a fortement recommandé la création d'une instance unique de la carte et de le réutiliser dans n'importe quel scénario de ce genre. Ils parlent également de réglage de la carte à la valeur null, et explicitement la suppression des écouteurs d'événement. Vous avez exprimé des préoccupations au sujet de l'événement auditeurs, je pensais juste mettre la carte à nul suffirait, mais il semble que vos craintes sont légitimes, car ils mentionnent des écouteurs d'événement particulier. Ils ont également recommandé d'enlever complètement la DIV qui contient la carte ainsi.
En tout cas, je voulais juste faire passer ce long et assurez-vous qu'il est inclus dans le stackoverflow discussion et j'espère qu'il vous aide et d'autres-
La réponse officielle est que vous n'avez pas. Carte des instances dans une page unique application doit être réutilisés et n'est pas détruit puis recréé.
Pour certaines applications de page, cela peut signifier la re-création de l'architecture de la solution telle qu'une fois qu'une carte est créée, elle peut être cachée ou déconnecté du DOM, mais il n'est jamais détruit/recréé.
Puisque apparemment vous ne pouvez pas vraiment détruire la carte des cas, un moyen de réduire ce problème si
est de maintenir un pool d'instances de map.
La piscine garde des pistes d'instances utilisées, et quand il est demandé une nouvelle instance, il vérifie si la carte disponible instances est gratuit: si il l'est, il sera de retour un existant, si elle n'est pas, il va créer une nouvelle carte de l'instance et de la retourner, ajoutant à la piscine. De cette façon, vous n'aurez qu'un nombre maximal d'instances égal au nombre maximum de cartes que vous jamais afficher simultanément sur l'écran.
Je suis en utilisant ce code (il nécessite jQuery):
De vous passer de départ les options de la carte (selon le deuxième argument de google.cartes.Carte du constructeur), et il renvoie à la fois la carte de l'instance (sur lequel vous pouvez appeler des fonctions relatives à google.cartes.Carte), et le conteneur , vous pouvez appliquer un style à l'aide de la classe "myDivClassHereForStyling", et vous pouvez dinamically ajouter au DOM.
Si vous avez besoin de réinitialiser le système, vous pouvez utiliser mapInstancesPool.reset(). Cela réinitialise le compteur à 0, tout en gardant toutes les instances existantes dans la piscine pour la réutilisation.
Dans mon application j'ai besoin de supprimer toutes les cartes à la fois et de créer un nouveau jeu de cartes, donc il n'y a pas de fonction de recycler une carte spécifique exemple: votre kilométrage peut varier.
Pour supprimer les cartes de l'écran, j'utilise jQuery détacher, ce qui ne veut pas détruire la carte du conteneur .
En utilisant ce système, et en utilisant
et en cours d'exécution
(où divReference est la div à l'objet jQuery retourné à partir de l'Exemple de la Piscine)
sur chaque div, je suis retrait, j'ai réussi à garder le Chrome est l'utilisation de la mémoire plus ou moins stable, par opposition à elle augmente à chaque fois que je supprimer des cartes et d'en ajouter de nouvelles.
J'aurais proposé de supprimer le contenu de la carte div et à l'aide de
delete
sur la variable contenant la référence de la carte, et probablement explicitementdelete
ing toute les écouteurs d'événement.Il est reconnu comme un bug, cependant, et cela peut ne pas fonctionner.
delete
ajoute beaucoup (voir stackoverflow.com/q/742623/1314132), mais il ne peut vraiment pas faire de mal. En fin de compte, tout se résume à cette question: existe-il des références à l'objet? Si oui, il ne sera pas nettoyée.GUnload()
pour supprimer toutes les API interne de références.delete
n'est pas vraiment une solution. Qu'ils ont à résoudre le grand, de sorte que la prise de références inaccessible fonctionne comme il devrait, ou en ajouter une nouvelle fonction qui fournit la fonctionnalité que vous décrivez pourGUnload()
.delete
et de compensation de lainnerHTML
n'est pas complètement effacer la mémoire. Malheureusement, ce n'est pas une priorité bug.body
ne les libère pas la mémoire soit.Que google ne marche pas fournir gunload() de l'api v3 de mieux utiliser l'iframe et affecter map.html en tant que source de cette iframe. après utilisation, faire src nulle. Qui va certainement libérer la mémoire consommée par carte.
Lorsque vous retirez le
div
, qui supprime le panneau d'affichage et la carte vont disparaître. Pour retirer la carte de l'instance, assurez-vous que votre référence à la carte est ànull
et que les références à d'autres parties de la carte sont fixés ànull
. À ce point, JavaScript collecte des ordures prendra soin de nettoyer, comme décrit dans: Comment fonctionne la collecte des ordures travail en JavaScript?.null
, mais aucune référence à quoi que ce soit d'autre. Donc, si le marqueur de référence est définie ànull
, rendant inaccessible, il n'y a aucun moyen d'atteindre l'écouteur d'événement. Il peut toujours être connecté à la carte, mais la carte ne peut pas être atteint, c'est juste un gros morceau de la mémoire qui est essentiellement devenu orphelin. C'est la même que la définition d'unArray.length = 0
; si il n'y a pas d'autres références à la membres de, ils forment un groupe d'orphelins de la mémoire qui est admissible pour la collecte des ordures.Je suppose que vous parlez de
addEventListener
. Lorsque vous supprimez les éléments DOM, certains navigateurs fuite de ces événements et de ne pas les supprimer. C'est pourquoi jQuery n'plusieurs choses lors de la suppression d'un élément:removeEventListener
. Cela signifie qu'il est en gardant un tableau avec les écouteurs d'événement-il ajouté cet élément.onclick
,onblur
, etc) à l'aide dedelete
sur l'élément DOM quandaddEventListener
n'est pas disponible (pourtant, il a un tableau où il stocke les événements).null
pour éviter IE 6/7/8 des fuites de mémoire.removeEventListener
oudelete
selon la nature de l'événement.