js中点击事件可能产生的闭包
2016-12-17 16:52
411 查看
相信很多同学在写js的时候都遇到过闭包的问题,让我们先来看一个背景介绍,
有这样一组按钮,可能是成千上万个,他们需要一个点击事件来处理不同的情况,最暴力的办法是为每个按钮绑定一个事件,但这显然不是最佳的方法。那么最佳的方法是什么呢?假如他们每个按钮都有一个序号(我将这些按钮的id以升序排列,并存放在数组click_pops中,对应的button的id即为’#’+click_pops[i]),那么有人可能想对序号排序,然后对每个按钮添加绑定事件,大概是这样
可是这样真的可以嘛?不妨一试,你会看到这并不会像想象中的那样为每个按钮添加点击事件,这个问题的解答主要是由于ES5的作用域的问题,当进行过这层循环后,i的最终值为click_pops.length,所以只有#click_pops[click_pops.length]才绑定了点击事件,如果你仔细并理解了闭包,那么你可能就会有以下的想法了
这里就是用了闭包做了处理了,我们传入一个局部变量i,这样使得每次都是真的在为第i个元素绑定事件。
说到绑定事件,原生的绑定事件是这样的
有这样一组按钮,可能是成千上万个,他们需要一个点击事件来处理不同的情况,最暴力的办法是为每个按钮绑定一个事件,但这显然不是最佳的方法。那么最佳的方法是什么呢?假如他们每个按钮都有一个序号(我将这些按钮的id以升序排列,并存放在数组click_pops中,对应的button的id即为’#’+click_pops[i]),那么有人可能想对序号排序,然后对每个按钮添加绑定事件,大概是这样
for(var i = 0; i < click_pops.length; i ++){ $('#'+click_pops[i]).on('click',function(e){ toItsOwnFunc(i); }) }
可是这样真的可以嘛?不妨一试,你会看到这并不会像想象中的那样为每个按钮添加点击事件,这个问题的解答主要是由于ES5的作用域的问题,当进行过这层循环后,i的最终值为click_pops.length,所以只有#click_pops[click_pops.length]才绑定了点击事件,如果你仔细并理解了闭包,那么你可能就会有以下的想法了
for(var i = 0; i < click_pops.length; i ++){ $('#'+click_pops[i]).on('click',(function(i){ return function(){ toItsOwnFunc(i); } })(i)) }
这里就是用了闭包做了处理了,我们传入一个局部变量i,这样使得每次都是真的在为第i个元素绑定事件。
说到绑定事件,原生的绑定事件是这样的
function addEvent(obj,type,handle){ try{ // Chrome、FireFox、Opera、Safari、IE9.0及其以上版本 obj.addEventListener(type,handle,false); }catch(e){ try{ // IE8.0及其以下版本 obj.attachEvent('on' + type,handle); }catch(e){ // 早期浏览器 obj['on' + type] = handle; } } }
相关文章推荐
- js闭包解决多个点击事件
- JS 循环li添加点击事件 (闭包的应用)
- js 利用闭包循环给li绑定参数不同的点击事件
- JS 循环li添加点击事件 (闭包的应用)
- JS 循环绑定多个元素的点击事件时出现的闭包问题与解决方案
- Js阻止事件冒泡 弹出层后点击body区域层消失
- js事件参数和闭包
- js触发a标记的点击事件[转]
- js触发a标记的点击事件[转]
- js 鼠标点击事件及其它捕获
- JS右键点击事件
- JS右键点击事件
- 如何快速中断js事件(可能不是全部)
- 使用js写点击一个事件使页面返回顶部以及控制一个元素在右下角的固定位置的方法
- 模拟js的首页动态推荐页面 Gallery 自动播放 无限循环 指示器显示 点击事件
- js动态创建input元素,增加点击事件遇到的问题
- js 鼠标左右点击事件
- asp.net 中用js模拟Button点击事件
- 点击TreeView的定制图像不执行任何事件并且在js中找到TreeView节点的value值
- 监听浏览器关闭按钮点击事件 -- 使用JS