Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.12.2010, 17:24
Новичок на форуме
Отправить личное сообщение для JackScore Посмотреть профиль Найти все сообщения от JackScore
 
Регистрация: 01.10.2010
Сообщений: 7

Циклическая регистрация событий и передача значений функции
Вот упрощенный кейс моей задачи (и проблемы):
  • создать список ссылок
  • создать список параграфов (тескта)
  • циклом добавить каждой из ссылок слушателя события по нажатию
  • вызвать функцию для произошедшего события, которая "добудет" содержимое соответствующего ссылке параграфа
Вот код, который работает некорректно:
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].

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

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

Последний раз редактировалось JackScore, 29.12.2010 в 17:46.
Ответить с цитированием
  #2 (permalink)  
Старый 29.12.2010, 17:52
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Поздравляю! Вы наступили на грабли
Ответить с цитированием
  #3 (permalink)  
Старый 29.12.2010, 18:58
Новичок на форуме
Отправить личное сообщение для JackScore Посмотреть профиль Найти все сообщения от JackScore
 
Регистрация: 01.10.2010
Сообщений: 7

что я неправильно понял(?):
for (var i=0; i<links.length; i++) {
    var func = function() {
        return texts[i];
    };
    links[i].addEventListener('click',function() {display(func);},false)
}
Ответить с цитированием
  #4 (permalink)  
Старый 29.12.2010, 19:18
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

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

Последний раз редактировалось Sweet, 29.12.2010 в 19:21.
Ответить с цитированием
  #5 (permalink)  
Старый 29.12.2010, 19:32
Новичок на форуме
Отправить личное сообщение для JackScore Посмотреть профиль Найти все сообщения от JackScore
 
Регистрация: 01.10.2010
Сообщений: 7

Сообщение от Sweet
Заработало бы вот так:
спасибо большое! и правда работает так! =)

Последний раз редактировалось JackScore, 29.12.2010 в 19:45.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача значений полей через JS MCTrane Общие вопросы Javascript 11 01.12.2010 18:32
Передача массива значений флажков LRCenter Общие вопросы Javascript 2 05.10.2010 19:49
Передача значений из iframe в тело страницы z00m Общие вопросы Javascript 7 01.05.2009 17:20
Передача значений в функцию Destrifer Общие вопросы Javascript 2 29.11.2008 17:46
Вызов событий из js функции Destrifer Общие вопросы Javascript 5 29.11.2008 15:28