Избегайте зависания при закрытии карты Yahoo с большим количеством маркеров - PullRequest
5 голосов
/ 17 сентября 2008

У меня есть карта Yahoo с множеством маркеров (~ 500). Карта работает достаточно хорошо, пока я не закрою страницу, в этот момент она приостанавливается (в Firefox) и выдает «Прекратить запуск этого сценария?» диалог (в IE7). Если задано достаточно долго, скрипт выполняет свою работу.

Что я могу сделать, чтобы уменьшить эту задержку?

Этот урезанный код демонстрирует проблему:

<script type="text/javascript">
var map = new YMap(document.getElementById('map'));
map.drawZoomAndCenter("Algeria", 17);

for (var i = 0; i < 500; i += 1) {
    var geoPoint = new YGeoPoint((Math.random()-0.5)*180.0, (Math.random()-0.5)*360.0);
    var marker = new YMarker(geoPoint);
    map.addOverlay(marker);
}
</script> 

Мне известны некоторые утечки памяти в обработчиках событий, если вы динамически добавляете и удаляете маркеры, но они статические (хотя проблема может быть связана). О, и я знаю , что такое количество маркеров на карте может быть не лучшим способом передачи данных, но это не тот ответ, который я ищу;)

Редактировать: Следуя предложенному ниже предложению, я попробовал:

window.onbeforeunload = function() {
    map.removeMarkersAll();
}

и

window.onbeforeunload = function() {
    mapElement = document.getElementById('map');
    mapElement.parentNode.removeChild(mapElement);
}

но ни сработало: (

Ответы [ 3 ]

1 голос
/ 13 декабря 2008

Используйте Javascript profiler и посмотрите, какая функция работает медленно. Тогда у вас будет лучшая идея, как сделать обходной путь или, по крайней мере, как удалить дорогостоящую очистку (и позволить ей просочиться в IE6).

0 голосов
/ 21 октября 2008

Вы уверены, что ничто не пытается получить доступ к карте, когда вы закрываете окно?

Я бы сделал этот тип теста:

имеет оболочку для доступа к самой карте и, при выгрузке, имеет доступ к блоку оболочки для самой карты.

0 голосов
/ 17 сентября 2008

Вы можете попробовать удалить все маркеры или даже удалить карту из DOM, используя событие "onbeforeunload".

...