JS中使用for循环添加点击事件时,获取i值及参数异常原因及解决办法

本文探讨了JavaScript中闭包的使用误区,特别是在为多个DOM元素绑定点击事件时,如何正确处理循环变量的问题。通过实例展示了不同的解决方案,帮助开发者理解闭包的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇见此问题,代码检查了n次都没毛病,但是却出现下述问题, 坑了我好久,原来是这个原因,记录避坑!

PS这是js的处理方法, 在jquery中直接用each遍历元素绑定点击事件即可避免

$('#id').each(function(i){
	$(this).click(function(){
	 alert(i);							
	});
});


转自 : https://www.cnblogs.com/blogs-8888/p/6437350.html


比如页面上有一个ul,数个li,现在给li添加点击事件。

1
2
3
4
5
6
   var  li = document.getElementsByTagName( "li" );
   for ( var  i = 0; i < li.length; i++) {
   li[i].addEventListener( "click" , function  () {
   console.log(i);
   })
}

但是,这样写之后我们发现,点击任何一个li,打印的值都为5,这是因为闭包中共用i值,而i的值由于执行for循环,都变为了5

为了正常显示i值,我们可以使用如下方法:

 

1
2
3
4
5
6
7
for  ( var  i = 0; i < lis.length; i++) {
    ( function (arg){
        li[arg].onclick =  function (){
            console.log(arg);
        };
    })(i)  
}

  

类似于这样

1
2
3
4
5
6
7
8
9
10
11
12
var  li = document.getElementsByTagName( "li" );
for ( var  i = 0; i < li.length; i++) {
     getConsole(i);
}
 
 
function  getConsole(i){
     li[i].addEventListener( "click" function () {
         console.log(i);
     });
     
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值