Javascript addEventListener将调用方作为参数传递

Javascript addEventListener将调用方作为参数传递,javascript,javascript-events,Javascript,Javascript Events,我有以下代码。我的问题是,单击时,事件正在触发,但传递的参数不正确。它正在传递最后一个动态创建的行,即dataStructure.length值。有人知道如何解决这个问题吗 var table = document.getElementById('output'); for(i =0; i<dataStructure.length; i++){ var row = document.createE

我有以下代码。我的问题是,单击时,事件正在触发,但传递的参数不正确。它正在传递最后一个动态创建的行,即dataStructure.length值。有人知道如何解决这个问题吗

        var table = document.getElementById('output');                  

        for(i =0; i<dataStructure.length; i++){
            var row = document.createElement('tr');
            row.setAttribute('id', i);
            var url = dataStructure[i].url;

            if(document.addEventListener)
                row.addEventListener('click', function(){handleRowClick(i);}, false);
            var obj = dataStructure[i];
            var cellCount = 0;
            for(field in obj){
                var cell = document.createElement('td');
                cell.setAttribute('id', cellCount++);
                //cell.addEventListener('click', function(){window.open(dataStructureObj.links[i].url);}, false);
                cell.innerHTML = obj[field];
                row.appendChild(cell);
            }
            cellCount = 0;
            table.appendChild(row);
        }           
        }

        function handleRowClick(rowClicked){
            var rowHTML = rowClicked.innerHTML;
            var cells = rowHTML.getElementsByTagName('td');
            for(cell in cells)
            {
                alert(cell.value);
            }
            window.open(cells[1].innerHTML); 
        }
var table=document.getElementById('output');

对于
函数(){handleRowClick(i);}
中的(i=0;i
i
是循环变量
i
。调用函数时,循环长时间结束,
i
保存在循环结束时保存的最后一个值,而不是创建
函数(){/code>时保存的值

这就是闭包循环问题。有关使用闭包或
函数#bind
的解决方案,请参阅:

row.addEventListener('click', handleRowClick.bind(window, i), false);
但是,您目前并没有真正使用该
i
。可以更容易地说:

row.addEventListener('click', handleRowClick, false);
然后使用
检索行:

function handleRowClick(){
    window.open(this.cells[1].innerHTML);
}
(旁注:不幸的是,如果您添加
attachEvent
备份以支持IE
    for(i =0; i<dataStructure.length; i++){
        row.setAttribute('id', i);