i
в function(){handleRowClick(i);}
является переменной цикла i
. Когда функция вызывается, цикл завершается долго и i
содержит последнее значение, которое было сделано в конце цикла, не значение, которое оно удерживало при создании function(){}
.
Это проблема замкнутого цикла. См. этот вопрос для решений, использующих замыкания или Function#bind
:
row.addEventListener('click', handleRowClick.bind(window, i), false);
Однако в данный момент вы не используете этот i
. Было бы проще сказать:
row.addEventListener('click', handleRowClick, false);
, а затем используйте this
, чтобы получить строку:
function handleRowClick(){
window.open(this.cells[1].innerHTML);
}
(Примечание: к сожалению, если вы добавите attachEvent
резервную копию для поддержки IE <= 8, она не получится правильной <code>this, поэтому вы все равно будете смотреть на замыкания / привязки, чтобы получить объект, который вы хочет.)
также:
for(i =0; i<dataStructure.length; i++){
Отсутствует var
: i
- это случайный глобал.
row.setAttribute('id', i);
Избегайте getAttribute
/ setAttribute
в документах HTML. Они не делают то, что должны в IE. Вместо этого используйте HTML-свойства DOM Level 2, они более надежны и удобочитаемы: row.id= i
.