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


Posted in Javascript onDecember 20, 2014

本文实例讲述了javascript使用for循环批量注册的事件不能正确获取索引值的解决方法。分享给大家供大家参考。具体分析如下:

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

<!DOCTYPE html>

<html>

<head>

<meta charset=" utf-8">

<meta name="author" content="https://3water.com/" />

<title>三水点靠木</title>

<style type="text/css">

li{

  width:240px;

  overflow:hidden;

  text-overflow:ellipsis;

  white-space:nowrap;

  font-size:12px;

  height:30px;

}

</style>

<script type="text/javascript">

window.onload=function(){

  var oLis=document.getElementsByTagName("li");

  var oshow=document.getElementById("show");

  for(var index=0;index<oLis.length;index++){

    oLis[index].onclick=function(){

      oshow.innerHTML=index;

    }

  }

}

</script>

</head>

<body>

<div id="show"></div>

<ul>

  <li>只有努力奋斗才会有美好的明天。</li>

  <li>分享互助是进步最大的源动力。</li>

  <li>每一天都是新的,要好好珍惜。</li>

  <li>没有人一开始就是高手,只有努力才有成长的可能</li>

  <li>只有当下的时间是可贵的,下一秒都是虚幻的</li>

</ul>

</body>

</html>

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

<!DOCTYPE html>

<html>

<head>

<meta charset=" utf-8">

<meta name="author" content="https://3water.com/" />

<title>三水点靠木</title>

<style type="text/css">

li{

  width:240px;

  overflow:hidden;

  text-overflow:ellipsis;

  white-space:nowrap;

  font-size:12px;

  height:30px;

}

</style>

<script type="text/javascript">

window.onload=function(){

  var oLis=document.getElementsByTagName("li");

  var oshow=document.getElementById("show");

  for(var index=0;index<oLis.length;index++){

    oLis[index]._index=index;

    oLis[index].onclick=function(){

      oshow.innerHTML=this._index;

    }

  }

}

</script>

</head>

<body>

<div id="show"></div>

<ul>

  <li>只有努力奋斗才会有美好的明天。</li>

  <li>分享互助是进步最大的源动力。</li>

  <li>每一天都是新的,要好好珍惜。</li>

  <li>没有人一开始就是高手,只有努力才有成长的可能</li>

  <li>只有当下的时间是可贵的,下一秒都是虚幻的</li>

</ul>

</body>

</html>

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

<!DOCTYPE html>

<html>

<head>

<meta charset=" utf-8">

<meta name="author" content="https://3water.com/" />

<title>三水点靠木</title>

<style type="text/css">

li{

  width:240px;

  overflow:hidden;

  text-overflow:ellipsis;

  white-space:nowrap;

  font-size:12px;

  height:30px;

}

</style>

<script type="text/javascript">

window.onload=function(){

  var oLis=document.getElementsByTagName("li");

  var oshow=document.getElementById("show");

  for(var index=0;index<oLis.length;index++){

    (function(index){

      oLis[index].onclick=function(){

        oshow.innerHTML=index;

      }

    })(index)

  }

}

</script>

</head>

<body>

<div id="show"></div>

<ul>

  <li>只有努力奋斗才会有美好的明天。</li>

  <li>分享互助是进步最大的源动力。</li>

  <li>每一天都是新的,要好好珍惜。</li>

  <li>没有人一开始就是高手,只有努力才有成长的可能</li>

  <li>只有当下的时间是可贵的,下一秒都是虚幻的</li>

</ul>

</body>

</html>

希望本文所述对大家基于javascript的web程序设计有所帮助。

Javascript 相关文章推荐
jquery 学习之二 属性(html()与html(val))
Nov 25 Javascript
浅谈js中变量初始化
Feb 03 Javascript
JavaScript中join()方法的使用简介
Jun 09 Javascript
详解Javascript继承的实现
Mar 25 Javascript
jquery select2的使用心得(推荐)
Dec 04 Javascript
Json按某个键的值进行排序
Dec 22 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
Jul 05 jQuery
微信小程序之多列表的显示和隐藏功能【附源码】
Aug 06 Javascript
vue 解决computed修改data数据的问题
Nov 06 Javascript
vue 返回上一页,页面样式错乱的解决
Nov 14 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
Nov 19 Vue.js
JavaScript 实现继承的几种方式
Feb 19 Javascript
Node.js实现批量去除BOM文件头
Dec 20 #Javascript
javascript删除一个html元素节点的方法
Dec 20 #Javascript
Node.js中调用mysql存储过程示例
Dec 20 #Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
Dec 20 #Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
Dec 19 #Javascript
jquery图片播放浏览插件prettyPhoto使用详解
Dec 19 #Javascript
js中匿名函数的创建与调用方法分析
Dec 19 #Javascript
You might like
PHP模板引擎SMARTY
2006/10/09 PHP
php mssql 时间格式问题
2009/01/13 PHP
PHP 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
php 数据库字段复用的基本原理与示例
2011/07/22 PHP
深入php var_dump()函数的详解
2013/06/05 PHP
jQuery DOM操作小结与实例
2010/01/07 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
常用的Javascript设计模式小结
2015/12/09 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
BootStrap 标题设置跨行无效的解决方法
2017/10/25 Javascript
详解Node.js模板引擎Jade入门
2018/01/19 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
Angular使用Restful的增删改
2018/12/28 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
Python日期操作学习笔记
2008/10/07 Python
python+mysql实现简单的web程序
2014/09/11 Python
python如何通过实例方法名字调用方法
2018/03/21 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
2020/05/16 Python
如何基于Python按行合并两个txt
2020/11/03 Python
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
手术室护士自我鉴定
2013/10/14 职场文书
求职个人评价范文
2014/04/09 职场文书
优秀员工评优方案
2014/06/13 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
战略性融资合作协议书范本
2014/10/17 职场文书
后进生评语大全
2015/01/04 职场文书
85句关于理想的名言警句大全
2019/08/22 职场文书
JavaWeb 入门:Hello Servlet
2021/07/16 Java/Android
MySQL限制查询和数据排序介绍
2022/03/25 MySQL
如何优化vue打包文件过大
2022/04/13 Vue.js