浅谈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 Array数组对象的扩展函数代码
May 22 Javascript
JS实现的省份级联实例代码
Jun 24 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
Jul 14 Javascript
js和php如何获取当前url的内容
Sep 22 Javascript
Javascript通过overflow控制列表闭合与展开的方法
May 15 Javascript
javascript中数组和字符串的方法对比
Jul 20 Javascript
微信小程序 教程之小程序配置
Oct 17 Javascript
微信小程序 底部导航栏目开发资料
Dec 05 Javascript
div实现自适应高度的textarea实现angular双向绑定
Jan 08 Javascript
Mongoose经常返回e11000 error的原因分析
Mar 29 Javascript
AngularJS中controller控制器继承的使用方法
Nov 03 Javascript
详解如何为你的angular app构建一个第三方库
Dec 07 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默认安装产生系统漏洞
2006/10/09 PHP
实用函数8
2007/11/08 PHP
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
提升PHP性能的21种方法介绍
2013/06/25 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
php实现Linux服务器木马排查及加固功能
2014/12/29 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
JS批量操作CSS属性详细解析
2013/12/16 Javascript
jquery修改属性值实例代码(设置属性值)
2014/01/06 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
Element Table的row-class-name无效与动态高亮显示选中行背景色
2018/11/30 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
javascript中可能用得到的全部的排序算法
2020/03/05 Javascript
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
python用来获得图片exif信息的库实例分析
2015/03/16 Python
Python中的random()方法的使用介绍
2015/05/15 Python
使用Python多线程爬虫爬取电影天堂资源
2016/09/23 Python
python实现七段数码管和倒计时效果
2019/11/23 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
Sql面试题
2013/03/20 面试题
高级方案规划工程师岗位职责
2013/11/29 职场文书
区域销售经理职责
2013/12/22 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
咖啡店创业计划书范文
2014/09/15 职场文书
毕业设计致谢语
2015/05/14 职场文书
导游词之新疆-喀纳斯
2019/10/10 职场文书
基于flask实现五子棋小游戏
2021/05/25 Python
基于Python实现对比Exce的工具
2022/04/07 Python