javascript事件代理(delegate)原理解析

  什么是事件代理?首先得知道什么是事件,并且弄清楚事件流,才能真正明白事件代理原理。

一、什么是事件?

  javascript与HTML之间交互就是通过事件实现的,事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。如onload、onclick、onmouseup、onmousedown... 。

二、事件流

  DOM(文档对象模型)结构是一个树型结构,当一个HTML元素产生一个事件时,该事件会在元素结点与根结点之间的路径传播,路径所经过的结点都会收到该事件,这个传播过程可称为DOM事件流。

  因为历史的原因,IE最开始实现实现事件流的方式:冒泡事件(event bubbling),Netscape提出了另外一种事件流方式:事件捕获(event capturing),不同的浏览器实现上有一些差别,用起来就有些繁琐。幸好现代浏览器都实现了W3C制定的"DOM2级事件","DOM2级事件"把事件流分为三个阶段,捕获阶段、目标阶段、冒泡阶段。

  网上借图:

  

三、什么是事件代理?

  前面做了这么多基础铺垫,那么现在理解事件代理就是很简单的事了。事件代理就是在祖先级DOM元素绑定一个事件,当触发子孙级DOM元素的事件时,利用事件流的原理来触发绑定在祖先级DOM的事件。听起来有点绕口,下面做一个简单的代码实现:

<!--省略html主体部分-->
<ul id="menu">
    <li><p><a>如果我被钗神翻牌,我就有一个成为大神的机会!</a></p></li>
    <li><p><a>如果我被钗神翻牌,我就有一个成为大神的机会!</a></p></li>
    <li><p><a>如果我被钗神翻牌,我就有一个成为大神的机会!</a></p></li>
    <!--中间省略1000000行-->
    <li><p><a>如果我被钗神翻牌,我就有一个成为大神的机会!</a></p></li>
</ul>  
// 获取祖先节点(这儿就获取ul),并为它添加一个click事件
document.getElementById("menu").addEventListener("click", function(e) {
  // 检查事件源e.targe是否为A
  if(e.target && e.target.nodeName.toUpperCase == "A") {
      console.log("钗神翻我牌,今晚就跟你走....");
  }
});

  浏览器的能力还是有限的,为了安全起见,系统分配给浏览器的内存也是有限的。特别是某些老版本的浏览器,如果在DOM上添加的事件过多,会导致网页的性能下降甚至崩溃。看我上面的ul下面的a节点就有1000004,如果真的为所有的a标签加一个事件,这个代价是很大的。用了事件代理,我们节约了1000003个事件,简直太强大了。

  一般浏览器触发事件都是在冒泡阶段,如果你想在捕获阶段触发事件你可以设置addEventListener第三个参数为true,addEventListener("click", function(e){}, true)。

总结:基础很重要,明白基础,原理就是那么简单!

  

时间: 2024-10-27 10:05:48

javascript事件代理(delegate)原理解析的相关文章

JavaScript事件代理和委托

在javasript中delegate这个词经常出现,看字面的意思,代理.委托.那么它究竟在什么样的情况下使用?它的原理又是什么?在各种框架中,也经常能看到delegate相关的接口.这些接口又有什么特殊的用法呢?这篇文章就主要介绍一下javascript delegate的用法和原理,以及Dojo,jQuery等框架中delegate的接口. JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的

Atitit事件代理机制原理 基于css class的事件代理

1.1. 在javasript中delegate这个词经常出现,看字面的意思,代理.委托1 1.2. 事件代理1 1.3. 代理标准化规范1 1.3.1. jQuery和Dojo中delegate函数2 1.3.2. 优点2 1.1. 在javasript中delegate这个词经常出现,看字面的意思,代理.委托 如果我们不想或不能够直接操纵目标对象,我们可以利用delegate创建一个代理对象来调用目标对象的方法,从而达到操纵目标对象的目的.代理对象要拥有目标对象的引用.这就是事件代理(也就是

JavaScript事件代理,减少开销提高效率

JavaScript事件代理(事件委托),即把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务. 众所周知,DOM操作是十分消耗性能的.所以重复的事件绑定简直是性能杀手.而事件代理的核心思想,就是通过尽量少的绑 定,去监听尽量多的事件. 事件代理的核心思想:事件冒泡 .on( events [, selector ] [, data ], handler ) .delegate( selector, eventType, handler ) 从jQuery 1.7开始,on()函数提供

JavaScript事件代理入门

事件代理(Event Delegation),又称之为事件委托.是 JavaScript 中常用绑定事件的常用技巧. 顾名思义,"事件代理"即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务. 为什么要这样做呢? 众所周知,DOM操作是十分消耗性能的.所以重复的事件绑定简直是性能杀手.而事件代理的核心思想,就是通过尽量少的绑定,去监听尽量多的事件. 下面将会用 Zepto 为大家演示怎么实现事件代理. 啊?Zepto是什么? Zepto is a minimalist J

JavaScript事件代理和委托(Delegation)

JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委托给父节点来触发处理函数.这主要得益于浏览器的事件冒泡机制. 假设有一个 UL 的父节点,包含了很多个 Li 的子节点: 1 <ul id="parent-list"> 2 <li id="post-1">Item 1</li> 3

JavaScript 事件代理

转自:http://www.cnblogs.com/silence516/archive/2009/09/03/delegateEvent.html 如果你想给网页添加点JavaScript的交互性,也许你已经听过JavaScript的事件代理(event delegation),并且觉得这是那些发烧友级别的JavaScript程序员才会关心的什么费解的设计模式之一.事实上,如果你已经知道怎么添加JavaScript的事件处理器(event handler),实现事件代理也是件轻而易举的事情.

JavaScript事件代理和事件委托

一.概述: 那什么叫事件委托呢?它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件.那这是什么意思呢?网上的各位大牛们讲事件委托基本上都用了同一个例子,就是取快递来解释这个现象,我仔细揣摩了一下,这个例子还真是恰当,我就不去想别的例子来解释了,借花献佛,我摘过来,大家认真领会一下事件委托到底是一个什么原理: 有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托给前台

[转载]JS事件委托(事件代理)的原理以及优缺点

1,什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件. 也就是:利用冒泡的原理,把事件加到父级上,触发执行效果. 好处呢:1,提高性能. 我们可以看一个例子:需要触发每个li来改变他们的背景颜色. <ul id="ul"> <li>aaaaaaaa</li> <li>bbbbbbbb&l

事件委托(事件代理)的原理以及优缺点是什么?

事件委托原理:事件冒泡机制.优点:1.可以大量节省内存占用,减少事件注册.比如ul上代理所有li的click事件就很不错.2.可以实现当新增子对象时,无需再对其进行事件绑定,对于动态内容部分尤为合适缺点:事件代理的常用应用应该仅限于上述需求,如果把所有事件都用事件代理,可能会出现事件误判.即本不该被触发的事件被绑定上了事件. 看下面的例子: 1 <ul id="ul1"> 2 <li>111</li> 3 <li>222</li&g