论坛首页 AJAX版 JavaScript

关于闭包和循环加触发事件问题

浏览 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+";");
	   }
	}
}
 
 

希望得到帮助,谢谢!
   
最后更新时间:2008-01-19
我做过类似的,不过,事件处理都是加在table上的然后根据event.srcElement来得到事件源对像,然后再做操作。
   
0 请登录后投票
最后更新时间:2008-01-19
楼主闭包没学好。老问题了。

另外楼上说的方式比较好,这样就不用加那么多的handler,只要一个就可以了。
   
0 请登录后投票
最后更新时间:2008-01-19
如果不理解闭包就不要用闭包,我是说直接获取所有对象,如果会用闭包再闭包
   
0 请登录后投票
最后更新时间: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中会出现内存泄漏。
   
0 请登录后投票
最后更新时间:2008-01-23
这个闭包是离散数学那个闭包吗?
离散数学在字符运算中有价值吗?
   
0 请登录后投票
论坛首页 AJAX版 JavaScript

跳转论坛:
JavaEye推荐