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

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

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

  

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

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

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

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

  1. var num=[0,0,0];
  2. for(var i=0;i<length;i++){
  3. elem[i].onmouseenter=function(x){
  4. return function(){num[x]++};
  5. }(i);
  6. elem[i].onmouseout=function(x){
  7. return function(){num[x]--;conle.log(num[i]);};
  8. }(i);
  9. }

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

  

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

  是不是简单多了,第一、不用闭包了,第二、需要用统一的数组来管理了。为什么呢?因为上面的写法其实是吧事件绑定统一放在各自的匿名函数中。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. redis第一篇--综述

    1 redis里边有数据库的概念.可分为1-255这些表.在存储或者查找的时候要指明. redis_sentinel 集群里边封装成了namespace这样的概念.与db是不一样的.

  2. WebForm(aspx,cs,dll之间的关系)

    WebForm分为两个文件aspx和aspx.cs,aspx是页面模板,是页面描述文件,就是html的内容,和aspx结合的更好,不用像一开始那样程序员自己去填充模板,控件都是定义在aspx中,内联的 ...

  3. ul li排版 左右对齐

    定义两个ul的class, 一个向左浮动, 一个向右浮动 #navtop{      width:100%;      height:46px;      background-color:#ecf0 ...

  4. ASP.NET 会话状态的模式

    ASP.NET 会话状态为会话数据提供了几个不同的存储选项.每个选项都通过一个 SessionStateMode 枚举值进行识别.如下列表中描述了可用的会话状态模式: InProc 模式:把会话状态存 ...

  5. mongodb启动

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案.MongoDB是一款分布式文档数据库,支持类似关型数据库的主从结构,文档以二进制J ...

  6. WPF子窗体:ChildWindow

    wpf的子窗体选择有很多种,如最常见的是项目新建窗体(Window)作为子窗体 ,或者新建wpf用户控件(UserControl).而其实利用Xceed.Wpf.Toolkit.dll 可以轻松布局如 ...

  7. 运用Merge Into实现增加或更新数据

    declare @SqlStr as nvarchar(max) set @SqlStr=N'Merge Into [Categories] t USING(VALUES (9,''rice'','' ...

  8. 【最长下降子序列的长度和个数】 poj 1952

    转自http://blog.csdn.net/zhang360896270/article/details/6701589 这题要求最长下降子序列的长度和个数,我们可以增加数组maxlen[size] ...

  9. FRAM 铁电存储器

    铁电存储器与传统存储器的区别. 一:易失性的存储器包括静态存储器SRAM和动态存储器DRAM.           优点:读写速度快,读写寿命无次数限止.           缺点:掉电会丢失数据.  ...

  10. 一个经典的PHP验证码类分享

    我们通过PHP的GD库图像处理内容,设计一个验证码类Vcode.将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现 的细节封装在该类中.只要在创建对象时,为构造方法提供三 ...