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

  要为页面上所有".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. HDU2504:又见GCD

    Problem Description 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c.   Input ...

  2. VS2012+EF6+Mysq

    为了学习ORM,选择了EntityFramework,经历了三天两夜的煎熬,N多次错误,在群里高手的帮助下,终于成功,现在将我的心路历程记录下来,一是让自己有个记录,另外就是让其它人少走些弯路. 我的 ...

  3. C++中为什么构造函数初始化列表

    已经有个构造函数负责初始化,为什么还需要构造函数初始化表呢? 在以下三种情况下需要使用初始化成员列表:一,需要初始化的数据成员是对象的情况:二,需要初始化const修饰的类成员:三,需要初始化引用成员 ...

  4. .Net配置错误页

    1.在web.config中,配置customErrors节,在子节点error中,可以对特定的错误码,进行错误也配置. 配置举例如下: <customErrors mode="Rem ...

  5. 关于WIFI DIRECT功能的

    http://processors.wiki.ti.com/index.php/WiFi_Direct_Configuration_Scripts#p2p_find      https://wire ...

  6. HTTPclient cookie的获取与设置

    因为代码与Java用apache的HttpClient发送Post请求大部份重复,所以就不贴整段代码了,只把不同的地方贴出来.发送Cookie就必须先得到Cookie,所以至少发送两次请求,第一次用于 ...

  7. drupal7 分页

    $output = ""; $query = db_select('feedback','f')->extend('PagerDefault');//->extend( ...

  8. Dominating Patterns

    Dominating Patterns Time Limit:3000MS   Memory Limit:Unknown   64bit IO Format:%lld & %llu Descr ...

  9. Setting DPDK+OVS+QEMU on CentOS

    Environment Build Step: these packages are needed for building dpdk+ovs: yum install -y make gcc gli ...

  10. TForm类有关属性简介

    http://www.cnblogs.com/pchmonster/archive/2012/01/02/2310377.html