Poiché a quanto pare non puoi davvero distruggere le istanze della mappa, un modo per ridurre questo problema se
- è necessario mostrare più mappe contemporaneamente su un sito web
- il numero di mappe può cambiare con l'interazione dell'utente
- le mappe devono essere nascoste e mostrate nuovamente insieme ad altri componenti (ovvero non compaiono in una posizione fissa nel DOM)
sta mantenendo un pool di istanze della mappa. Il pool tiene traccia delle istanze in uso, e quando viene richiesta una nuova istanza, controlla se qualcuna delle istanze di mappa disponibili è libera: se lo è, ne restituirà una esistente, se non lo è, creerà un nuova istanza della mappa e restituirla, aggiungendola al pool. In questo modo avrai solo un numero massimo di istanze pari al numero massimo di mappe che visualizzi contemporaneamente sullo schermo. Sto usando questo codice (richiede 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
}
}
}
Gli si passano le opzioni della mappa iniziale (come per il secondo argomento del costruttore di google.maps.Map) e restituisce sia l'istanza della mappa (su cui è possibile chiamare funzioni relative a google.maps.Map), sia il contenitore, che puoi applicare lo stile usando la classe "myDivClassHereForStyling" e puoi aggiungere dinamicamente al DOM. Se è necessario ripristinare il sistema, è possibile utilizzare mapInstancesPool.reset (). Reimposta il contatore a 0, mantenendo tutte le istanze esistenti nel pool per il riutilizzo. Nella mia applicazione avevo bisogno di rimuovere tutte le mappe contemporaneamente e creare un nuovo set di mappe, quindi non c'è alcuna funzione per riciclare un'istanza di mappa specifica: il tuo chilometraggio può variare. Per rimuovere le mappe dallo schermo, utilizzo il distacco di jQuery, che non distrugge il contenitore della mappa.
Utilizzando questo sistema e utilizzando
google.maps.event.clearInstanceListeners(window);
google.maps.event.clearInstanceListeners(document);
e in esecuzione
google.maps.event.clearInstanceListeners(divReference[0]);
divReference.detach()
(dove divReference è l'oggetto jQuery del div restituito dal pool di istanze) su ogni div che rimuovo, sono riuscito a mantenere l'utilizzo della memoria di Chrome più o meno stabile, invece di aumentare ogni volta che elimino mappe e ne aggiungo di nuove.