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图像处理—亮度对比度应用案例
Jan 03 Javascript
JavaScript的Module模式编程深入分析
Aug 13 Javascript
JavaScript实现自动生成网页元素功能(按钮、文本等)
Nov 21 Javascript
JS设置下拉列表框当前所选值的方法
Dec 22 Javascript
简单谈谈ES6的六个小特性
Nov 18 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
Apr 20 Javascript
Bootstrap table使用方法汇总
Nov 17 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
Sep 04 Javascript
解决VUE中document.body.scrollTop为0的问题
Sep 15 Javascript
Vue 组件注册实例详解
Feb 23 Javascript
node.JS路径解析之PATH模块使用方法详解
Feb 06 Javascript
Element Carousel 走马灯的具体实现
Jul 26 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/06/03 PHP
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
laravel 解决多库下的DB::transaction()事务失效问题
2019/10/21 PHP
动手学习无线电
2021/03/10 无线电
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
正则表达式中特殊符号及正则表达式的几种方法总结(replace,test,search)
2013/11/26 Javascript
使用js判断控件是否获得焦点
2014/01/03 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
node.js中的fs.writeFileSync方法使用说明
2014/12/14 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
深入理解Vue官方文档梳理之全局API
2017/11/22 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
[07:57]DOTA2热力大趴狂欢夜 广州站活动回顾
2013/11/27 DOTA
python3访问sina首页中文的处理方法
2014/02/24 Python
Python上传package到Pypi(代码简单)
2016/02/06 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
pandas.DataFrame.drop_duplicates 用法介绍
2020/07/06 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
公司面试感谢信
2014/02/01 职场文书
社区平安建设方案
2014/05/25 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
爬山的活动方案
2014/08/16 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
秋季校运会广播稿100字
2014/09/18 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书
单身证明范本
2015/06/15 职场文书
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS