JS 循环绑定多个元素的点击事件时出现的闭包问题与解决方案
来源:互联网 发布:淘宝客微信怎么加人 编辑:程序博客网 时间:2024/06/06 10:02
昨天在循环绑定多个a标签的点击事件时出现了不少问题,首先是 js 的典型闭包问题,这个还好以前也遇到过,于是很快解决了,但是在为多个a标签绑定点击事件成功之后,本来以为就大功告成了,结果居然是在页面加载时就自动全部a标签的点击事件自动触发了,很纳闷!!!至今还是没搞明白。测试后发现貌似是使用了闭包时才会导致此问题的发生,以下是自己写的一段建议的测试代码(仅为了说明问题而已,所以较为简陋!):
<html><body> <input type="text" value="请点击下列的a标签" readonly="readonly"><br/> <a href="javascript:void(0)" class="testA">1</a><br/> <a href="javascript:void(0)" class="testA">2</a><br/> <a href="javascript:void(0)" class="testA">3</a><br/> <a href="javascript:void(0)" class="testA">4</a><br/> <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.6.4/jquery.min.js"></script></body></html><script type="text/javascript"> for(var i=0;i<$('.testA').length;i++){ $('.testA')[i].onclick = (function(index){ alert("测试:"+index); })(i); }</script>上述代码虽然解决了JS的闭包问题(将 i 变量传递给了 index 变量,使得 onclick 内部可以使用外部的 i 变量),但是导致点击事件自动触发,百度之后也没解决;后来想到一个办法即利用a标签的属性来传递值,当你要给绑定的多个a标签循环赋值一个数组时可以考虑这种方法,以下是js代码:
<script type="text/javascript"> var content = ['a','b','c','d']; for(var i=0;i<$('.testA').length;i++){ $('.testA')[i].name = content[i];//给name属性赋值 $('.testA')[i].onclick = function(){ return handle(this);//这里不使用闭包但要获取content[i]的值可以通过上面设置的属性获取。 }; } function handle(a){ alert($(a).attr('name')); /* 相关处理逻辑 */ }</script>虽然问题解决了,但是闭包应该也是可以的,于是百度后发现一种新的写法,如下就不会产生自动触发点击事件的诡异问题了,真的是我写搓了,正确示范如下:
for(var i=0;i<$('.testA').length;i++){ (function(i){ $('.testA')[i].onclick = function() { alert("测试闭包:"+i); }; })(i); }后来还发现一个更溜的东西,直接解决了js的闭包问题,即使用关键字let 定义变量,解释如下:
于是可以将上述代码改写如下:
for(var i=0;i<$('.testA').length;i++){ let index = i; $('.testA')[i].onclick = function(){ alert("测试:"+index); }; }普通写法是会导致 js 闭包问题的,如下:
for(var i=0;i<$('.testA').length;i++){ $('.testA')[i].onclick = function(){ alert("测试:"+i);//==$('.testA').length }; }
执行结果都是同个值即循环结束条件 i 的值。
忽然发现使用 $('..').each() 来循环是可以避开闭包问题的:
$('.testA').each(function(i,v){ $(this).bind('click',function(){ alert("测试:"+i); }); });
好了,以上就是全部总结了!
阅读全文
0 0
- JS 循环绑定多个元素的点击事件时出现的闭包问题与解决方案
- JS中for循环出现的问题:如何给li元素绑定事件,点击每个li元素弹出对应的索引?
- js 利用闭包循环给li绑定参数不同的点击事件
- js新增元素绑定事件的问题
- 为未出现的DOM元素绑定事件解决方案
- 一个元素绑定多个点击事件
- js循环绑定事件解决方案
- js循环绑定事件解决方案
- js循环绑定事件解决方案
- js处理一个div里面多个点击事件时出现的事件冲突 重复的解决方法 事件冒泡
- for循环绑定事件与闭包
- 父元素与子元素的点击事件影响问题
- Vue同一个dom元素如何绑定多个点击事件?
- jquery on() 给js动态新添加的元素 绑定的点击事件。
- JavaScript绑定事件时的闭包问题
- JavaScript绑定事件时的闭包问题
- JavaScript 绑定事件时的闭包问题
- JS 生成的元素事件绑定注意事项
- POJ3278 Catch That Cow
- 操作系统-页面置换算法-最佳置换算法
- 两年JAVA程序员的面试总结
- WAMP的多站点设置
- Ubuntu 配置NFS-Server
- JS 循环绑定多个元素的点击事件时出现的闭包问题与解决方案
- 递归算法堆栈溢出
- 第二十四天总结
- Hadoop三种运行模式
- 十三周 项目1(2)
- Mqtt之发布响应消息PUBACK和PUBREC
- Qt自定义QML模块
- unity中WWW读取xml
- 二叉树