Клуб API Карт

Не срабатывает событие balloon open api 2.1

Кирилл Иванов
11 апреля 2014, 14:00

map.balloon.events

    .add('close', function(){

        alert('close')

    })

    .add('open', function(){

        alert('open')

    })

    

Шаги для воспроизведения:

1. Есть карта с несколькими метками

2. Кликаем на метку видим балун видим alert('open')

3. Кликаем на следующую метку, над ней открывается балун, но события close и open не срабатывают.

4. Закрываем балун, срабатывает событие close.

 

Таким образом close срабатывает только если балун закрывается вручную. Событие open срабатывает только если ни один балун на карте не открыт. 

Как мне отследить эти события?

9 комментариев
Подписаться на комментарии к посту

map.events.add(['balloonopen', 'balloonclose'], function (e) { ... });

Поможет?

Кирилл Иванов
14 апреля 2014, 10:06

Пробовал. Поведение аналогичное.

будем разбираться,

спасибо за сообщение

Кирилл Иванов
15 апреля 2014, 16:02

Уважаемые разработчики, прошу скорее исправить эту проблему. Думаю можно расценивать ее как критичную. Я не могу сделать интерфейс по ТЗ так как не имею никакой возможности следить за статусом балуна.

Все объекты на моей карте расположены в кластере. 

Пытаюсь делать что-то типа

    clusterer.events.add('click', function(e1){

        if(map.balloon.isOpen())

            map.balloon.close();

        var geoObject = e1.get('target'),

             geoObjectState = clusterer.getObjectState(geoObject);

        if (geoObjectState.isClustered){

            clusterer.balloon.open(geoObjectState.cluster);

        } else {

            geoObject.balloon.open();

        }

    })

 

Но все это работает плохо и выглядит убого. Одна из проблем, когда закрывается балун ClusterPlacemark событие close не срабатывает. 

clusterer.balloon.events

        .add('open', function(){

            console.log('open');

        })

        .add('close', function(){

            console.log('close');

        })

Не хочу больше бороться с этим с помощью костылей. Надеюсь на скорое решение проблемы.

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

 

Код обработчика события "click" мне не понятен, скажите, пожалуйста, что именно вы хотите сделать, какую задачу решаете?

Кирилл Иванов
16 апреля 2014, 06:59

Задача довольно проста. Нужно при клике по соответствующему маркеру подсвечивать соответствующий элемент в списке, который находится рядом с картой. 

    map.events

        .add('balloonopen', function (e1) {

            e1.get('target').$content.addClass('hover');

        })

        .add('balloonclose', function (e1) {

            e1.get('target').$content.removeClass('hover');

        })

Код обработчика события "click"  - это попытка  вручную закрывать и открывать балун при клике на метку. Костыль, безусловно.

Я, наверное, неправильно понял смысл событий open/close. Меня сбило с толку наличие события userclose. Т.е раз есть userclose срабатывает при клике на крестик, то close срабатывает при смене балуна. 

 

Наверное, будет правильнее решить эту задачу с использованием события click. Однако, были бы не лишними события, срабатывающие при смене позиции балуна.

 

Вам надо слушать на кластеризаторе события balloonopen и balloonclose, все будет работать так, как вы ожидаете. При открытии балуна на другом объекте будет кидаться пара событий balloonclose/balloonopen

Прошло 2 года, а проблема до сих пор есть...


Есть решение хоть какое-то?
Событие balloonopen не срабатывает второй раз, пока не закроешь вручную балун...
sanek136,
выше уже есть ответ по этому вопросу. В контексте карты балун не был закрыт и открыт заново, а сменил владельца, поэтому событие не срабатывает.
Если у Вас есть другой сценарий использования, где логика кажется ошибочной, пожалуйста, соберите пример на jsfiddle.