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 防止表单重复提交代码
Jan 21 Javascript
ExtJs 3.1 XmlTreeLoader Example Error
Feb 09 Javascript
javascript学习笔记(五)正则表达式
Apr 08 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
Aug 28 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
Apr 14 jQuery
利用n工具轻松管理Node.js的版本
Apr 21 Javascript
webpack中使用iconfont字体图标的方法
Feb 22 Javascript
vue 开发一个按钮组件的示例代码
Mar 27 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
Aug 20 Javascript
js图片查看器插件用法示例
Jun 22 Javascript
JavaScript canvas实现雪花随机动态飘落
Feb 08 Javascript
jquery实现上传文件进度条
Mar 26 jQuery
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/13 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
2012/06/22 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
js Date概念详细介绍
2013/11/22 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
JS不完全国际化&amp;本地化手册 之 理论篇
2016/09/27 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
[47:50]Secret vs VP 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python单例模式实例详解
2017/03/01 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
Python新手学习装饰器
2020/06/04 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
澳大利亚时尚前卫设计师珠宝在线:Amber Sceats
2017/10/04 全球购物
仓库组长岗位职责
2014/01/29 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
开学典礼主持词
2014/03/19 职场文书
地球一小时倡议书
2014/04/15 职场文书
网站创业计划书
2014/04/30 职场文书
群众路线领导对照材料
2014/08/23 职场文书
班子个人四风问题整改措施
2014/10/04 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
清空 Oracle 安装记录并重新安装
2022/04/26 Oracle
基于Python实现西西成语接龙小助手
2022/08/05 Golang