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 10 Javascript
替代window.event.srcElement效果的可兼容性的函数
Dec 18 Javascript
再谈javascript图片预加载技术(详细演示)
Mar 12 Javascript
jquery实现submit提交表单
Feb 03 Javascript
使用Node.js实现HTTP 206内容分片的教程
Jun 23 Javascript
JS动态改变浏览器标题的方法
Apr 06 Javascript
移动适配的几种方案(三种方案)
Nov 25 Javascript
vue-resource调用promise取数据方式详解
Jul 21 Javascript
Angularjs cookie 操作实例详解
Sep 27 Javascript
Vue 2.0入门基础知识之内部指令详解
Oct 15 Javascript
使用webpack4编译并压缩ES6代码的方法示例
Apr 24 Javascript
Vue.js仿Select下拉框效果
Feb 18 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数组(array)输出的三种形式详解
2013/06/05 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
一款js和css代码压缩工具[附JAVA环境配置方法]
2010/04/16 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
vue小白入门教程
2018/04/02 Javascript
vue使用recorder.js实现录音功能
2019/11/22 Javascript
JS前端广告拦截实现原理解析
2020/02/17 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
简单介绍Python的Django框架加载模版的方式
2015/07/20 Python
Python匹配中文的正则表达式
2016/05/11 Python
python中nan与inf转为特定数字方法示例
2017/05/11 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
详解Django中六个常用的自定义装饰器
2018/07/04 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
Python创建文件夹与文件的快捷方法
2020/12/08 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
Omio西班牙:全欧洲低价大巴、火车和航班搜索和比价
2017/02/11 全球购物
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
Nike香港官网:Nike HK
2019/03/23 全球购物
德国Discount-Apotheke中文官网:DC德式康线上药房
2020/02/18 全球购物
新闻专业推荐信范文
2013/11/20 职场文书
大学团支书的自我评价分享
2013/12/14 职场文书
普罗米修斯教学反思
2014/02/06 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
小学安全汇报材料
2014/08/14 职场文书