2015-02-13 2 views
1

У меня возникли проблемы с сбором информации о щелкнувших eventListeners.Петля и функции

У меня этот цикл, который строит массив:

myButtonList = document.getElementsByTagName('a'); 
myAnchorList = []; 

for (i=0; i < myButtonList.length;i++) { 
    if (myButtonList[i].getAttribute('class') == 'flagged') { 
     myAnchorList.push(myButtonList[i]); 
    } 
} 

Для каждого <a> введен в myAnchorList массив, я также создать другой массив, хранящий другую информацию из того же тега (Класса и других atrributes).

Вот где я боюсь. Я пытаюсь настроить eventListener, чтобы отправить мне эту информацию при нажатии этих <a>. Но почему-то тот факт, что я создаю функцию (для eventListener) внутри цикла, разбивает все.

for (i=0; i < myAnchorList.length; i++) { 
    myAnchorList[i].addEventListener("click", function(i){ 
     console.log(alpha+' - '+beta[i]+" - "+charlie[i]); 
    }); 
} 

Мои ценности будут либо undefined или какие-то другие ценности, которые будут одинаковыми для каждой кнопки я щелкнул. alpha работает хорошо, поскольку он не зависит от какой-либо итерации цикла, но не от других.

Может ли кто-нибудь увидеть, что я делаю неправильно здесь?

+1

Попробуйте использовать 'myButtonList [I] .className' или' myButtonList [я] .classList.contains ("помеченный") ' –

+2

Другая ошибка у вас есть здесь http://stackoverflow.com/questions/750486/javascript-замыкание-внутри-петли-простой-практический пример –

+0

[1] (http://stackoverflow.com/questions/6968147/passing-parameters-on-event-listeners-with-loops), [2] (http://stackoverflow.com/questions/8909652/adding-click-event-listeners-in-loop) и другие –

ответ

1
for (var i = 0; i < myAnchorList.length; i++) { 
    (function (i) { //Passes i to your function 
     myAnchorList[i].addEventListener("click", function() { 
      console.log(alpha+' - '+beta[i]+" - "+charlie[i]); 
     }); 
    })(i); 
} 
+0

Большое спасибо, работает как шарм, точно так же, как и другие люди, которые мне дали. Ты жжешь ! –

0

Переменная «i» в замыкании, которую вы создали в цикле, всегда будет извлекать последнее значение (myAnchorList.length - 1). Вы не должны создавать замыкание в цикле, и вы можете использовать «фабричный» метод для создания закрытия.

Смежные вопросы