使用for循环批量注册的事件不能正确获取索引值

使用for循环批量注册的事件不能正确获取索引值:
可能不少朋友会遇到一个问题,那就是当使用for循环批量注册事件处理函数,然后最后通过事件处理函数获取当前元素的索引值的时候会失败,先看一段代码实例:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset=" utf-8">
 5 <meta name="author" content="http://www.softwhy.com/" />
 6 <title>蚂蚁部落</title>
 7 <style type="text/css">
 8 li{
 9   width:240px;
10   overflow:hidden;
11   text-overflow:ellipsis;
12   white-space:nowrap;
13   font-size:12px;
14   height:30px;
15 }
16 </style>
17 <script type="text/javascript">
18 window.onload=function(){
19   var oLis=document.getElementsByTagName("li");
20   var oshow=document.getElementById("show");
21   for(var index=0;index<oLis.length;index++){
22     oLis[index].onclick=function(){
23       oshow.innerHTML=index;
24     }
25   }
26 }
27 </script>
28 </head>
29 <body>
30 <div id="show"></div>
31 <ul>
32   <li>只有努力奋斗才会有美好的明天。</li>
33   <li>分享互助是进步最大的源动力。</li>
34   <li>每一天都是新的,要好好珍惜。</li>
35   <li>没有人一开始就是高手,只有努力才有成长的可能</li>
36   <li">只有当下的时间是可贵的,下一秒都是虚幻的</li>
37 </ul>
38 </body>
39 </html>

在上面的代码中,当点击li元素的时候弹出值始终是四,我们本来的想法是,点击li元素在div中显示当前li元素的索引值,下面就简单分析一下其中的原因。原因非常的简单,当for循环执行完毕以后,index的值已经变为四,于是也就出现了上面的现象。
代码修改如下:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset=" utf-8">
 5 <meta name="author" content="http://www.softwhy.com/" />
 6 <title>蚂蚁部落</title>
 7 <style type="text/css">
 8 li{
 9   width:240px;
10   overflow:hidden;
11   text-overflow:ellipsis;
12   white-space:nowrap;
13   font-size:12px;
14   height:30px;
15 }
16 </style>
17 <script type="text/javascript">
18 window.onload=function(){
19   var oLis=document.getElementsByTagName("li");
20   var oshow=document.getElementById("show");
21   for(var index=0;index<oLis.length;index++){
22     oLis[index]._index=index;
23     oLis[index].onclick=function(){
24       oshow.innerHTML=this._index;
25     }
26   }
27 }
28 </script>
29 </head>
30 <body>
31 <div id="show"></div>
32 <ul>
33   <li>只有努力奋斗才会有美好的明天。</li>
34   <li>分享互助是进步最大的源动力。</li>
35   <li>每一天都是新的,要好好珍惜。</li>
36   <li>没有人一开始就是高手,只有努力才有成长的可能</li>
37   <li">只有当下的时间是可贵的,下一秒都是虚幻的</li>
38 </ul>
39 </body>
40 </html>

上面的代码实现了我们的要求,当然也可以使用闭包的方式,代码如下:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset=" utf-8">
 5 <meta name="author" content="http://www.softwhy.com/" />
 6 <title>蚂蚁部落</title>
 7 <style type="text/css">
 8 li{
 9   width:240px;
10   overflow:hidden;
11   text-overflow:ellipsis;
12   white-space:nowrap;
13   font-size:12px;
14   height:30px;
15 }
16 </style>
17 <script type="text/javascript">
18 window.onload=function(){
19   var oLis=document.getElementsByTagName("li");
20   var oshow=document.getElementById("show");
21   for(var index=0;index<oLis.length;index++){
22     (function(index){
23       oLis[index].onclick=function(){
24         oshow.innerHTML=index;
25       }
26     })(index)
27   }
28 }
29 </script>
30 </head>
31 <body>
32 <div id="show"></div>
33 <ul>
34   <li>只有努力奋斗才会有美好的明天。</li>
35   <li>分享互助是进步最大的源动力。</li>
36   <li>每一天都是新的,要好好珍惜。</li>
37   <li>没有人一开始就是高手,只有努力才有成长的可能</li>
38   <li">只有当下的时间是可贵的,下一秒都是虚幻的</li>
39 </ul>
40 </body>
41 </html>

原文地址是使用for循环批量注册的事件不能正确获取索引值

时间: 2024-08-04 15:07:31

使用for循环批量注册的事件不能正确获取索引值的相关文章

javascript使用for循环批量注册的事件不能正确获取索引值的解决方法

今天遇到一个问题,那就是当使用for循环批量注册事件处理函数,然后最后通过事件处理函数获取当前元素的索引值的时候会失败,先看一段代码实例: <script type="text/javascript"> window.onload=function(){ var oLis=document.getElementsByTagName("li"); var oshow=document.getElementById("show"); fo

使用for循环添加点击事件时,获取i值的方法

比如页面上有一个ul,数个li,现在给li添加点击事件. 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循

利用Python实现批量注册网站用户,注意不可用于商业用途哦!

场景目标 现在大多数网站的「用户注册功能」都需要用户正确输入了验证码,才能发起注册的请求,如果想大量注册用户,正确识别验证码变的很关键. 普通的验证码使用 tesserocr,加上训练可以完成,如果想简单一点,可以使用「百度云的文字识别 API」. 今天的目标是使用 selenium + 百度云OCR 批量注册「中知网」一批用户.<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; fon

jquery为链接a元素注册click事件并避免跳转现象

jquery为链接a元素注册click事件并避免跳转现象:在实际应用中,可能需要将链接a作为一个普通的按钮使用,但是由于点击按钮会导致跳转动作,下面就通过代码实例介绍一下如何实现点击功能,并且不会出现跳转现象,代码如下: <!DOCTYPE html><html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.

Dynamic CRM 2013学习笔记(四)单据编号及插件批量注册工具

Dynamic CRM 2013学习笔记(一)插件输入实体参数解析 Dynamic CRM 2013学习笔记(二)插件基本用法及调试 Dynamic CRM 2013学习笔记(三)快速创建实体 EntityCreater 基本上每个实体form上都会有单据编号,而且不同的实体编号要求还不太一样,这时就需要一个通用的单据编号插件,可配置以应对不同的需求. 下面简单介绍下实现步骤: 1. 创建二个实体,以保存各实体所要求的不同单据规则及当前流水号 2. 为不同的实体配置各自的单据规则 3. 编写及注

shell练习题:使用for循环批量修改文件扩展名

shell练习题:使用for循环批量修改文件扩展名 说明:(1)在linux下批量修改文件名,将下图所示命令中的"_linux"去掉. (2)使用for循环脚本. 思路:本题的基本解题思路,先进行单个文件的改名,然后再用循环实现批量改名,这是比较常规的做法,也可以用rename专业改名工具. 方法一: 说明:使用cut.sed工具 脚本如下: #!/bin/bash cd /test for i in `ls|grep .*.jpg` do mv $i `echo $i |cut -d

注册IRP_MJ_SHUTDOWN事件 基于ReactOS0303

系统关闭时,会向注册SHUTDOWN事件的设备驱动发送IRP_MJ_SHUTDOWN事件. NTSTATUS STDCALL NtShutdownSystem(IN SHUTDOWN_ACTION Action) { if (Action > ShutdownPowerOff) return STATUS_INVALID_PARAMETER; Status = PsCreateSystemThread(&ThreadHandle, THREAD_ALL_ACCESS, NULL, NULL,

RegisterDllAndOcx.bat -批量注册当前文件夹中的dll和ocx

批量注册当前文件夹中的dll和ocx 新建文件:RegisterDllAndOcx.bat   @echo off echo hello,girl~~ for %%i in (*.dll *.ocx) do ( echo %% register is starting... C:\Windows\System32\regsvr32.exe %%i /s echo %%i register is finished... ) pause 备注:可根据显示需要,酌情修改~

菜鸟学JS(四)——javascript为按钮注册回车事件(设置默认按钮)

不得不说,在JS方面,自己真的是个不折不扣的菜鸟.对于JS以及一些JS框架如JQuery等JS框架,自己也只是处在简单应用的阶段,当然自己也在不断的学习当中,希望将来能跟大家分享更多JS方面的心得.今天先来点开胃的,说一下如何设置一个默认按钮,就是不管焦点在不在按钮上,只要按下回车,就等于触发了按钮的单击事件. 代码非常简单,要完成这个功能,只需几行代码: //为keyListener方法注册按键事件 document.onkeydown=keyListener; function keyLis