浅谈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 相关文章推荐
jQuery 使用手册(四)
Sep 23 Javascript
基于JQuery实现CheckBox全选全不选
Jun 27 Javascript
js动态设置div的值下例子
Oct 29 Javascript
json与jsonp知识小结(推荐)
Aug 16 Javascript
json的结构与遍历方法实例分析
Apr 25 Javascript
JS实现数组按升序及降序排列的方法
Apr 26 Javascript
JavaScript算法教程之sku(库存量单位)详解
Jun 29 Javascript
Vue.js划分组件的方法
Oct 29 Javascript
详解如何构建一个Angular6的第三方npm包
Sep 07 Javascript
Vue点击切换颜色的方法
Sep 13 Javascript
原生js实现瀑布流效果
Mar 09 Javascript
详解小程序横屏方案对比
Jun 28 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
Smarty+QUICKFORM小小演示
2007/02/25 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
2014/03/28 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
jQuery获取页面元素绝对与相对位置的方法
2015/06/10 Javascript
Augularjs-起步详解
2016/07/08 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
2018/01/11 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
python 动态加载的实现方法
2017/12/22 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
美国糖果店:Sugarfina
2019/02/21 全球购物
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
群胜软件Java笔试题
2012/09/29 面试题
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
入党转预备思想汇报
2014/01/07 职场文书
六一儿童节活动策划方案
2014/01/27 职场文书
连锁超市项目计划书
2014/09/15 职场文书
六年级学生期末评语
2014/12/26 职场文书
2015年综治宣传月活动总结
2015/03/25 职场文书
oracle通过存储过程上传list保存功能
2021/05/12 Oracle
Win11怎么把合并的任务栏分开 Win11任务栏合并分开教程
2022/04/06 数码科技