Клуб API Карт

Как в блоке заменить карту без артефактов?

larion
17 января 2011, 23:53

Реализован следующий алгоритм: при выборе города из списка загрузкой по требованию подгружается соответствующая карта. При этом часть элементов (шкала масштаба, копирайт) от предыдущей карты остается, что выглядит не очень хорошо. Посмотреть можно здесь: http://vilina.ru/plug.php?e=contacts.

Вопрос: как избавиться от этого эффекта? Метод для удаления карты destructor() не помог - карты вообще не загружаются.

4 комментария
Подписаться на комментарии к посту
Двигать карту религия не позволяет?

map.setCenter(...)
placemark.setGeoPoint(....)



Вариант 2
Строку
var map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]);

меняем на
var map = new YMaps.Map(YMaps.jQuery("#YMapsID").html('')[0]);


тоесть чистим дивчик перед стартом

Спасибо, помогло, сам не додумался :-)
thekashey подсказал очень короткое решение, однако не самое лучшее. Если таким образом очищать контейнер, то память будет засоряться javascript'ыми объектами, а это не очень хорошо.

Лучше вынести переменную map в глобальную область видимости (стереть во всех обработчиках ключевое слово var) и в каждом обработчике в самом начале написать вот такое условие:

if (map) {
    map.destroy();
    map = null;
}

А лучше воспользоваться советом Соломатина Андрея и не удалять и создавать карту каждый раз, а смещать центр и метку.
В этом случае вам нужно будет создать только одну функцию. Типа такой:

var map, placemark;function loadMap(options) {
    if (!map) {
        map = new YMaps.Map(YMaps.jQuery("#YMapsID"));
        map.addControl(new YMaps.Zoom());
        placemark = createObject("Placemark", options.point.coord, "constructor#pmrdlPlacemark", options.point.name);
        map.addOverlay(placemark);
    } else {
        placemark.setGeoPoint(options.point.coord);
        placemark.name = options.point.name;
        placemark.update;       
    }
    map.setCenter(options.center, options.zoom);
}

Опции ей передавать такие (для Москвы):

var options = {
    center : ew YMaps.GeoPoint(37.531265,55.918251),
    zoom : 11,
    point : {
        coord : new YMaps.GeoPoint(37.535385,55.956406),
        name : "ООО «Вилина» (представительство)",
    }
}

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