96 votes

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 d'instance?

51voto

Sean Mickey Points 4676

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 l' API Google Maps Heures de Bureau de 9 Mai 2012 Vidéo, Chris Broadfoot et Luc Mahe à partir de Google discuté de cette question à partir 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.

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, vous et les autres-

17voto

pm_hce Points 211

Puisque apparemment vous ne pouvez pas vraiment détruire la carte des cas, un moyen de réduire ce problème si

  • vous avez besoin d'afficher plusieurs cartes à la fois sur un site web
  • le nombre de cartes peuvent changer avec l'interaction de l'utilisateur
  • les cartes doivent être masqués et re-présentés ensemble avec d'autres composants (c'est à dire qu'ils n'apparaissent pas dans une position fixe dans les DOM)

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):

var mapInstancesPool = {
 pool: [],
 used: 0,
 getInstance: function(options){
    if(mapInstancesPool.used >= mapInstancesPool.pool.length){
        mapInstancesPool.used++;
        mapInstancesPool.pool.push (mapInstancesPool.createNewInstance(options));
    } else { 
        mapInstancesPool.used++;
    }
    return mapInstancesPool.pool[mapInstancesPool.used-1];
 },
 reset: function(){
    mapInstancesPool.used = 0;
 },
 createNewInstance: function(options){
    var div = $("<div></div>").addClass("myDivClassHereForStyling");
    var map =   new google.maps.Map(div[0], options);
    return {
        map: map,
        div: div
    }
 }
}

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

google.maps.event.clearInstanceListeners(window);
google.maps.event.clearInstanceListeners(document);

et en cours d'exécution

google.maps.event.clearInstanceListeners(divReference[0]);
divReference.detach()

(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.

5voto

Andrew Leach Points 9279

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 explicitement deleteing toute les écouteurs d'événement.

Il est reconnu comme un bug, mais, et cela peut ne pas fonctionner.

2voto

user2663887 Points 11

Comme 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 la carte.

1voto

Sean Mickey Points 4676

Lorsque vous retirez l' 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 à l' null et que toutes les références à d'autres parties de la carte sont fixés à l' null. À ce point, JavaScript collecte des ordures prendra soin de nettoyer, comme décrit dans: javascript collecte des ordures.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X