Поскольку JavaScript не имеет области видимости блока, dude
будет ссылаться на последний назначенный элемент (поскольку цикл завершен) при вызове обработчика события. Вы должны capture
ссылка на текущий dude
, например, используя непосредственную функцию:
dude.addEventListener('click', (function(d) {
return function(event) {
gotoProfile(d.id);
}
}(dude)), false);
Это распространенная ошибка при создании функций в цикле.
Но вы можете сделать это еще проще. У объекта event
есть свойство target
, которое указывает на элемент, на котором было возбуждено событие. Так что вы можете просто сделать:
dude.addEventListener('click', function(event) {
gotoProfile(event.target.id);
}, false);
И с учетом вышесказанного вам не нужно добавлять обработчик для каждой кнопки. Поскольку вы делаете то же самое для каждой кнопки, вы можете прикрепить один и тот же обработчик событий выше к родительскому элементу кнопок (или к общему предку), и он все равно будет работать. Вам просто нужно отфильтровать клики, которые не происходят на кнопке:
parent.addEventListener('click', function(event) {
if(event.target.nodeName == 'INPUT' && event.target.type == "button") {
gotoProfile(event.target.id);
}
}, false);