浅谈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 相关文章推荐
Packer 3.0 JS压缩及混淆工具 下载
May 03 Javascript
js中的异常处理try...catch使用介绍
Sep 21 Javascript
JQuery伸缩导航练习示例
Nov 13 Javascript
无限树Jquery插件zTree的常用功能特性总结
Sep 11 Javascript
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
Aug 26 Javascript
Bootstrap按钮下拉菜单组件详解
May 10 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
Oct 17 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
Jun 12 jQuery
Vue中computed、methods与watch的区别总结
Apr 10 Javascript
JavaScript实现五子棋游戏的方法详解
Jul 08 Javascript
vue实现淘宝购物车功能
Apr 20 Javascript
vue使用watch监听属性变化
Apr 30 Vue.js
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编码转换
2012/11/05 PHP
php代码架构的八点注意事项
2016/01/25 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
js 转义字符及URI编码详解
2017/02/28 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
requirejs + vue 项目搭建详解
2017/06/16 Javascript
js中值引用和地址引用实例分析
2019/06/21 Javascript
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
2019/12/27 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
vue+高德地图实现地图搜索及点击定位操作
2020/09/09 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
详解Python中的Cookie模块使用
2015/07/06 Python
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
用python实现k近邻算法的示例代码
2018/09/06 Python
python dict 相同key 合并value的实例
2019/01/21 Python
python版百度语音识别功能
2019/07/09 Python
python全局变量引用与修改过程解析
2020/01/07 Python
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
SQL Server笔试题
2012/01/10 面试题
新闻编辑自荐信
2013/11/03 职场文书
会计岗位职责模板
2014/03/12 职场文书
建筑院校毕业生求职信
2014/06/13 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
安全生产培训心得体会
2016/01/18 职场文书
pyqt5打包成exe可执行文件的方法
2021/05/14 Python
oracle设置密码复杂度及设置超时退出的功能
2022/06/28 Oracle