比如有这样的代码for(var i = 0; i < list.length; i++){ list[i].onclick = function(){ alert(i); } }用for循环注册事件,不管点击哪个list选项,alert都是list.length,怎么样做才能alert的当前的i值?
5 回答
已采纳
刚毅87
TA贡献345条经验 获得超309个赞
因为点击事件是在 for 循环走完之后才执行的,所以会出现上述情况.
此时就需要记录i 值
for(var i = 0; i < list.length; i++){ list[i].index = i; list[i].onclick = function(){ alert(this.index); } }
现在就是点击哪个,打印哪个.
望采纳!
Suber丶林
TA贡献75条经验 获得超180个赞
原因是JavaScript没有局部作用域,所以for循环结束后,i的值就是list.length,而当触发click事件时候,理所当然弹出list.length。这时候要么用1楼的存变量方法,也可以使用闭包(http://www.imooc.com/wenda/detail/318961 ← 戳这里,问题一样 ),如下:
// 使用len存储list.length,优化性能,提防每次循环都获取list.length for (var i = 0, len = list.length; i < len; i++) { list[i].onclick = (function (index) { return function() { alert(index); }; }(i)); }
Walk_
TA贡献48条经验 获得超30个赞
点击事件是异步触发的,触发事件时,for循环早已经执行完了,所以点击事件向上查找i值时,得到的i值都是相同的。
加层闭包就好了。
(function(i){
for(){........};
})(i)
咕咕问
TA贡献78条经验 获得超12个赞
js闭包 for(var i=0; i<10; i++){(function(i){console.log(i);})(i)} (function(参数A){})(参数A)
我是陈东东
TA贡献11条经验 获得超1个赞
for(var i = 0; i < list.length; i++){
this.onclick = function(){
alert(i);
}
}
添加回答
举报
0/150
提交
取消