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下的Live方法和$.browser方法使用代码
Jun 02 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
Mar 08 Javascript
详解JS函数重载
Dec 04 Javascript
jQuery实现滚动切换的tab选项卡效果代码
Aug 26 Javascript
ajax在兼容模式下失效的快速解决方法
Mar 22 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
Jul 07 Javascript
对称加密与非对称加密优缺点详解
Feb 06 Javascript
js实现功能比较全面的全选和多选
Mar 02 Javascript
vue的常用组件操作方法应用分析
Apr 13 Javascript
ES6知识点整理之Proxy的应用实例详解
Apr 16 Javascript
Vue的编码技巧与规范使用详解
Aug 28 Javascript
layui switch 开关监听 弹出确定状态转换的例子
Sep 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
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
js资料toString 方法
2007/03/13 Javascript
javascript 写类方式之五
2009/07/05 Javascript
dojo随手记 gird组件引用
2011/02/24 Javascript
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
快速查找数组中的某个元素并返回下标示例
2013/09/03 Javascript
js判断上传文件的类型和大小示例代码
2013/10/18 Javascript
JavaScript SetInterval与setTimeout使用方法详解
2013/11/15 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
2015/08/24 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
jquery append与appendTo方法比较
2017/05/24 jQuery
Vue中的Props(不可变状态)
2018/09/29 Javascript
Vue 组件参数校验与非props特性的方法
2019/02/12 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
基于vue实现图片验证码倒计时60s功能
2019/12/10 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
Python的subprocess模块总结
2014/11/07 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
python matlab库简单用法讲解
2020/12/31 Python
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
工商管理系学生的自我评价分享
2013/11/29 职场文书
培训班开班主持词
2015/07/02 职场文书