体验更优排版请移步原文http://blog.kwin.wang/programming/js-event-delegation.html

事件代理,又称事件委托(Delegation),就是将处理事件委派到父元素或者顶级元素上,利用事件的冒泡机制,管理某一类型元素上的所有事件。

要理解这个概念,必须先对事件模型有个初步的了解。W3C定义的DOM2.0标准事件模型分为三个阶段:

  1. 捕获阶段
  2. 目标阶段
  3. 冒泡阶段

捕获阶段:当某个元素触发事件时,顶层对象document会发出一个事件流,随着DOM树向着目标元素流去直到到达目标元素,途径的元素如果绑定了事件,在这个阶段是不会执行的;
目标阶段:事件流找到了目标元素,执行目标元素相应的处理函数,如果没有绑定任何事件,则不执行;
冒泡阶段:事件流从目标元素向顶层元素折回,遇到绑定事件,即执行(该阶段在IE6中不存在);

因此我们发现,在元素绑定事件时,完全可以绑定在该元素的任一上级元素上再进行事件处理即可。那么,事件代理具体怎么应用呢?

例如,页面中有这样一个无序列表,需要给每个li添加点击事件,弹出相应内容,如果我们通过for循环为每个li单独绑定click事件,由于元素数量过多无疑会造成网页性能下降,有内存泄露的风险。

1
2
3
4
5
6
7
8
 
<ul id="ul-test">
<li id="li-1">11</li>
<li id="li-2">22</li>
<li id="li-3">33</li>
<li id="li-4">44</li>
<li id="li-5">55</li>
</ul>

如果将click事件绑定在ul元素上,

1
2
3
4
5
6
7
8
9
10
11
12
13
window.onload = function(){
  var ulEle = document.getElementById("ul-test");
  ulEle.onclick = function(ev){
    var ev = ev || window.event;
    var target = ev.target || ev.srcElement;
    if(target.nodeName.toLowerCase() == 'li'){
      alert(target.innerHTML);
      if(target.id == 'li-3'){
       alert('click li-3');
      }
    }
  }
}

上述代码中,我们只需要绑定一次事件,通过Event对象的target属性返回事件源(即事件的目标节点),可以做不同的处理,这就是事件代理,原本需要目标元素处理的事件,交由其父元素代为执行。采用事件代理避免了频繁的操作DOM,优化效果可想而知。

以上只是对事件代理的基本认识和应用,更深层次应用有待挖掘。

什么是事件代理?DOM2.0标准事件模型的三个阶段的更多相关文章

  1. [已转移]IE事件流和DOM标准事件流的区别

    该文章已转移到博客:https://cynthia0329.github.io/ 1.执行的顺序不一样 冒泡型事件模型: button->div->body (IE事件流) 捕获型事件模型 ...

  2. JS 事件代理

    事件处理器:onclick.onmouseover.... 在传统的事件处理中,你需要为每一个元素添加或者是删除事件处理器.然而,事件处理器将有可能导致内存泄露或者是性能下降——你用得越多这种风险就越 ...

  3. JS中事件代理与委托

    在javasript中delegate这个词经常出现,看字面的意思,代理.委托.那么它究竟在什么样的情况下使用?它的原理又是什么?在各种框架中,也经常能看到delegate相关的接口.这些接口又有什么 ...

  4. JavaScript事件代理和委托

    在javasript中,代理.委托经常出现. 那么它究竟在什么样的情况下使用?它的原理又是什么? 这里介绍一下javascript delegate的用法和原理,以及Dojo,jQuery等框架中de ...

  5. JavaScript事件代理和事件委托

    一.概述: 那什么叫事件委托呢?它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件.那这是什么意思呢?网上的 ...

  6. 【转载】浅谈事件冒泡与事件捕获 - javascript 事件代理

    原文:https://segmentfault.com/a/1190000000749838 事件冒泡与事件捕获 事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发 ...

  7. Atitit.  Js 冒泡事件阻止 事件捕获   事件传递  事件代理

    Atitit.  Js 冒泡事件阻止 事件捕获   事件传递  事件代理   1. 事件冒泡1 2. 事件捕获1 3. 同时支持了事件捕获阶段和事件冒泡阶段ddEventListener的第三个参数1 ...

  8. JS中的事件委托(事件代理)

    一步一步来说说事件委托(或者有的资料叫事件代理) js中事件冒泡我们知道,子元素身上的事件会冒泡到父元素身上. 事件代理就是,本来加在子元素身上的事件,加在了其父级身上. 那就产生了问题:父级那么多子 ...

  9. JavaScript事件代理和委托(Delegation)

    JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委 ...

随机推荐

  1. day3 文件系统 内核模块 ctags

    nfs网络文件系统 smb   修改配置文件  sudo  vim /etc/samba/smb.conf    重启服务   /etc/init.d/samba restart 自制小的文件系统 1 ...

  2. 模仿QQ气泡聊天

    尝试了几种方案,想模仿QQ的气泡聊天,总是不尽如意.网上倒是大把的Android和Html的例子,Delphi的没找着,只能自己试着折腾. 1. 用WebBrowser加载本地html,屡次折腾,失败 ...

  3. js获得分辨率

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  4. hadoop 的job.setOutputKeyClass和job.setOutputValueClass的几个问题

    昨天写了一个mapreduce函数一直有错误,找不到错误,今天找了一天终于解决了,原来是hadoop 的job.setOutputKeyClass和job.setOutputValueClas设置输出 ...

  5. python(七):元类与抽象基类

    一.实例创建 在创建实例时,调用__new__方法和__init__方法,这两个方法在没有定义时,是自动调用了object来实现的.python3默认创建的类是继承了object. class A(o ...

  6. Django之tag标签和filter标签

    1.Django的tag常见的标签,可以做一些简单的功能 {%if%} 的使用主要用于做判断,还可以包含{%elif%} 这样的用法,最后要跟上{% endif %}.可以使用你的and,or,not ...

  7. Spring核心机制:依赖注入

    转载:http://www.cnblogs.com/chenssy/ Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因 ...

  8. PHP面向对象——三大基本特性与五大基本原则

    三大特性是:封装.继承.多态 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 封装是面向对象的特征之一,是对象和类概念的主要特 ...

  9. python编程规范系列--建议08~18

    本系列来自<编写高质量代码 改善python程序的91个建议>的读书笔记整理.  本章主要内容 建议8:利用assert语句来发现问题 建议9:数据交换值时不推荐使用中间交换变量 建议10 ...

  10. bzoj1503[NOI2004]郁闷的出纳员——Splay

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1503 好奇怪呀!为什么而TLE? 各种修改终于卡时过了.可是大家比我快多了呀?难道是因为自己 ...