Js for循环中点击事件中无法正确获取每一个i值的问题

296 阅读1分钟

一、问题发现

这是我在完成利用li标签实现选项卡切换时候遇到的问题,起初以为是js中的闭包函数的原因,后来才有所了解。

-<body>
   <ul>
   <li>锄禾日当午</li>
   <li>汗滴禾下土</li>
   <li>谁知盘中餐</li>
   <li>粒粒皆辛苦</li></ul>
   <script type="text/javascript">
   	var li=document.getElementsByTagName('li')
   	  for(var i=0;i<li.length;i++)
   	{    
   		li[i].onclick=function(){
   			alert(li[i].innerHTML)
   		}
   	}
   </script>
</body>
  • 代码本意是想当鼠标点击诗句对应的弹出带有诗句内容的警告框,乍一看代码没有任何问题,但在代码实现后怎么点也弹不出警告框。

二、原因分析

js事件处理器在线程空闲时间不会运行,页面初始化的时候i就已经从0走到了3,当你在点击的时候i已经变成了4显然li [4]的值是不存在,所以弹不出警告框。

三、解决办法

办法一:将for中的var i用let i替代

   -<script type="text/javascript">
   	var li=document.getElementsByTagName('li')
   	  for(let i=0;i<li.length;i++)
   	{    
   		li[i].onclick=function(){
   			alert(li[i].innerHTML)
   		}
   	}
   </script>

办法二:为每一个要点击的对象创建index属性用来保存索引变量i

   -<script type="text/javascript">
   	var li=document.getElementsByTagName('li')
  	for(var i=0;i<li.length;i++)
   	{    li[i].index=i;
   		li[i].onclick=function(){
   			alert(li[this.index].innerHTML)
   		}
   	}
   </script>

办法三:直接使用this

   -<script type="text/javascript">
   	var li=document.getElementsByTagName('li')
    for(var i=0;i<li.length;i++)
   	{    
   		li[i].onclick=function(){
   			alert(this.innerHTML)
   		}
   	}
   </script>