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 相关文章推荐
JQuery 风格的HTML文本转义
Jul 01 Javascript
基于jquery的点击链接插入链接内容的代码
Jul 31 Javascript
页面元素绑定jquery toggle后元素隐藏的解决方法
Mar 27 Javascript
关于JavaScript命名空间的一些心得
Jun 07 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
Oct 25 Javascript
解决Linux无法正常安装与卸载Node.js的方法
Jan 19 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
Feb 13 jQuery
解决angularJS中input标签的ng-change事件无效问题
Sep 13 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
Dec 19 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
Apr 12 Javascript
关于Vue源码vm.$watch()内部原理详解
Apr 26 Javascript
Vue设置长时间未操作登录自动到期返回登录页
Jan 22 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 JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
2015/09/28 PHP
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
2015/12/20 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
2017/03/28 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
深入理解Node module模块
2018/03/26 Javascript
Vue中props的使用详解
2018/06/15 Javascript
学习jQuery中的noConflict()用法
2018/09/28 jQuery
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
Python读写Excel文件的实例
2013/11/01 Python
解决Python中字符串和数字拼接报错的方法
2016/10/23 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
python flask实现分页的示例代码
2018/08/02 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
python实现横向拼接图片
2020/03/23 Python
Python小白垃圾回收机制入门
2020/06/09 Python
关于python的缩进规则的知识点详解
2020/06/22 Python
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
电子商务专业个人的自我评价
2013/12/19 职场文书
保护环境的建议书
2014/03/12 职场文书
创意广告词
2014/03/17 职场文书
建筑公司员工自我鉴定
2014/04/08 职场文书
厨房管理计划书
2014/04/27 职场文书
2016年清明节寄语
2015/12/04 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书