Ponieważ najwyraźniej nie można naprawdę zniszczyć instancji mapy, sposobem na zmniejszenie tego problemu jest, jeśli
- musisz wyświetlić kilka map jednocześnie na stronie internetowej
- liczba map może się zmieniać w zależności od interakcji użytkownika
- mapy muszą być ukryte i ponownie pokazane razem z innymi komponentami (tj. nie pojawiają się w ustalonej pozycji w DOM)
zachowuje pulę instancji map. Pula śledzi używane instancje, a gdy zażąda nowej instancji, sprawdza, czy któraś z dostępnych instancji mapy jest wolna: jeśli tak, zwróci istniejącą, jeśli nie, utworzy nową instancję mapy i zwróć ją, dodając ją do puli. W ten sposób będziesz mieć tylko maksymalną liczbę instancji równą maksymalnej liczbie map, które kiedykolwiek pokażesz jednocześnie na ekranie. Używam tego kodu (wymaga 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
}
}
}
Przekazujesz mu początkowe opcje mapy (zgodnie z drugim argumentem konstruktora google.maps.Map) i zwraca on zarówno instancję mapy (na której można wywoływać funkcje dotyczące google.maps.Map), jak i kontener, który możesz stylizować za pomocą klasy „myDivClassHereForStyling” i możesz dynamicznie dołączać do DOM. Jeśli chcesz zresetować system, możesz użyć mapInstancesPool.reset (). Zresetuje licznik do 0, zachowując wszystkie istniejące instancje w puli do ponownego wykorzystania. W mojej aplikacji musiałem usunąć wszystkie mapy naraz i utworzyć nowy zestaw map, więc nie ma funkcji recyklingu określonej instancji mapy: Twój przebieg może się różnić. Aby usunąć mapy z ekranu, używam detach jQuery, które nie niszczą kontenera mapy.
Korzystając z tego systemu i używając
google.maps.event.clearInstanceListeners(window);
google.maps.event.clearInstanceListeners(document);
i bieganie
google.maps.event.clearInstanceListeners(divReference[0]);
divReference.detach()
(gdzie divReference to obiekt jQuery div zwrócony z puli instancji) na każdym usuwanym elemencie div udało mi się utrzymać mniej więcej stabilne użycie pamięci Chrome, w przeciwieństwie do zwiększania się za każdym razem, gdy usuwam mapy i dodawałem nowe.