Клуб API Карт

Как обратиться к метке, которая была нажата? если меток много.

Пост в архиве.

Метки отображаются из БД через запрос:

 

$.getJSON("vivodpointsmap.php",

function(json){ 

for (i = 0; i < json.markers.length; i++) {

myPlacemark[i] = new ymaps.Placemark([json.markers[i].lat,json.markers[i].lon], {

                        //стандартный код


myMap.geoObjects.add(myPlacemark[i]);

}

});


Пробывал внутри цикла вот так:

myPlacemark[i].events.add('click', function (e) { 

alert(json.markers[i].id);  

});

 

не работает (само событие срабатывает, проверял) видимо по причине того, что цикл заканчивается, а в событие click счетчик цикла не попадает

 

(сам код получения всех полей из БД рабочий, не могу только обработать событие клик по метке. мне это нужно для того,что бы передать id в другой скрипт, который будет работать с БД вне карты.)


6 комментариев
Почитайте про замыкания в javascript
Ваш цикл отработает раньше чем случится событие, при этом "i" будет внутри всех обработчиков одним и тем же = json.markers.length (значение на момент выхода из цикла)

Используйте делегирование событий – одного обработчика на коллекции достаточно, не нужно навешиваться на каждую метку

спасибо за ответ.

 

>>>Ваш цикл отработает раньше чем случится событие, при этом "i" будет внутри всех обработчиков одним и тем же = json.markers.length (значение на момент выхода из цикла)

это вы правы, так и есть


>>>Используйте делегирование событий – одного обработчика на коллекции достаточно, не нужно навешиваться на каждую метку

переменная для задания метки создана в виде массива как раз в попытках добиться результата. это не принципиально.

и все таки, как передать поле id из БД по клику на метке? 

 

переменная для задания метки создана в виде массива

Зачем нужна эта переменная-массив myPlacemark?

 

Я вам написал про делегирование, навешивать обработчик надо на myMap.geoObjects, а не на каждую метку по отдельности

 

спасибо за ответ.

 

я же говорю, это не принципиально, могу переделать просто на myPlacemark. без массива.

Но вопрос остается открытым - как считать, какая именно метка была нажата? с каким id? если этот id я получаю из БД mysql в вышеописанном цикле :

.getJSON("vivodpointsmap.php",

function(json){ 

for (i = 0; i < json.markers.length; i++) {

myPlacemark[i] = new ymaps.Placemark([json.markers[i].lat,json.markers[i].lon], { 

т.е. из пхп скрипта у меня уже есть js переменная с этим id - json.markers[i].id

как мне ее дальше передать,если обработать событие клика я не могу?

 

если это невозможно, то может быть подскажете другой способ извлечения из mysql ? 

 

Почему невозможно? Второй параметр в конструкторе метки как раз может содержать произвольные пользовательские данные.

function(json) {

    for (i = 0; i < json.markers.length; i++) {

        myMap.geoObjects.add(new ymaps.Placemark(

      [json.markers[i].lat, json.markers[i].lon], {

                id: json.markers[i].id

            }));

    }

    myMap.geoObjects.events.add('click', function(e) {

        var target = e.get('target'),

            id = target.properties.get('id');

        console.log(id);

    });

}

большое спасибо! это именно то, что мне нужно!