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 相关文章推荐
HTML复选框和单选框 checkbox和radio事件介绍
Dec 12 Javascript
js遍历td tr等html元素
Dec 13 Javascript
js toFixed()方法的重写实现精度的统一
Mar 06 Javascript
js通过iframe加载外部网页的实现代码
Apr 05 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
Jun 24 Javascript
详解Angular2组件之间如何通信
Jun 22 Javascript
关于vue-router的beforeEach无限循环的问题解决
Sep 09 Javascript
教你用Cordova打包Vue项目的方法
Oct 17 Javascript
浅谈基于Vue.js的移动组件库cube-ui
Dec 20 Javascript
swiper动态改变滑动内容的实现方法
Jan 17 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
Apr 23 jQuery
JavaScript的Proxy可以做哪些有意思的事儿
Jun 15 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
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
php桌面中心(一) 创建数据库
2007/03/11 PHP
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
2015/10/27 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
JavaScript实际应用:innerHTMl和确认提示的使用
2006/06/22 Javascript
从新浪弄下来的全屏广告代码 与使用说明
2007/03/15 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
详解vue-router和vue-cli以及组件之间的传值
2017/07/04 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
小程序如何获取多个formId实现详解
2019/09/20 Javascript
ES6中的类(Class)示例详解
2020/12/09 Javascript
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
python使用PythonMagick将jpg图片转换成ico图片的方法
2015/03/26 Python
详解python logging日志传输
2020/07/01 Python
Python基于pillow库实现生成图片水印
2020/09/14 Python
细说CSS3中的选择符
2008/10/17 HTML / CSS
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
英国卫浴商店:Ergonomic Design
2019/09/22 全球购物
一套PHP的笔试题
2013/05/31 面试题
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
素质教育标语
2014/06/27 职场文书
电子专业自荐信
2014/07/01 职场文书
社会工作专业求职信
2014/07/15 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js