以前总觉得自己写的代码不太规范,尤其是写原生的时候。举个例子:

  要为页面上所有".a"的元素绑定事件,当然了用jquery很方便:$('.a').bind("click",fn);

原生的话,我们很多会这样写:

  

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

    但是如果,我要连续绑定两个事件呢?

for(var i=0;i<length;i++){
elem[i].onmouseenter=function(x){
return function(){}
}(i); elem[i].onmouseout=function(x){
return function(){}
}(i); }

  好吧,到目前为止这种写法都木有问题,但是,如果我要在绑定的这个函数中进行关联计算呢?如enter后+1,out后—1,继续:

var num=[0,0,0];
for(var i=0;i<length;i++){
elem[i].onmouseenter=function(x){
return function(){num[x]++};
}(i);
elem[i].onmouseout=function(x){
return function(){num[x]--;conle.log(num[i]);};
}(i);
}

  我们引入了一个数组,也就是三个num结合闭包来解决问题,为什么?因为不得不这么做,如果只用一个num就不同元素事件触发后num的值就混乱了。那么我们来换一种写法。

  

Array.prototype.forEach.call(elems,function(elem,i){
  var num;
  elem.onmouseenter=function(){num++};
  elem.onmousout=function(){num--;consle.log(num)};
});

  是不是简单多了,第一、不用闭包了,第二、需要用统一的数组来管理了。为什么呢?因为上面的写法其实是吧事件绑定统一放在各自的匿名函数中。js会自动对每个num进行缓存,节省了命名空域。

  类似的如果事件绑定之间存在大量的相互运算(time,num等),并且需要循环绑定,都可以采用这种方法,简单高效!

  

dom元素循环绑定事件的技巧的更多相关文章

  1. 动态生成的dom元素如何绑定事件

    两种类型1.$('li').bind('click',function(){}); 当你用js动态添加li的时候,你添加的li不具有你绑定的事件.这种写法与$('li').click(function ...

  2. JS闭包机制实现为DOM元素循环添加事件

    HTML代码: <button type='button' class='btn' id='1'>按钮1</button> <button type='button' c ...

  3. 如何在通过knockout数据绑定的DOM元素上添加事件

    通过knockout数据绑定的DOM元素,通过chrome控制台打断点知道,DOM元素会被暂时隐藏,使用document.querySelector()是获取不到的,会显示null,直到数据绑定完成才 ...

  4. jQuery查看dom元素上绑定的事件列表

        jQuery API提供了一种能够查看元素已绑定事件的列表,这个功能在进行功能调试的时候特别有用,尤其确定在代码执行过程中元素绑定的事件是否被更改. 1: jQuery( elem ).dat ...

  5. 【原生js】js动态添加dom,如何绑定事件

    首先要明白浏览器在加载页面的时候是按顺序来加载的,这样以来就很清楚了,js动态添加dom以后,这些dom并没有绑定事件,这个时候最简单的一个办法就是:将绑定事件的方法封装到一个函数A中,在动态添加完d ...

  6. JavaScript利用闭包循环绑定事件

    我们经常在做前端面试题的时候,会遇到循环绑定事件后,输出打印结果,很多人总是搞不清楚,今天借此机会跟大家梳理一下闭包相关作用. 1.首先我们举一个简单的例子. html部分: <a href=& ...

  7. jquery 动态创建的元素,绑定事件无效之解决方法

    今天遇到一个问题,动态创建的元素,绑定事件无效,如下: js 代码如下: var OaddX = $('.detright div.duibi div.duibox ul li span'); // ...

  8. 【jquery】 在异步加载的元素上绑定事件

    最近因为工作关系又重新回归到了jquery的怀抱,发现很多jquery的一些细节处理的部分都忘记了.这里记录一下最近在做项目时频繁遇到的一个问题:给异步加载的元素添加事件绑定. 问题发生的前提是项目前 ...

  9. event.target 属性返回哪个 DOM 元素触发了事件。

    <ul> <li>list <strong>item 1</strong></li> <li><span>list ...

随机推荐

  1. crossdomain 可用

    <cross-domain-policy> <allow-access-from domain="*"/> <allow-http-request-h ...

  2. linux脚本定期执行

    vi /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # .----------- ...

  3. tomcat连接数设置

    如何加大tomcat连接数 在tomcat配置文件server.xml中的<Connector ... />配置中,和连接数相关的参数有:minProcessors:最小空闲连接线程数,用 ...

  4. 【转】4G手机打电话为什么会断网 4G上网和通话不能并存原因分析

    与2G/3G相比,4G最大的特色就是提供了超过100Mbps的峰值速率,既然速度都可以秒掉20M的光纤固网了,那用来语音通话不就更是小菜一碟了吗?很遗憾,问题就出现在了这里. 由于目前的LTE网络(4 ...

  5. 准备着手学习python

    1. python 的框架 Tornado 网址: http://www.tornadoweb.org/en/stable/ github: https://github.com/tornadoweb ...

  6. call_grant_dml.sql

    set echo offpromptprompt =========================================================================== ...

  7. JSTL判断list的size()大小

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ tag ...

  8. Ubuntu配置eclipse

    1.安装jdk 去官网下载最新版jdk,目前是 jdk-8u45-linux-x64.tar.gz 创建Java的目标路径文件夹,这里我们放在/usr/lib/jvm下面.在终端下操作: sudo m ...

  9. contentHorizontalAlignment 属性浅析

    转载自:http://blog.csdn.net/s0228g0228/article/details/46832285 最近在iOS 7以上总是碰到导航条上左右按钮距离边距太大的问题 为了解决这个这 ...

  10. jenkins插件 build-name-setter

    #${BUILD_NUMBER}-${PROJECT_NAME}-${ENV,var="VARIABLENAME"}-${ENV,var="BUILD_USER" ...