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 相关文章推荐
Google Map API更新实现用户自定义标注坐标
Jul 29 Javascript
一句话JavaScript表单验证代码
Aug 02 Javascript
jquery星级插件、支持页面中多次使用
Mar 25 Javascript
node.js中的fs.realpath方法使用说明
Dec 16 Javascript
JS+CSS实现仿新浪微博搜索框的方法
Feb 24 Javascript
详解jQuery中的事件
Dec 14 Javascript
谈谈JavaScript数组常用方法总结
Jan 24 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
Apr 04 jQuery
使用ngrok+express解决本地环境中微信接口调试问题
Feb 26 Javascript
Node.js readline模块与util模块的使用
Mar 01 Javascript
vue fetch中的.then()的正确使用方法
Apr 17 Javascript
Vue+Element自定义纵向表格表头教程
Oct 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
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
JavaScript的9个陷阱及评点分析
2008/05/16 Javascript
JavaScript中的Array对象使用说明
2011/01/17 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
深入理解js数组的sort排序
2016/05/28 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
vue利用better-scroll实现轮播图与页面滚动详解
2017/10/20 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
2018/09/30 Javascript
node使用Mongoose类库实现简单的增删改查
2018/11/08 Javascript
JS Math对象与Math方法实例小结
2019/07/05 Javascript
DWR内存兼容及无法调用问题解决方案
2020/10/16 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
[15:56]Heroes18_暗影萨满(完美)
2014/10/31 DOTA
python实现FTP服务器服务的方法
2017/04/11 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
利用pyinstaller打包exe文件的基本教程
2019/05/02 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
2020/08/07 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
html5中嵌入视频自动播放的问题解决
2020/05/25 HTML / CSS
Paradigit比利时电脑卖场:购买笔记本、电脑、平板和外围设备
2016/11/28 全球购物
美国创意礼品网站:UncommonGoods
2017/02/03 全球购物
专业求职信撰写要诀
2014/02/18 职场文书
2014年接待工作总结
2014/11/26 职场文书
创先争优承诺书
2015/01/20 职场文书