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实现鼠标点击文本框显示隐藏提示文本
Feb 23 Javascript
JavaScript中的类(Class)详细介绍
Dec 30 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
Jan 24 Javascript
浅析BootStrap模态框的使用(经典)
Apr 29 Javascript
JS及PHP代码编写八大排序算法
Jul 12 Javascript
浅谈js中StringBuffer类的实现方法及使用
Sep 02 Javascript
JavaScript 中 avalon绑定属性总结
Oct 19 Javascript
原生js图片轮播效果实现代码
Oct 19 Javascript
微信小程序 picker-view 组件详解及简单实例
Jan 10 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
Feb 04 Javascript
走进AngularJs之过滤器(filter)详解
Feb 17 Javascript
angularjs1.5 组件内用函数向外传值的实例
Sep 30 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
ASP和PHP都是可以删除自身的
2007/04/09 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
php利用事务处理转账问题
2015/04/22 PHP
在IE下获取object(ActiveX)的Param的代码
2009/09/15 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
JavaScript对象创建及继承原理实例解剖
2013/02/28 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
jQuery插件pagination实现无刷新分页
2016/05/21 Javascript
Extjs 点击复选框在表格中增加相关信息行
2016/07/12 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
JS数组splice操作实例分析
2019/10/12 Javascript
python基础教程之元组操作使用详解
2014/03/25 Python
Python中常用操作字符串的函数与方法总结
2016/02/04 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
临床医学系毕业生推荐信
2013/11/09 职场文书
中专生的个人自我评价
2013/12/11 职场文书
办公室助理岗位职责
2013/12/25 职场文书
护林防火标语
2014/06/27 职场文书
法制教育演讲稿
2014/09/10 职场文书
百年孤独读书笔记
2015/06/29 职场文书
《祁黄羊》教学反思
2016/02/20 职场文书
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server
Js类的构建与继承案例详解
2021/09/15 Javascript
vue elementUI批量上传文件
2022/04/26 Vue.js