简单的说,事件委托(event delegation)是在DOM上层(也就是在触发事件的元素的父元素上)定义事件的处理程序,而不是定义在触发事件的元素本身上。

首先我们来举这样一个例子:我有N个li元素,我想让点击过的li元素背景颜色都变为黄色。非常简单的一个例子是吧?

我们可以通过如下代码实现:

var oBox = document.getElementById('box');
var aLi = oBox.children;
for(var i=0;i<aLi.length;i++){
addEvent(aLi[i],'click',function(){
this.style.background='yellow';
})
}
首先这样写是没有问题的,效果完全可以实现,但是如果我有上百个Li元素呢?那我可能就需要为这上百个元素添加相同的处理程序,而且,这上百个程序做的是同一件事情。毋庸置疑,这势必会影响性能。
再者说,如果我想为不同的li元素设置不同的的处理程序,也就是说,当每个li元素被点击时,会有各自不同的事件发生。那你的处理方法是否需要给每个li添加事件监听?同样,如果我有上百个li元素的
时候,你是不是要对每个li进行获取,然后添加事件?如果是,那将是多么可怕的一件事情! 那么我们有没有其他理想的处理方式呢?有,那就是事件委托。 所谓事件委托,其实就是我们利用浏览器提供的事件冒泡来处理为所有的子元素的添加的事件。当子元素的事件冒泡到父元素上时,我们通过event.target(不兼容IE8以下版本)或者
event.srcElement(不兼容Firefox)来获取当前被点击元素的引用,这样,我们就可以像如下代码一样,将事件温和的委托给li的父元素也就是ul了:
var oBox = document.getElementById('box');
var aLi = oBox.children;
oBox.onclick = function(ev){
var oEvent = ev || event;
var oTarget = oEvent.target || oEvent.srcElement;//解决浏览器的兼容性问题
if(oTarget.tagName == 'LI'){
/*此处的'LI'是需要大写的,若要小写可将if内的判断条件改为(oTarget.tagName.toLowerCase == 'li')*/
oTarget.style.background = 'yellow';
}
}
至此,最简单的事件委托举例就完成了~
(以下是摘自JavaScript忍者秘籍,给大家进行下专业性的总结~)
事件委托是一种开发更高性能,且可伸缩Web应用程序的最好技术。
因为事件冒泡(bubbling)是唯一一种在所有浏览器中都可以使用的技术(事件捕获(capturing)在IE9之前版本不可用),所以重要的是要确保将委托应用到事件目标元素的祖先元素上。这样才能
确保最终冒泡到所委托的元素上。
可惜的是,在很多浏览器中,submit、change、focus和blur事件的冒泡实现都有很严重的问题。比如在老版的IE浏览器中,submit和change事件根本没有冒泡,而兼容W3C DOM的浏览器对两个事件
都实现了冒泡。所以,如果我们使用事件委托,必须解决如何克服这些缺陷问题。大家都知道,兼容性问题是最头疼的一项任务,所以不是一两句话可以说的清的,在以后的学习中再慢慢跟大家交流吧~ 作为一前端个新人,也是初次写博客,肯定会有很多分析不到位的地方,小妹先提前谢谢各位前辈的批评指正。天色已晚,祝大家晚安~

JavaScript------事件委托(event delegation)的更多相关文章

  1. javascript 事件委托 event delegation

    事件委托 event delegation 一.概念: 假设我们有很多个子元素,每个元素被点击时都会触发相应事件,普通的做法是给每个子元素添加一个事件监听. 而,事件委托则是给它们的父元素添加一个事件 ...

  2. javascript事件代理(Event Delegation)

    看了几篇文章,放上来供参考 司徒正美的文章,Event Delegation Made Easy --------------------------------------------------- ...

  3. 事件委托(event delegation)

    事件委托给我带来的第一印象是,如果可以的话请尝试得经常使用它,性能好! 通过字符串拼接后,并进行DOM插入,不会复制事件,此时需要进行事件委托了!!! 优点 事件委托对于web应用程序的性能有如下几个 ...

  4. 事件委托(event delegation) 或叫 事件代理

    比较好的介绍文章: 关于事件委托的整理 ,另附bind,live,delegate,on区别:https://www.cnblogs.com/MagicZhao123/p/5980957.html j ...

  5. JavaScript 事件委托的技术原理

    如今的 JavaScript 技术界里最火热的一项技术应该是‘事件委托(event delegation)’了.使用事件委托技术能让你避免对特定的每个节点添加事件监听器:相反,事件监听器是被添加到它们 ...

  6. JavaScript事件委托的技术原理

    如今的JavaScript技术界里最火热的一项技术应该是‘事件委托(event delegation)’了.使用事件委托技术能让你避免对特定的每个节点添加事件监听器:相反,事件监听器是被添加到它们的父 ...

  7. javascript事件委托机制详解

    以个人前端工作面试经历来看,javascript事件委托是问的最多的一类题目之一,熟悉事件委托能够了解你对于javascript的掌握程度. 面试官可能问一下问题,现在有5个li待办事件,需要实现当点 ...

  8. JavaScript 事件委托

    JavaScript事件委托,或者叫事件代理,是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件. 借花献佛的例子(取快递): 有三个同事预计会在周一收到快递.为签收快递,有两种办法 ...

  9. 关于javaScript事件委托的那些事

    今天是第一次写稿,还是有那么一丢丢小鸡冻...回归正题啦... 关于javaScript事件委托不得不说的那些事,为什么要使用事件委托? 我们可以这么说,假设老板要分配一项任务,首先要秘书叫A君来到办 ...

  10. javascript 事件委托,jq,js模拟事件

    <!DOCTYPE> <html> <head> <title></title> <script src="Scripts/ ...

随机推荐

  1. 繁华模拟赛 Vincent的城堡

    #include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...

  2. 域名在微信朋友圈内分享需要ICP备案 杜绝不良信息传播

    就在刚刚,腾讯微信团队发布公告表示域名在朋友圈内分享需要ICP备案,杜绝打击不良互联网信息的传播.公告称根据互联网管理相关规定,即日起在微信朋友圈内分享的域名,请在2014年12月31日前完成ICP备 ...

  3. linux 文件权限除了r、w、x外还有s、t、i、a权限:

    s:文件属主和组设置SUID和GUID,文件在被设置了s权限后将以root身份执行.在设置s权限时文件属主.属组必须先设置相应的x权限,否 则s权限并不能正真生效(c h m o d命令不进行必要的完 ...

  4. Watering the Fields(irrigation)

    #include <cstdio> #include <algorithm> struct edge{ int f,t,w; } ed[5000000]; int pl,n,c ...

  5. BeautifulSoup获取指定class样式的div

    如何获取指定的标签的内容是解析网页爬取数据的必要手段,比如想获取<div class='xxx'> ...<div>这样的div标签,通常有三种办法, 1)用字符串查找方法,然 ...

  6. 【转】Velocity 语法

    一.基本语法 1."#"用来标识Velocity的脚本语句,包括#set.#if .#else.#end.#foreach.#end.#iinclude.#parse.#macro ...

  7. 在Xcode5和Android Studio添加工程间的依赖

    正在编辑中,尚未完成 先看看ios的target是什么,请先参看http://www.cocoachina.com/bbs/read.php?tid-10884.html做个大概了解 这里有一篇文章, ...

  8. Codeforces 424C(异或)

    Magic Formulas Time Limit: 2000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Subm ...

  9. 20145221 《Java程序设计》实验报告二:Java面向对象程序设计

    20145221 <Java程序设计>实验报告二:Java面向对象程序设计 实验要求 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  10. 第六步:Lucene查询索引(优化一)

    package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...