浅谈JS闭包中的循环绑定处理程序


Posted in Javascript onNovember 09, 2014

前几天工作中写前端js代码时,遇到了遍历元素给它添加单击事件。就是这个问题让我整整调了一个下午。最后还是下班回家,上网查资料才知道怎么解决的。 (PS:之前也在《jQuery基础教程》第四版中看过讲循环绑定处理程序的内容,当时估计也没怎么用心看,所以没记起来。)

大神要是知道这类情况,可以关掉窗口,写这些主要是给像我一样的小白看的。谢谢!

先贴上错误的例子让大家看看。(例子里面用到jQuery,请导入jQuery库)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

<title>循环绑定处理程序</title> 

<script src="js/jquery-2.1.1.min.js"></script> 

<script type="text/javascript"> 


$(function(){ 



for(var i=1;i<=4;i++){ 




$("#btn"+i).get(0).onclick=function(){ 





alert(i); 




} 



} 


}); 

</script> 

</head> 

<body> 

<button id="btn1">按钮1</button> 

<button id="btn2">按钮2</button> 

<button id="btn3">按钮3</button> 

<button id="btn4">按钮4</button> 

</body> 

</html>

 

这段代码运行之后,点击按钮,弹出的alert中显示数据几呢,我之前一直认为按钮1到按钮4,对应的alert中的数字也是1到4。要是你也这样想,那就错了。

点击每个按钮,alert中都是显示数字4,没想到吧!

现在写几种解决方案,共大家参考 !

第一种、编写一个function,在这个function中返回一个函数

<script type="text/javascript"> 
$(function(){ 


for(var i=1;i<=4;i++){ 



$("#btn"+i).get(0).onclick=btnClick(i);



} 

}); 

var btnClick=function(value){ 


return function(){ 



alert(value); 


} 

} 

</script>

第二种、使用立即调用函数表达式

(function(value){

//代码块

})(i)//这就是立即调用函数表达式

<script type="text/javascript"> 
$(function(){ 


for(var i=1;i<=4;i++){ 



$("#btn"+i).get(0).onclick=(function(value){ 




return function(){ 




alert(value); 



} })(i);



} 

}); 

</script>

 

第三种、使用jQuery的each函数

<script type="text/javascript"> 
$(function(){ 


$.each([1,2,3,4],function(index,value){ 




$("#btn"+value).get(0).onclick=function(){ 




alert(value); 



} 


}); 

}); 

</script>

使用上面三种情况,就可以避免一开始那个情况了。

其中get(0)指的是将jQuery对象转为DOM对象。

以上就是个人对JS闭包中的循环绑定处理程序的理解,分享给大家,希望能对小伙伴们有所帮助

Javascript 相关文章推荐
Prototype String对象 学习
Jul 19 Javascript
JavaScript中的noscript元素属性位置及作用介绍
Apr 11 Javascript
gridpanel动态加载数据的实例代码
Jul 18 Javascript
javascript删除字符串最后一个字符
Jan 14 Javascript
JavaScript实现动态删除列表框值的方法
Aug 12 Javascript
js实现横向伸展开的二级导航菜单代码
Aug 28 Javascript
JS验证图片格式和大小并预览的简单实例
Oct 11 Javascript
微信小程序 利用css实现遮罩效果实例详解
Jan 21 Javascript
微信小程序tabbar不显示解决办法
Jun 08 Javascript
Angular项目中$scope.$apply()方法的使用详解
Jul 26 Javascript
vue打包使用Nginx代理解决跨域问题
Aug 27 Javascript
示例vue 的keep-alive缓存功能的实现
Dec 13 Javascript
jQuery函数map()和each()介绍及异同点分析
Nov 08 #Javascript
js跨域问题浅析及解决方法优缺点对比
Nov 08 #Javascript
js 操作符汇总
Nov 08 #Javascript
jquery的总体架构分析及实现示例详解
Nov 08 #Javascript
jquery常用方法及使用示例汇总
Nov 08 #Javascript
JQuery遍历json数组的3种方法
Nov 08 #Javascript
JQuery中使用.each()遍历元素学习笔记
Nov 08 #Javascript
You might like
php使用标签替换的方式生成静态页面
2015/05/21 PHP
如何使用PHP对网站验证码进行破解
2015/09/17 PHP
一款JavaScript压缩工具:X2JSCompactor
2007/06/13 Javascript
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
Javascript的this用法
2017/01/16 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
vue子路由跳转实现tab选项卡
2019/07/24 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
2020/12/14 Vue.js
[02:23]2016国际邀请赛中国区预选赛wings晋级之路
2016/06/29 DOTA
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
python根据unicode判断语言类型实例代码
2018/01/17 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
Python更换pip源方法过程解析
2020/05/19 Python
美国摄影爱好者购物网站:Focus Camera
2016/10/21 全球购物
伦敦最有品味的百货:Liberty London
2016/11/12 全球购物
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
大学生水果店创业计划书
2014/01/28 职场文书
工厂保安员岗位职责
2014/01/31 职场文书
单位活动策划方案
2014/08/17 职场文书
政府四风问题整改措施
2014/10/04 职场文书
老人再婚离婚协议书范本
2014/10/27 职场文书
2016元旦文艺汇演主持词
2015/07/06 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书
vue首次渲染全过程
2021/04/21 Vue.js
Golang 正则匹配效率详解
2021/04/25 Golang