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中的变量声明早于赋值分析
Mar 01 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
Aug 13 Javascript
深入理解jQuery中live与bind方法的区别
Dec 18 Javascript
jquery中radio checked问题
Mar 16 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
Jun 26 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
Jul 09 Javascript
JS实现登录页密码的显示和隐藏功能
Dec 06 Javascript
vue双向数据绑定知识点总结
Apr 18 Javascript
vue-router权限控制(简单方式)
Oct 29 Javascript
JavaScript剩余操作符Rest Operator详解
Jul 20 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
Sep 08 Javascript
vue+element UI实现树形表格
Dec 29 Vue.js
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数据库开发知多少
2006/10/09 PHP
php学习之 数组声明
2011/06/09 PHP
php学习笔记之 函数声明
2011/06/09 PHP
PHP设计模式之代理模式的深入解析
2013/06/13 PHP
PHP函数strip_tags的一个bug浅析
2014/05/22 PHP
php实现在线通讯录功能(附源码)
2016/05/13 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
用javascript作一个通用向导说明
2011/08/30 Javascript
js DOM 元素ID就是全局变量
2012/09/20 Javascript
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
使用js画图之饼图
2015/01/12 Javascript
jquery操作angularjs对象
2015/06/26 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python获取服务器信息的最简单实现方法
2015/03/05 Python
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
python下MySQLdb用法实例分析
2015/06/08 Python
TensorFlow实现创建分类器
2018/02/06 Python
Numpy掩码式数组详解
2018/04/17 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
个人简历中的自我评价范例
2013/10/29 职场文书
财务出纳岗位职责
2014/02/03 职场文书
公司收款委托书范本
2014/09/20 职场文书
六一文艺汇演主持词
2015/06/30 职场文书
小学生班干部竞选稿
2015/11/20 职场文书
2019年最新借条范本!
2019/07/08 职场文书
源码分析Redis中 set 和 sorted set 的使用方法
2022/03/22 Redis
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电