JavaScript的for循环中嵌套一个点击事件的问题解决


Posted in Javascript onMarch 03, 2017

先看下面一段代码:

for(var i=0; i<10; i++) {
 $('#ul').bind('click', function() {
  alert(i)
 })
}

对于这段代码,当点击Id为“ul”的元素时,会出现弹出10个10。为什么会弹出10个10呢?

首先,这段代码中的点击事件不是绑定事件,是jQuery的绑定事件,那么绑定事件和普通事件是有区别的。普通事件中,如果对某一个元素添加多个点击事件,那么,最后一个将会把前面的所有点击事件全部覆盖,只能执行最后一个点击事件;而在绑定事件中,则不一样,在同一个元素上,即使绑定再多的点击事件,都会全部执行。也就是说,普通事件中的onclick只支持单个事件,会被其他onclick事件覆盖,而事件绑定中的点击事件可以添加多个事件而不用担心被覆盖。那么,可想而知,当点击Id为“ul”的元素时,一定会弹出10个弹窗。

如果还是不太明白,那么对代码进行变形之后,就很容易理解了。

其实,上面的那段代码可以变形为以下形式:

// i=0时
$('#ul').bind('click', function() {
  alert(i)
 })
// i=1时
$('#ul').bind('click', function() {
  alert(i)
 })
 
......
 
// i=10时
$('#ul').bind('click', function() {
  alert(i)
 })

扩展:下面这段代码是对上面的那段原始代码的比较,进一步说明普通事件和事件绑定的区别

for(var i=0; i<10; i++) {
 document.getElementById('ul').onclick = function() {
  alert(i)
 }
}

运行结果:弹出一个10

很显然,当触发点击事件时,会弹出10个弹窗。那么,可能又会有疑问?为什么会是10个10呢?不应该是0,1,2,3...10吗?为了解决这个疑惑,可对原始代码进行再次变形:

var i=0
 
$('#ul').bind('click', function() {
  alert(i)
 })
i=1
$('#ul').bind('click', function() {
  alert(i)
 })
 
......
 
i = 9
$('#ul').bind('click', function() {
  alert(i)
 })

原始代码,变形为这样之后,很显然,最终i的值是9,但是根据for循环的原理,在循环到i为9之后,会执行i++,之后再去判断i<10,此时已不满足条件,所以终止循环,最终i值为10。那么自然也就明白,为什么最终结果是10个结果为10的弹窗。

总结:这段代码看似简单,却涵盖了事件绑定、普通事件、for循环等多个知识点。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
javascript引用对象的方法代码
Aug 13 Javascript
JavaScript 更严格的相等 [译]
Sep 20 Javascript
JS检测输入字符是否包含非法字符的示例代码
Feb 11 Javascript
IE中图片的onload事件无效问题和解决方法
Jun 06 Javascript
jQuery中size()方法用法实例
Dec 27 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
Jan 23 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
Jun 01 Javascript
vue2.0 实现页面导航提示引导的方法
Mar 13 Javascript
JS伪继承prototype实现方法示例
Jun 20 Javascript
webpack4.x打包过程详解
Jul 18 Javascript
vue watch深度监听对象实现数据联动效果
Aug 16 Javascript
微信小程序纯文本实现@功能
Apr 08 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
Mar 03 #Javascript
angularjs实现下拉列表的选中事件示例
Mar 03 #Javascript
JavaScript数组迭代方法
Mar 03 #Javascript
vue.js的提示组件
Mar 02 #Javascript
js实现功能比较全面的全选和多选
Mar 02 #Javascript
jQuery实现三级联动效果
Mar 02 #Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
Mar 02 #Javascript
You might like
PHP统计二维数组元素个数的方法
2013/11/12 PHP
JavaScript 事件记录使用说明
2009/10/20 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
JS比较2个日期间隔的示例代码
2014/04/15 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
jquery 禁止鼠标右键并监听右键事件
2017/04/27 jQuery
JS 60秒后重新发送验证码的实例讲解
2017/07/26 Javascript
vue组件父与子通信详解(一)
2017/11/07 Javascript
微信小程序时间戳转日期的详解
2019/04/30 Javascript
Vue模板语法中数据绑定的实例代码
2019/05/17 Javascript
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
浅析vue-router中params和query的区别
2019/12/24 Javascript
Vue中qs插件的使用详解
2020/02/07 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
[39:32]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第二场
2014/05/23 DOTA
详解python的数字类型变量与其方法
2016/11/20 Python
python生成式的send()方法(详解)
2017/05/08 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
Python 元类实例解析
2018/04/04 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
python实现邮件自动发送
2019/08/10 Python
Django权限设置及验证方式
2020/05/13 Python
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
Canvas高级路径操作之拖拽对象的实现
2019/08/05 HTML / CSS
美国购车网站:TrueCar
2016/10/19 全球购物
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
捷克购买家具网站:JENA nábytek
2020/03/19 全球购物
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
写自荐信要注意什么
2013/12/26 职场文书
教师节促销方案
2014/03/22 职场文书
婚礼父母答谢词
2015/01/04 职场文书
爱护公物主题班会
2015/08/17 职场文书
小学副班长竞选稿
2015/11/21 职场文书