关于使用js为Dom动态添加事件的讨论

BoolYang 2008-11-21 03:13:41
程序如下:

var addEvent = function(obj,eventType,evtFun){
if(document.addEventListener){
obj.addEventListener(eventType,evtFun,false);
}
else if(document.attachEvent){
obj.attachEvent("on"+eventType,evtFun);
}
};
var $G = function(a){return document.getElementById(a);};
var TestClass = function(){
this.items = ['id1','id2','id3','id4'];
this.init();
};
TestClass.prototype.init = function(){
for(var i in this.items){
document.write('<div id='+this.items[i]+'>'+this.items[i]+'</div>');
}
var obj = this;
for(var i in this.items){
var item = this.items[i];
addEvent($G(item),'click',function(){obj.click(item);});
}
};
TestClass.prototype.click= function(a){
alert(a);//这里总是输出id4
};
var test = new TestClass();


以上代码在ie7与ff 3.0中点击四个div均输出为:id4,而本意是想点id1的div输出为:id1,点id2的div输出为:id2 ... 请问高手上面的代码的问题在什么地方?

改为以下代码后可输出想要的结果,但还是不明白为什么上面的代码会有问题呢?


var addEvent = function(obj,eventType,evtFun){
if(document.addEventListener){
obj.addEventListener(eventType,evtFun,false);
}
else if(document.attachEvent){
obj.attachEvent("on"+eventType,evtFun);
}
};
var $G = function(a){return document.getElementById(a);};
var TestClass = function(){
this.items = ['id1','id2','id3','id4'];
this.init();
};
TestClass.prototype.init = function(){
for(var i in this.items){
document.write('<div id='+this.items[i]+'>'+this.items[i]+'</div>');
}
for(var i in this.items){
var item = this.items[i];
this.addClick(item);
}
};
TestClass.prototype.addClick= function(a){
var obj = this;
addEvent($G(a),'click',function(){obj.click(a);});
};
TestClass.prototype.click= function(a){
alert(a);
};
var test = new TestClass();

...全文
354 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxnet2008 2008-11-22
  • 打赏
  • 举报
回复
抱歉..
for(var i in this.items){
(function(){
var item = obj.items[i];
addEvent($G(item),'click',function(){obj.click(item);});
})();
wxnet2008 2008-11-22
  • 打赏
  • 举报
回复
for(var i in this.items){
var item = this.items[i];
addEvent($G(item),'click',function(){obj.click(item);});
}

改成
for(var i in this.items){
(function(){
var item = this.items[i];
addEvent($G(item),'click',function(){obj.click(item);});
})();

}
wangliangatleiden 2008-11-21
  • 打赏
  • 举报
回复
同意楼上,是闭包问题.


for(var i in this.items){
var item = this.items[i];//这里的item只是对this.items[i]的一个引用,当执行到最一个item[i]的时候,所有的item都指向最后一个item[i]
addEvent($G(item),'click',function(){this.click(item);});
}

neo_yoho 2008-11-21
  • 打赏
  • 举报
回复
闭包
http://topic.csdn.net/u/20081111/11/b4c4e0ac-f0a8-49b6-867f-a37205cc4dd8.html

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧