Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Циклическая регистрация событий и передача значений функции (https://javascript.ru/forum/events/14103-ciklicheskaya-registraciya-sobytijj-i-peredacha-znachenijj-funkcii.html)

JackScore 29.12.2010 17:24

Циклическая регистрация событий и передача значений функции
 
Вот упрощенный кейс моей задачи (и проблемы):
  • создать список ссылок
  • создать список параграфов (тескта)
  • циклом добавить каждой из ссылок слушателя события по нажатию
  • вызвать функцию для произошедшего события, которая "добудет" содержимое соответствующего ссылке параграфа
Вот код, который работает некорректно:
window.onload = function() {
    for (var i=0; i<5; i++) {
        document.write('<a href="#">Link_' + i + '</a><br/>');
    }
    
    document.write('<hr/>');
    
    for (var i=0; i<5; i++) {
        document.write('<p>Text_' + i + '</p><br/>');
    }

    var links = document.getElementsByTagName('a');
    var texts = document.getElementsByTagName('p');

    /*
    for (var i=0; i<links.length; i++) {
        links[i].addEventListener('click',function() {display(texts[i].innerHTML);},false) 
    }
    */
    
    for (var i=0; i<links.length; i++) {
        var temp = texts[i].innerHTML;
        links[i].addEventListener('click',function() {display(temp);},false)
    }

    function display(text) {
        alert(text);
    }
}
Проблема:
Если использовать закоменченный кусок кода,
for (var i=0; i<links.length; i++) {
    links[i].addEventListener('click',function() {display(texts[i].innerHTML);},false) 
}
то javascript ругнется на то, что texts[i] - undefined
Если использовать
for (var i=0; i<links.length; i++) {
    var temp = texts[i].innerHTML;
    links[i].addEventListener('click',function() {display(temp);},false)
}
то на все ссылки будет повешена функция display с аргументом texts[i=4].

Вопрос:
Как можно, не меняя ничего координально в коде (т.к. это уже упрощенный случай реального кода), добиться поставленной задачи (см. выше)?

Спасибо заранее!

Sweet 29.12.2010 17:52

Поздравляю! Вы наступили на грабли:)

JackScore 29.12.2010 18:58

что я неправильно понял(?):
for (var i=0; i<links.length; i++) {
    var func = function() {
        return texts[i];
    };
    links[i].addEventListener('click',function() {display(func);},false)
}

Sweet 29.12.2010 19:18

Цитата:

Сообщение от JackScore
что я неправильно понял

Очевидно, что многое:) Заработало бы вот так:
for (var i=0; i<links.length; i++) {
    links[i].addEventListener('click',(function(x) { return function() { display(texts[x]); }; })(i),false)
}

JackScore 29.12.2010 19:32

Цитата:

Сообщение от Sweet
Заработало бы вот так:

спасибо большое! и правда работает так! =)


Часовой пояс GMT +3, время: 21:50.