Javascript Onclick与表行

Javascript Onclick与表行,javascript,javascript-events,onclick,Javascript,Javascript Events,Onclick,我的JScript代码有问题。我试图循环表中的所有行,并添加onclick事件。我可以添加onclick事件,但有几个问题 第一个问题是,所有行最终都为onclick事件设置了错误的参数 第二个问题是,它只适用于IE 这是代码摘录 shanesObj.addTableEvents = function(){ table = document.getElementById("trackerTable"); for(i=1; i<table.getElementsByTagName("tr")

我的JScript代码有问题。我试图循环表中的所有行,并添加onclick事件。我可以添加onclick事件,但有几个问题

第一个问题是,所有行最终都为onclick事件设置了错误的参数

第二个问题是,它只适用于IE

这是代码摘录

shanesObj.addTableEvents = function(){
table = document.getElementById("trackerTable");
for(i=1; i<table.getElementsByTagName("tr").length; i++){
    row = table.getElementsByTagName("tr")[i];
    orderID = row.getAttributeNode("id").value;
    alert("before onclick: " + orderID);
    row.onclick=function(){shanesObj.tableRowEvent(orderID);};
}}

shanesObj.tableRowEvent = function(orderID){
alert(orderID);}
shanesObj.addTableEvents=function(){
table=document.getElementById(“trackerTable”);

对于(i=1;i为什么不将事件处理程序附加到表中,并获取在单击处理程序中触发单击事件的单元格的行索引。

在javascript中调用函数时,首先发生的事情是解释器将作用域链设置为定义该函数时的状态。在您的例子中,作用域链像这样的书:

GLOBAL | CAll addTableEvents | CALL onclick 全球的 | 调用addTableEvents | 呼叫onclick 因此,当javascript解释器偶然发现变量orderID时,它会在作用域链中搜索该变量。在onclick函数中没有定义orderID,因此下一步要查看的是addTableEvents。您可能认为orderID是在这里定义的,但由于您没有使用var关键字声明orderID,因此orderID是e是一个全局变量,因此在addTableEvents中找不到orderID。最后一个要查看的点是在global中,确实在那里,它的值是最后一个分配给它的值,在本例中,它是for循环中orderID=row.getAttributeNode(“id”).value;的最后一个值

要更清楚地看到这一点,请查看以下内容

shanesObj.addTableEvents = function(){
table = document.getElementById("trackerTable");
for(i=1; i<table.getElementsByTagName("tr").length; i++){
        row = table.getElementsByTagName("tr")[i];
        orderID = row.getAttributeNode("id").value;
        alert("before onclick: " + orderID);
        row.onclick=function(){var orderID = orderID; shanesObj.tableRowEvent(orderID);};
}
orderID = -1;
}

shanesObj.tableRowEvent = function(orderID){
alert(orderID);
}
shanesObj.addTableEvents=function(){
table=document.getElementById(“trackerTable”);

因为(i=1;iy’再简单不过了!
显然可以与动态生成的行一起使用。
很多爱,
某人


第1行第1单元
第1行第2单元
第2排第3单元
第2排第4单元

谢谢。这非常有效,也帮助我理解了这个问题。另外,这在Firefox和IE中确实有效,因为代码已经更正。再次感谢!请注意添加一些让我吃惊的东西:如果您定期生成表,例如通过定期AJAX轮询,请不要忘记重新添加侦听器同样,如果你看的是'td',索引似乎需要从0开始-不确定'tr'也是这样。
for(i=1; i<table.getElementsByTagName("tr").length; i++){
        row = table.getElementsByTagName("tr")[i];
        row.onclick=function(){shanesObj.tableRowEvent(this.id);};

}
<html>

<head>
<title></title>
<script language="JavaScript" type="text/javascript">
<!--
var TO,URL;
function Link(url){
 URL=url;
 TO=setTimeout('window.location=URL;',500);
}
//-->
</script>
</head>

<body>

<tr onclick="Link('anotherpage.html');">
<td>row1 cell1</td>
<td>row1 cell2</td>
</tr>

<tr onclick="Link('yetanotherpage.html');">
<td>row2 cell3</td>
<td>row2 cell4</td>
</tr>

</body>

</html>