Поскольку очевидно, что вы не можете действительно уничтожить экземпляры карты, способ уменьшить эту проблему, если
- нужно показать на сайте сразу несколько карт
- количество карт может измениться при взаимодействии с пользователем
- карты должны быть скрыты и повторно показаны вместе с другими компонентами (т.е. они не отображаются в фиксированной позиции в DOM)
хранит пул экземпляров карты. Пул отслеживает используемые экземпляры, и когда он запрашивает новый экземпляр, он проверяет, свободен ли какой-либо из доступных экземпляров карты: если это так, он вернет существующий, если нет, он создаст новый экземпляр карты и верните его, добавив в пул. Таким образом, у вас будет только максимальное количество экземпляров, равное максимальному количеству карт, которые вы когда-либо одновременно отображали на экране. Я использую этот код (требуется 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
}
}
}
Вы передаете ему начальные параметры карты (согласно второму аргументу конструктора google.maps.Map), и он возвращает как экземпляр карты (на котором вы можете вызывать функции, относящиеся к google.maps.Map), так и контейнер, который вы можете стилизовать, используя класс «myDivClassHereForStyling», и вы можете динамически присоединяться к DOM. Если вам нужно перезагрузить систему, вы можете использовать mapInstancesPool.reset (). Он сбросит счетчик на 0, сохраняя при этом все существующие экземпляры в пуле для повторного использования. В моем приложении мне нужно было удалить все карты сразу и создать новый набор карт, поэтому нет функции для переработки конкретного экземпляра карты: ваш пробег может отличаться. Чтобы удалить карты с экрана, я использую функцию отсоединения jQuery, которая не разрушает контейнер карты.
Используя эту систему и используя
google.maps.event.clearInstanceListeners(window);
google.maps.event.clearInstanceListeners(document);
и бег
google.maps.event.clearInstanceListeners(divReference[0]);
divReference.detach()
(где divReference - это объект jQuery div, возвращаемый из пула экземпляров) на каждом удаляемом div мне удалось сохранить более или менее стабильное использование памяти Chrome, в отличие от его увеличения каждый раз, когда я удаляю карты и добавляю новые.