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 相关文章推荐
超级强大的表单验证
Jun 26 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
Feb 23 Javascript
jQuery异步获取json数据方法汇总
Dec 22 Javascript
HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列
Apr 26 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
Jun 19 Javascript
浅析JavaScript 调试方法和技巧
Oct 22 Javascript
jQuery.uploadify文件上传组件实例讲解
Sep 23 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
Apr 21 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
Jul 28 Javascript
一步步教你利用Docker设置Node.js
Nov 20 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
Oct 28 jQuery
解决Vue 移动端点击出现300毫秒延迟的问题
Jul 21 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数组操作
2011/12/30 PHP
php Hex RGB颜色值互换的使用
2013/05/10 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
List the UTC Time on a Computer
2007/06/11 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
百度判断手机终端并自动跳转js代码及使用实例
2014/06/11 Javascript
node.js中的fs.chmod方法使用说明
2014/12/18 Javascript
JS表单验证的代码(常用)
2016/04/08 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
JavaScript中创建对象的7种模式详解
2017/02/21 Javascript
vue2 前后端分离项目ajax跨域session问题解决方法
2017/04/27 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
Python遍历指定文件及文件夹的方法
2015/05/09 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
selenium python浏览器多窗口处理代码示例
2018/01/15 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
2018/09/04 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
python 操作excel表格的方法
2020/12/05 Python
vue.js刷新当前页面的实例讲解
2020/12/29 Python
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
世界上最大的艺术社区:SAA
2020/12/30 全球购物
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
车间操作工岗位职责
2013/12/19 职场文书
酒店保安员岗位职责
2014/01/31 职场文书
毕业生如何写自我鉴定
2014/03/15 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
大学毕业典礼致辞
2015/07/29 职场文书
vue3如何优雅的实现移动端登录注册模块
2021/03/29 Vue.js
微信小程序用户授权最佳实践指南
2021/05/08 Javascript
2021年国产动漫公司排行前十名,玄机科技上榜,第二推出过铠甲勇士
2022/03/18 杂记
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis