标题: [求助] js循环创建添加事件,值不正确
pblover
小虫
Rank: 1



UID 78912
精华 0
积分 11
帖子 6
威望 6
阅读权限 10
注册 2007-11-15
状态 离线
 
发表于 2007-12-3 20:48  资料  个人空间  短消息  加为好友 
js循环创建添加事件,值不正确

请教一下,我用循环创建了LI,然后我在创建LI后再在每个LI上添加事件,然而,每次触发事件事,得到的总是最后一个事件的值,请教有什么好的方法可以解决,在线等谢谢!!!

addRoom:function()
{
  var self = this;
  var amount = 3;
  var roomMemberList = new Array();
  // validate
  /* if(getRoomList().length < 60)
   {
    amount = getRoomList().length;
   }
  */
  // create room list array
  this.LIRoomList = new Array();
  // add room to list
  for(i = 0; i < amount; i++){
   // create room list li
   eval('this.LIRoomList[' + i + '] = document.createElement("li");');
   eval('this.LIRoomList[' + i + '] .className = "LI_Room_List"; ');
   eval('this.LIRoomList[' + i + '].id = "LIRoomList"; ');
   eval('this.ULRoomList.appendChild(this.LIRoomList[' + i + ']); ');
   
   // create room name span
   this.spanRoomName = document.createElement("span");
   this.spanRoomName.className = "Span_Room_Name";   
   this.spanRoomName.innerText = "newtouch";
   eval('this.LIRoomList[' + i + '].appendChild(this.spanRoomName);');
   
   
   
   // create room state span
   this.spanRoomState = document.createElement("span");
   this.spanRoomState.className = "Span_Room_State";   
   this.spanRoomState.innerText = ConferenceConstants.IN_USE_STATE_STRING;
   eval('this.LIRoomList[' + i + '].appendChild(this.spanRoomState);');
  // this.LIRoomList[i].onmouseover = function(){WatchRoomUI.initWatchRoomUI(/*roomMemberList,over*/)};
      
   if(i == 0){
     roomMemberList[0] = "casfasdfsdafsad";
   }else{
      roomMemberList[0] = "InviteCnfUI";
   }
   uccommon.traceLog(i+"+++"+roomMemberList[0],"initReminderUI-----I'M IN");
   eval('this.LIRoomList[' + i +'].onmouseenter = function(){WatchRoomUI.initWatchRoomUI(/*roomMemberList,over*/roomMemberList)};');
  // this.LIRoomList[i].onmousemove = function(){self.showTip()};
   eval('this.LIRoomList[' + i +'].onmouseleave = function(){WatchRoomUI.deleteWatchRoomUI()};');
  // this.spanRoomState.onclick = function(){self.setFlyout(ConferenceConstants.IN_USE_STATE_STRING)};
  }
}

[[i] 本帖最后由 pblover 于 2007-12-3 20:55 编辑 [/i]]

顶部
chpn
大恐龙
Rank: 4



UID 61902
精华 1
积分 681
帖子 293
威望 334
阅读权限 50
注册 2006-12-11
状态 离线
 
发表于 2007-12-4 09:49  资料  个人空间  短消息  加为好友 
看上去楼上的喜欢走弯路
实不明白 ,难道

QUOTE:
eval('this.LIRoomList[' + i + '] = document.createElement("li");');

会比

QUOTE:
this.IRoomList[i] = document.createElement("li");

更有效,或是更好用

对eval这个函数竟如此的亲睐.

使用代理方式
function delegate(方法,参数,附加对象){
           return function(){
                        方法.call(附加对象||window,参数)
            }
}

this.LIRoomList[i].onmouseover = delegate(WatchRoomUI.initWatchRoomUI, roomMemberList , WatchRoomUI);

这样就可解决问题,并可防止内在泄漏





子曰:唯小人与女子难养也
老子说:只有那个病毒和妹崽不求好找 in linux
顶部
chpn
大恐龙
Rank: 4



UID 61902
精华 1
积分 681
帖子 293
威望 334
阅读权限 50
注册 2006-12-11
状态 离线
 
发表于 2007-12-4 09:52  资料  个人空间  短消息  加为好友 
看上去楼上的喜欢走弯路
实不明白 ,难道

QUOTE:
eval('this.LIRoomList[' + i + '] = document.createElement("li");');

会比

QUOTE:
this.IRoomList[i] = document.createElement("li");

更有效,或是更好用

对eval这个函数竟如此的亲睐.

使用代理方式
function delegate(方法,参数,附加对象){
           return function(){
                        方法.call(附加对象||window,参数)
            }
}

this.LIRoomList[i].onmouseover = delegate(WatchRoomUI.initWatchRoomUI, roomMemberList , WatchRoomUI);

这样就可解决问题,并可防止内在泄漏





子曰:唯小人与女子难养也
老子说:只有那个病毒和妹崽不求好找 in linux
顶部
lonely~
小虫
Rank: 1



UID 78933
精华 0
积分 30
帖子 11
威望 10
阅读权限 10
注册 2007-11-15
状态 离线
 
发表于 2007-12-5 17:01  资料  个人空间  短消息  加为好友 
回复 #3 chpn 的帖子

请教chpn兄台了。
请问您的代码中避免内存泄漏的关键是哪部分?
谢谢。

顶部
chpn
大恐龙
Rank: 4



UID 61902
精华 1
积分 681
帖子 293
威望 334
阅读权限 50
注册 2006-12-11
状态 离线
 
发表于 2007-12-6 09:42  资料  个人空间  短消息  加为好友 
讨论过很多次了,翻翻老贴就知道
ie内泄漏通常是对DOM元素循环引用引起。
比如下面的例子就可引起内存泄漏,除非手动将 d 设为空,或清除test中对d设定的onclick事件
function test(){
            var d = document.getElementById("xxxx");
             d.onclick = function(){
                     
             }
}
test();





子曰:唯小人与女子难养也
老子说:只有那个病毒和妹崽不求好找 in linux
顶部
lonely~
小虫
Rank: 1



UID 78933
精华 0
积分 30
帖子 11
威望 10
阅读权限 10
注册 2007-11-15
状态 离线
 
发表于 2007-12-6 22:25  资料  个人空间  短消息  加为好友 
我还是不太理解。所以在这边较个真儿,呵呵。

代码

function test(){
            var d = document.getElementById("xxxx");
             d.onclick = function(){
                     
             }
}
test();

中并没有建立function(){}对d的引用。循环引用从何而来?


而这段代码

function delegate(方法,参数,附加对象){
  return function(){
    方法.call(附加对象||window,参数);
  }
}
d.onsomething=delegate(方法,参数,d);

中的闭包function(){}依然引用了d,循环引用何以避免?

请教。

[[i] 本帖最后由 lonely~ 于 2007-12-6 22:54 编辑 [/i]]

顶部
 



当前时区 GMT+8, 现在时间是 2009-7-5 09:04
苏ICP备05080427号

Powered by Discuz! 5.5.0  © 2001-2007 51JS.COM
Processed in 0.120429 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - 无忧脚本 - Archiver - WAP