<script>
var severalObj=window.document.getElementsByName("button");
for(var i=0;i<several.length.i++){
severalObj[i].onclick(){
alert(i);
}
}
</script>

通常我们在前端中要为若干个节点添加相同的事件,为了减少代码量便想出使用上面的代码对这些节点进行循环绑定事件。然而事情并未像之前预想到的那样,实验后会发现无论点击哪个元素都会弹出several.length,而不是我们之前预想的i。这正是闭包(匿名函数)要使用外部作用于中变量的结果。而却,这也是由于匿名函数本身无法传递参数(故无法维护自己的作用域)造成的。

当函数调用外部变量是就构成一个闭包,里面的变量会受到别的地方影响,所以解决的方式为:构建一个只有该匿名函数本身才可以访问的闭包,保存只供本身使用的变量。

for(var i=0;i<severalObj.length;i++){
(function(i){
severalObj[i].onclick=function(){......}
})(i);
}

上面创建了匿名函数,从而构建了一个新的作用域。匿名函数需要传一个参数,所以在执行的时候需要传一个参数。也正是通过这个参数维护了中间状态。

转载:http://www.cnblogs.com/maxigang/p/5578040.html

js闭包解决多个点击事件的更多相关文章

  1. (转载)js(jquery)的on绑定点击事件执行两次的解决办法

    js(jquery)的on绑定点击事件执行两次的解决办法—不是事件绑定而是事件冒泡 遇到的问题:jquery中用.on()给页面中新加的元素添加点击事件时,点击事件源,绑定的事件执行两次,这里的ale ...

  2. JS实现按下按键触发点击事件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. cocos2d-x JS 获取当前系统时间(解决屏幕双击点击事件)

    记录一下,好开心,感觉今天自己又学到东西了,对于屏幕双击事件本来还毫无头绪的,今天得以解决总算没白费加班,其实原理很简单:就是在点击事件里做一个判断,这个判断就是需要获取当前系统的时间的毫秒差,第一次 ...

  4. 利用闭包解决for循环里onclick事件不能捕捉实时i值问题

    问题描述 我们都知道,如果我们对于一组元素(相同的标签)同时进行onclick事件处理的时候(在需要获取到索引的时候),一般是写一个for循环,但是onclick是一个异步调用的,所以会带来一个问题, ...

  5. js动态替换数据的点击事件

    做项目时遇到的,具体是界面如下图:当点击X号时,出现删除.取消按钮,当点击删除时,这一行删除,当点击取消时又恢复到初始状态. 需要关注的问题是,js动态添加的删除.取消按钮的点击事件.当点击取消时恢复 ...

  6. js和jquery触发按钮点击事件

    js触发按钮点击事件 function load(){ //下面两种方法效果是一样的 document.getElementById("target").onclick(); do ...

  7. vue中解决拖动和点击事件的冲突

    BUG说明: 鼠标上下方向拖拽,如果松开时鼠标位于悬浮按钮上会默认执行click事件,经验证,click事件与mouse事件的执行顺序为onmousedown =>onmouseup => ...

  8. js(jquery)解决input元素的blur事件和其他非表单元素的click事件冲突的方法

    HTML结构:很简单,就一个input,一个div,能说明问题就OK了: <input type="text" value="默认值"><br ...

  9. JS闭包导致循环给按钮添加事件时总是执行最后一个

    加入如下脚本代码: <script> var list_obj = document.getElementsByTagName('li'); for (var i = 0; i <= ...

随机推荐

  1. 开源you-get项目爬虫,以及基于python+selenium的自动测试利器

    写在前面 爬虫和自动测试,对于python来说是最合适不过也是最擅长的. 开源的项目也很多,例如you-get项目https://github.com/soimort/you-get.盗链和爬虫神器. ...

  2. 经典i++和++i问题(附带运算符优先级问题)

    转自 https://blog.csdn.net/mustard1020/article/details/79617865 1.i++和++i的区别     (1)i++简单来说就是先用i的值来参加表 ...

  3. Django学习系列19:完成最简单可用的网站——确保功能之间相互隔离

    前面遗留的问题,首先时功能测试运行结束后的清理:其次是目前我们的待办清单只允许创建一个大家公用的清单. 如何隔离测试,运行功能测试后待办事项一直存在于数据库中,这会影响下一次测试. 运行单元测试时,D ...

  4. css3正方体

    使用animation和调整页面角度做出来 <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  5. 【构造 meet in middle 随机 矩阵树定理】#75. 【UR #6】智商锁

    没智商了 变式可见:[构造 思维题]7.12道路建设 当你自信满满地把你认为的正确密码输入后,时光机滴滴报警 —— 密码错误.你摊坐在了地上. 黑衣人满意地拍了拍你的肩膀:“小伙子,不错嘛.虽然没解开 ...

  6. White-Label Apps

    转载:https://www.vendasta.com/blog/white-label-apps What are white-label apps? White-label apps are ap ...

  7. 使用 Drag and Drop 给Web应用提升交互体验

    什么是 Drag and Drop (拖放)? 简单来说,HTML5 提供了 Drag and Drop API,允许用户用鼠标选中一个可拖动元素,移动鼠标拖放到一个可放置到元素的过程. 我相信每个人 ...

  8. 卸载nginx

    sudo apt-get remove nginx nginx-common # 卸载删除除了配置文件以外的所有文件. sudo apt-get purge nginx nginx-common # ...

  9. Acwing-203-同余方程(扩展欧几里得)

    链接: https://www.acwing.com/problem/content/205/ 题意: 求关于x的同余方程 ax ≡ 1(mod b) 的最小正整数解. 思路: 首先:扩展欧几里得推导 ...

  10. Netty入门 零基础

    因为接下来的项目要用到netty,所以就了解一下这个程序,奈何网上的教程都是稍微有点基础的,所以,就写一篇对于netty零基础的,顺便也记录一下. 先扔几个参考学习的网页: netty 官方API:  ...