Клуб API Карт

Неожиданное событие

dmitry-legend
17 июня 2010, 17:32
Всем привет.

А как-то можно остановить событие от продвижения по слоям объектов? Вот в примере я создаю метку. Внутри ее балуна кнопка, удаляющая метку. При нажатии на эту кнопку метка удаляется, а потом я внезапно получаю событие клика по карте.

Это само по себе не очень логично, поскольку я не кликал по карте. Но этого можно было бы избежать методом типа preventDefault(). Однако, и его я не вижу. Что делать?
window.onload = function () {
        map = new YMaps.Map(YMaps.jQuery("#map_canvas")[0]);

        map.setCenter(new YMaps.GeoPoint.fromString('37.486636,55.737319'), 12);

        // При клике по карте получаем алерт
        YMaps.Events.observe(map, map.Events.Click, function() { alert('click!'); });

        // Создаем метку с кнопкой удаления внутри
        Mark = new YMaps.Placemark(new YMaps.GeoPoint.fromString('37.486636,55.737319'));
        Mark.setBalloonContent('<input onclick="remove_mark();" type="button" value="Удалить">');
        map.addOverlay(Mark);
}

function remove_mark() {
        map.removeOverlay(Mark);
}
7 комментариев
Подписаться на комментарии к посту

Добавьте в функцию remove_mark "return false". Должно помочь.



function remove_mark() {
    map.removeOverlay(Mark);
    return false;
}

Не помогло.

Лучше вот так:


var content = YMaps.jQuery('')
    .bind("click", function () {
        map.removeOverlay(Mark);
        return false;
    });

Mark.setBalloonContent(content[0]);

Ага, работает. Не знаком с jQuery - проблема в том, что в API карт события работают как-то через jQuery и вступают в конфликт с событиями повешенными  напрямую на DOM?

Необязательно использовать jQuery:



var content = document.createElement("input");
content.type = "button";
content.value = "Удалить";

content.onclick = function (e) {
    e = e || window.event;
   
    map.removeOverlay(Mark);
    (new YMaps.MouseEvent(e, map)).preventMapEvent();
}

Mark.setBalloonContent(content);
map.addOverlay(Mark);

Спасибо!


(Вчера ночью наконец увидел preventMapEvent() ;) )

                function remove_mark() {


                        window.setInterval(function() { map.removeOverlay(Mark); }, 300);


                }



Работает, но это изврат. А кроме того, не факт, что за 300мс (при каких-то, правда, довольно экстремальных условиях) проблема успеет исчезнуть.


Сделайте с этим что-нибудь приличное, пожалуйста.