Клуб API Карт

Не срабатывает click событие

pdapnz
29 апреля 2015, 16:46

Использую click событие на балуне для ajax загрузки содеримого балуна:

    objectManager.objects.events.add('click', function (e) {
        console.log(e);
        var objectId = e.get('objectId');
        if (hasBalloonData(objectId)) {
            objectManager.objects.balloon.open(objectId);
        } else {
            var obj = objectManager.objects.getById(objectId);
            obj.properties.balloonContent = 'Идет загрузка';
            objectManager.objects.balloon.open(objectId);
            loadBalloonData(objectId).then(function (data) {
                obj.properties.balloonContent = data;
                objectManager.objects.balloon.setData(obj);
            });
        }
    });

 

Почему-то событие не генерируется если метки имеюют одинаковые координаты, выводится такой общий балун с вкладками и соотв-но ничего не подгружается при щелчках по названиям меток.

 

https://yadi.sk/i/aaOfZDXUgKyyY

5 комментариев
Всеволод Шмыров
29 апреля 2015, 17:01
Добрый день. Не совсем вас понял. Вы слушаете клик не на балуне, а на objectManager.objects. чтобы слушать события на кластерах нужно использовать другую коллекцию https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/ObjectManager-docpage/#clusters

Да все верно я слушаю клик на objectManager.objects.

Вариант с кликом на кластере тоже не работает. Клик срабатывает пока возможно приближение карты. Когда масштаб максимальный становится появляется балун, как я привел картике (https://yadi.sk/i/aaOfZDXUgKyyY)  и я  перещёлкиваю заголовки меток в балуне, то click не генерируется ни для кластера, ни для балуна. И непонятно что с этим делать.

 

Еще я пробовал с другого бока решить проблему. Делать небольшое смещение координат, но чтобы они выходили из кластера при максимальном масштабе нужно слишком уж большое смещение задавать, и получается метка оказывается на соседнем доме. Либо отключать кластеризацию, но весь смысл тогда теряется. Начинает жутко тормозить карта.

 

Проблему удалось решить только созданием собственного макета балуна для кластера и навешенивание click событий на его элементы.

Помог вот этот пример:

https://tech.yandex.ru/maps/jsbox/2.1/cluster_custom_balloon_content_layout_21

 


// Создаем собственный макет с информацией о выбранном геообъекте.
var customBalloonContentLayout = ymaps.templateLayoutFactory.createClass([
        '

    ',
            // Выводим в цикле список всех геообъектов.
            '{% for geoObject in properties.geoObjects %}',
                '
  • {{ geoObject.properties.hintContent|raw }}
  • ',
            '{% endfor %}',
            '
'
    ].join(''));


jQuery(document).on( "click", "a.custom_list_item", function() {
    jQuery(".custom_list_item").css("background-color", "white");
    jQuery(this).css("background-color", "#cccccc");
    $.ajax({
        url: "/ajax/getmarker?id="+jQuery(this).data().id
    }).done(function(data) {
            jQuery(".custom_baloon_content").html(data);
    });
});


var myMap = new ymaps.Map('map', {
        center: [55.76, 37.64],
        zoom: 10
    }),
    objectManager = new ymaps.ObjectManager({
        // Мы хотим загружать данные для балуна перед открытием, поэтому
        // запретим автоматически открывать балун по клику.
        geoObjectOpenBalloonOnClick: false,
        clusterize: true,
        gridSize: 52,
        clusterBalloonContentLayout: customBalloonContentLayout
    });


Разработчики API, подскажите где можно посмотреть дефотлные шаблоны балунов кластера. Я сделал свой, но хотелось бы попробовать использовать например cluster#balloonCarousel или cluster#balloonAccordion с небольшими изменениями.