Клуб API Карт

как получить координаты метки, чей балун открыт?

d-m-i-g
1 июля 2014, 12:54

Дано:

  • в балун добавил собственную кнопку (balloonContentFooter: '<button id="selectButton">Выбрать адрес</button>')
  • обрабатываю её нажатия так:
    function handleClick(e){
        console.log(e.target.parentNode.parentNode.parentNode.getAttribute('id'));            console.log('TODO: launch rockets');
    }
    myMap.events.add('balloonopen', function (e) {
        selectButton = document.getElementById('selectButton');
        selectButton.addEventListener('click',handleClick,false);
    });
    myMap.events.add('balloonclose', function (e) {
        selectButton.removeEventListener('click',handleClick,false);
    });
  • строка, выделенная жирным, возвращает узел <ymaps id="id_14042040196506445036"...
  • затем пробегаю по списку всех меток и ищу метку, у которой свойство id_14042040196506445036 != undefined

 

Надо: в функции handleClick получить координаты метки, в чьём балуне была нажата кнопка.

Вопрос: есть ли способ лучше/проще, чем сделал я?

 

4 комментария
Подписаться на комментарии к посту
Всеволод Шмыров
1 июля 2014, 14:57
Добрый день.
Лучше не слушать событие "и balloonopen/balloonclose" у карты. Если попытаться открыть балун при другом открытом балуне, то балун не будет переоткрыт. В балуне только лишь обновятся данные.
Чтобы точно отслеживать, что у геообъектов открывается или закрывается балун нужно слушать события на главной коллекции

myMap.geoObjects.events.add(['balloonopen', 'balloonclose'], function (e) {
var target = e.get('target');
e.get('target') - это ссылка на геообъект, у которого был открыт балун.

Подписывайтесь на клик кнопки внутри макета, тогда при клике на кнопку в обработчике вы сможете получить метку, на которой открыт балун.

В этом примере показано, как слушать клик на кнопке внутри балуна http://api.yandex.ru/maps/jsbox/2.1/placemark_balloon_layout

 

Получить ссылку на метку в обработчике клика можно так this.getData().geoObject

(в примере обработчик вызывается не в контексте макета балуна - вам надо вызывать в контексте).

А можно пояснить, что значит: "в примере обработчик вызывается не в контексте макета балуна"?

Функция onCounterClick вызывается без контекста - это означает, что если внутри функции вызвать this, он будет равен window.

Если вызвать обработчик в контексте макета, то this в обработчике будет ссылаться на макет.

Задать контекст функции можно через ymaps.util.bind

var handler = ymaps.util.bind(function () {}, this)