浅谈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 相关文章推荐
javascript 自动填写表单的实现方法
Apr 09 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
Jun 23 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
Sep 21 Javascript
jQuery实现炫酷的鼠标轨迹特效
Feb 01 Javascript
jquery动态改变div宽度和高度
Feb 09 Javascript
javascript中setTimeout使用指南
Jul 26 Javascript
整理Javascript基础语法学习笔记
Nov 29 Javascript
javascript轮播图算法
Oct 21 Javascript
使用Vue.js创建一个时间跟踪的单页应用
Nov 28 Javascript
JS高级运动实例分析
Dec 20 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
Jan 04 Javascript
JS数组操作中的经典算法实例讲解
Jul 26 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实现的增强性mhash函数
2015/05/27 PHP
yii数据库的查询方法
2015/12/28 PHP
PHP中抽象类和抽象方法概念与用法分析
2016/05/24 PHP
smarty的section嵌套循环用法示例
2016/05/28 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
javascript遍历json对象的key和任意js对象属性实例
2017/03/09 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
fullPage.js和CSS3实现全屏滚动效果
2017/05/05 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
微信小程序canvas.drawImage完全显示图片问题的解决
2018/11/30 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
解决vue admin element noCache设置无效的问题
2019/11/12 Javascript
[07:09]2014DOTA2国际邀请赛-Newbee再次发威成功晋级决赛
2014/07/19 DOTA
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
django-rest-framework解析请求参数过程详解
2019/07/18 Python
Pytorch 使用不同版本的cuda的方法步骤
2020/04/02 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
美国滑板店:Tactics
2020/11/08 全球购物
cf收人广告词大全
2014/03/14 职场文书
职业生涯规划书前言
2014/04/15 职场文书
国庆横幅标语
2014/10/08 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
PyTorch的Debug指南
2021/05/07 Python
Python进程间的通信之语法学习
2022/04/11 Python
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL