浏览 892 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2008-01-19 关键字: 闭包 动态添加事件
在做动态生成表格时,要对生成的每一行循环加触发事件。结果我的事件总是触发在最后一行。不知道什么原因。
程序如下:
function showTdsysTable(list){
var table=document.getElementById('table1');
//删除除标题和字段行以外的行
for(var row=table.rows.length;row>1;row--){
table.deleteRow(row);
}
for(var i=0;i<list.length;i++){
var m=table.rows.length;
var tr=table.insertRow(m);
if(m%2==0){
tr.style.backgroundColor="#E6F0FF";
}else{
tr.style.backgroundColor="#DBE7F9";
}
tr.style.cursor="pointer";
tr.align="center";
tr.attachEvent("onclick",function(){trOnClick(table,tr)});
tr.attachEvent("onmouseover",function(){trOnMouseOver(tr)});
tr.attachEvent("onmouseout",function(){trOnMouseOut(table,tr)});
var td=tr.insertCell(0);
td.innerHTML="<input type=checkbox name=id value="+list[i].id+" onclick=window.event.cancelBubble=true>";
for(var j=1;j<8;j++){
td=tr.insertCell(j);
eval("td.innerHTML=list["+i+"].tss"+j+";");
}
}
}
希望得到帮助,谢谢! 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-01-19
我做过类似的,不过,事件处理都是加在table上的然后根据event.srcElement来得到事件源对像,然后再做操作。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-01-19
楼主闭包没学好。老问题了。
另外楼上说的方式比较好,这样就不用加那么多的handler,只要一个就可以了。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-01-19
如果不理解闭包就不要用闭包,我是说直接获取所有对象,如果会用闭包再闭包
|
|
| 返回顶楼 | |
|
最后更新时间:2008-01-22
rhf_1983 写道 在做动态生成表格时,要对生成的每一行循环加触发事件。结果我的事件总是触发在最后一行。不知道什么原因。
程序如下:
function showTdsysTable(list){
var table=document.getElementById('table1');
//删除除标题和字段行以外的行
for(var row=table.rows.length;row>1;row--){
table.deleteRow(row);
}
for(var i=0;i<list.length;i++){
var m=table.rows.length;
var tr=table.insertRow(m);
if(m%2==0){
tr.style.backgroundColor="#E6F0FF";
}else{
tr.style.backgroundColor="#DBE7F9";
}
tr.style.cursor="pointer";
tr.align="center";
tr.attachEvent("onclick",function(){trOnClick(table,tr)});
tr.attachEvent("onmouseover",function(){trOnMouseOver(tr)});
tr.attachEvent("onmouseout",function(){trOnMouseOut(table,tr)});
var td=tr.insertCell(0);
td.innerHTML="<input type=checkbox name=id value="+list[i].id+" onclick=window.event.cancelBubble=true>";
for(var j=1;j<8;j++){
td=tr.insertCell(j);
eval("td.innerHTML=list["+i+"].tss"+j+";");
}
}
}
希望得到帮助,谢谢! 代码:
tr.attachEvent("onclick",function(){trOnClick(table,tr)});
tr.attachEvent("onmouseover",function(){trOnMouseOver(tr)});
tr.attachEvent("onmouseout",function(){trOnMouseOut(table,tr)});
引用的tr是函数showTdsysTable中的局部变量,所以当事件触发的时候,这个局部变量是什么,执行的参数就是什么(就是函数showTdsysTable返回前局部变量的值),如果想要达到你要的效果,可以使用:
tr.attachEvent("onclick",function(table,tr){ return function(){trOnClick(table,tr)}}());
也就是再包一层,这样这两个局部变量在内层就被固定下来了。 另外说一句,你的代码如果这样写的话(JS和DOM循环引用),在IE中会出现内存泄漏。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-01-23
这个闭包是离散数学那个闭包吗?
离散数学在字符运算中有价值吗? |
|
| 返回顶楼 | |






