设为首页收藏本站订阅更新

无忧脚本

 找回密码
 加入无忧

QQ登录

只需一步,快速开始

查看: 1983|回复: 5

[求助] js循环创建添加事件,值不正确 [复制链接]

Rank: 1

升级  22%

注册时间
2007-11-15
威望
6
阅读权限
10
积分
11
帖子
6
精华
0
UID
78912
状态
当前离线
发表于 2007-12-3 20:48:25 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
一键分享 一键分享
请教一下,我用循环创建了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.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.onmousemove = function(){self.showTip()};
   eval('this.LIRoomList[' + i +'].onmouseleave = function(){WatchRoomUI.deleteWatchRoomUI()};');
  // this.spanRoomState.onclick = function(){self.setFlyout(ConferenceConstants.IN_USE_STATE_STRING)};
  }
}

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

Rank: 4

升级  53.2%

注册时间
2006-12-11
威望
368
阅读权限
50
积分
766
帖子
329
精华
1
UID
61902
状态
当前离线
发表于 2007-12-4 09:49:06 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
看上去楼上的喜欢走弯路
实不明白 ,难道
eval('this.LIRoomList[' + i + '] = document.createElement("li");');

会比
this.IRoomList = document.createElement("li");
更有效,或是更好用

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

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

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

这样就可解决问题,并可防止内在泄漏
无论走到哪里,我的家都只有一个。。那就是重庆。

使用道具 举报

Rank: 4

升级  53.2%

注册时间
2006-12-11
威望
368
阅读权限
50
积分
766
帖子
329
精华
1
UID
61902
状态
当前离线
发表于 2007-12-4 09:52:31 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
看上去楼上的喜欢走弯路
实不明白 ,难道
eval('this.LIRoomList[' + i + '] = document.createElement("li");');

会比
this.IRoomList = document.createElement("li");
更有效,或是更好用

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

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

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

这样就可解决问题,并可防止内在泄漏
无论走到哪里,我的家都只有一个。。那就是重庆。

使用道具 举报

Rank: 1

升级  64%

注册时间
2007-11-15
威望
10
阅读权限
10
积分
32
帖子
11
精华
0
UID
78933
状态
当前离线
发表于 2007-12-5 17:01:14 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料

回复 #3 chpn 的帖子

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

使用道具 举报

Rank: 4

升级  53.2%

注册时间
2006-12-11
威望
368
阅读权限
50
积分
766
帖子
329
精华
1
UID
61902
状态
当前离线
发表于 2007-12-6 09:42:58 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
讨论过很多次了,翻翻老贴就知道
ie内泄漏通常是对DOM元素循环引用引起。
比如下面的例子就可引起内存泄漏,除非手动将 d 设为空,或清除test中对d设定的onclick事件
function test(){
            var d = document.getElementById("xxxx");
             d.onclick = function(){
                     
             }
}
test();
无论走到哪里,我的家都只有一个。。那就是重庆。

使用道具 举报

Rank: 1

升级  64%

注册时间
2007-11-15
威望
10
阅读权限
10
积分
32
帖子
11
精华
0
UID
78933
状态
当前离线
发表于 2007-12-6 22:25:44 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
我还是不太理解。所以在这边较个真儿,呵呵。

代码

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,循环引用何以避免?

请教。

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

使用道具 举报

您需要登录后才可以回帖 登录 | 加入无忧

Archiver|手机版|无忧脚本 ( 苏ICP备05080427号 )|值班电话:027-62300445  

GMT+8, 2012-2-7 21:43 , Processed in 0.063507 second(s), 14 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 1999-2011 无忧脚本

回顶部