Клуб API Карт

Навесить обработчик в цикле

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

Необходимо навесить обработчик в функции создания метки.

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

Что не так в коде, подскажите, пожалуйста. Или подскажите как вообще такое реализовать, если таким образом не возможо.


function createPlacemark (geoPoint, name, desk) {
  var placemark = new YMaps.Placemark(geoPoint);
  placemark.name = name;

  var content = YMaps.jQuery([desk].join(""))
  for ( var i = 0; i<10; i++){
  .find("#" + i)
  .bind("click", function () {
  if (group.getMap()) {map.addOverlay(group1.get(i));
  } else {
  alert(i);
  }
  return false;
  })
  .end()
  }
placemark.setBalloonContent(content[0]);
   

  return placemark;
  };


 

 Вот ссылка на полную версию кода.

 

6 комментариев
Александр Новиков
28 января 2016, 07:54
Вот это .find "висящее в воздухе" не есть хорошо. Да и вообще весь код и вся концепция вызывают кучу вопросов...

Теперь .find не "висит в воздухе", но цикл не работает.

 

var content = YMaps.jQuery([desk].join(""))
  for ( var i = 0; i  content.find("#" + i)
  .bind("click", function () {
  if (group.getMap()) {map.addOverlay(group1.get(i));
  } else {
  alert(i);
  }
  return false;
  })
  .end()
  }
placemark.setBalloonContent(content[0]);

 

Пробовал и чтобы .bind и .end не висело в воздухе, но все равно не работает. Переменная передается, а цикл НЕ РАБОТАЕТ!!!

Пмогите, понять в чем дело!

Александр Новиков
28 января 2016, 07:54
Еще один косячок у вас с id для ссылок. Не может id быть цифровым. Naming rules: * Must begin with a letter A-Z or a-z * Can be followed by: letters (A-Za-z), digits (0-9), hyphens ("-"), underscores ("_"), colons (":"), and periods (".") * Values are case-sensitive Вот отсюда взято: http://www.w3schools.com/tags/att_standard_id.asp Не знаю логики вашего приложения, но по мне проще либо сразу ставить обработчики в тег a - либо динамически формировать контент для балуна и при этом уже делать bind обработчиков.
Не совсем понял вашу задачу, однако, при навешивании обработчиков в цикле необходимо использовать замыкание, в противном случае все обрабочтики будут использвать последний индекс из цикла, т. е. 10.

Сделать это можно так:
function createPlacemark (geoPoint) {
    var placemark = new YMaps.Placemark(geoPoint),
        content = YMaps.jQuery("");

    for (var i = 0; i < 10; i++) {

        (function (i) {
            YMaps.jQuery('' + i + '')
                .bind("click", function () {
                    alert(i);
                    return false;
                })
                .appendTo(content);
        })(i);
    }

    placemark.setBalloonContent(content[0]);

    return placemark;
}
В данной функции создается 10 ссылок, при клике на каждую из которых будет отображаться сообщение с ее номером.

Расскажите поподробнее о назначении функции createPlacemark. Какие действия должны быть в ней выполнены и какой результат должен быть получен? Я постараюсь помочь.

Саша, спасибо!

С Вашей помошью все получилось.

 

Подробнее о функции:

В функции создается метка с контентом в котором несколько ссылок на разные маршруты. Т.е.:

Есть 100 остановок(метка)

Есть 20 маршрутов(линия)

Через каждую остановку проходит, предположим, 5 разных маршрутов, которые должны открываться при клике на ссылку с номером маршрута в балуне остановки.

 

 

хехе. khab.info мой домен был лет 5 назад)) потом не продлил его и он ушел в небытие(