Клуб API Карт

Добавление событий в control.ListBox

YATITTYTWISTER
2 августа 2014, 06:21

Здравствуйте!

Только недавно изучаю JavaScript и апи яндекс карт. 

 

Для добавления событий листбоксу я использую вот  это:

myListBox.get(0).events.add('click', function () {//сделать что-нибудь});

myListBox.get(1).events.add('click', function () {//сделать что-нибудь});

И так далее для каждого элемента в листбоксе. Так как я использую одну функцию для всех кликов, хочется сделать код короче и не лепить подряд одно и то же.

 

Вопрос 1: возможно ли добавлять события циклом? Следующий код у меня не работает:

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

    myListBox.get(i).events.add('click', function () {

        console.log(i);  //при клике на любой элемент возвращает последнее значение i

    });

}

 

Вопрос 2: если вариант с циклом не работает, как можно отдельно описать функцию? Пробовал вот так:

function listBoxItemClicked(i){

    console.log(i); //просто возвращает ноль; листбокс не реагирует на клики

}

myListBox.get(0).events.add('click',listBoxItemClicked(0));

 

Спасибо!

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

Конечно добавлять каждому элементу отдельный обработчик не надо. Используйте event delegation

Слушайте событие на листбоксе, а конкретный item получайте из объекта-события (поле "target")

http://api.yandex.ru/maps/jsbox/2.1/list_box_layout

 

Вопрос 1.

Все правильно, ваш цикл уже отработает к моменту, когда произойдет клик и индекс (i) будет равен длине массива.

Чтобы связать обработчик события с нужным индексом, код добавления слушателя надо "обернуть" в замыкание. Про замыкания можно прочитать, например, на javascript.ru

 

2. Ваша функция выводит в консоль то что ей передали в параметрах, вы передаете в метод add не функцию, я результат ее вызова с параметром "0". Далее результат вызова функции – undefined регистрируется как обработчик для клика. Похоже вы ерунду полную написали, прочитайте все-таки что-нибудь про Javascript.

Бывает и ерунду пишу:) Спасибо, понял как надо!