JavaScript------事件委托(event delegation)
简单的说,事件委托(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)的更多相关文章
- javascript 事件委托 event delegation
事件委托 event delegation 一.概念: 假设我们有很多个子元素,每个元素被点击时都会触发相应事件,普通的做法是给每个子元素添加一个事件监听. 而,事件委托则是给它们的父元素添加一个事件 ...
- javascript事件代理(Event Delegation)
看了几篇文章,放上来供参考 司徒正美的文章,Event Delegation Made Easy --------------------------------------------------- ...
- 事件委托(event delegation)
事件委托给我带来的第一印象是,如果可以的话请尝试得经常使用它,性能好! 通过字符串拼接后,并进行DOM插入,不会复制事件,此时需要进行事件委托了!!! 优点 事件委托对于web应用程序的性能有如下几个 ...
- 事件委托(event delegation) 或叫 事件代理
比较好的介绍文章: 关于事件委托的整理 ,另附bind,live,delegate,on区别:https://www.cnblogs.com/MagicZhao123/p/5980957.html j ...
- JavaScript 事件委托的技术原理
如今的 JavaScript 技术界里最火热的一项技术应该是‘事件委托(event delegation)’了.使用事件委托技术能让你避免对特定的每个节点添加事件监听器:相反,事件监听器是被添加到它们 ...
- JavaScript事件委托的技术原理
如今的JavaScript技术界里最火热的一项技术应该是‘事件委托(event delegation)’了.使用事件委托技术能让你避免对特定的每个节点添加事件监听器:相反,事件监听器是被添加到它们的父 ...
- javascript事件委托机制详解
以个人前端工作面试经历来看,javascript事件委托是问的最多的一类题目之一,熟悉事件委托能够了解你对于javascript的掌握程度. 面试官可能问一下问题,现在有5个li待办事件,需要实现当点 ...
- JavaScript 事件委托
JavaScript事件委托,或者叫事件代理,是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件. 借花献佛的例子(取快递): 有三个同事预计会在周一收到快递.为签收快递,有两种办法 ...
- 关于javaScript事件委托的那些事
今天是第一次写稿,还是有那么一丢丢小鸡冻...回归正题啦... 关于javaScript事件委托不得不说的那些事,为什么要使用事件委托? 我们可以这么说,假设老板要分配一项任务,首先要秘书叫A君来到办 ...
- javascript 事件委托,jq,js模拟事件
<!DOCTYPE> <html> <head> <title></title> <script src="Scripts/ ...
随机推荐
- <转>Npoi导入导出Excel操作<载>
//Datatable导出Excel private static void GridToExcelByNPOI(DataTable dt, string strExcelFileName) { tr ...
- Entity Framework CodeFirst尝试
前言 Code First模式我们称之为“代码优先”模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时开发人员只需要编写对应的数据类(其实就是领域模型的实现过程),然后 ...
- IOS APP的所有图标尺寸规范
转自: http://blog.csdn.net/chonbj/article/details/25133247 像我一样记不住iOS应用图标像素尺寸的开发者不在少数,我经常需要查询不同设备上的应用尺 ...
- FATAL: ActionView::Template::Error (application.css isn't precompiled):
iwangzheng.com tty:[0] jobs:[0] cwd:[/opt/logs/m]13:02 [root@a02.cmsapi$ tail thin\ server\ \(0.0.0. ...
- Linux Tomcat 简介
如今,基于Web的应用越来越多,传统的Html已经满足不了如今的需求.我们需要一个交互式的Web,于是便诞生了各种Web语言.如Asp,Jsp,Php等.当然,这些语言与传统的语言有着密切的联系,如P ...
- Thinkphp中eq,neq,gt,lt等表达式缩写
eq 等于 equalneq 不等于gt 大于 greater thanegt 大于等于lt 小于 less thanelt 小于等于like LIKEbetween BETWEENno ...
- makefile文件编写
文件转载自:http://www.cppblog.com/lapcca/archive/2010/11/26/134714.html 下面这篇文章讲的很清楚,基本的用法也很简单. 一.Makefi ...
- 用php计算行列式
因为有课程设计要计算多元一次方程组,所以想编个程序实现,多元一次方程组的计算最系统的方法就是利用克拉默法则求解方程组,所以只需要编写一个类或者方法求出多元一次方程组系数行列式的值和和其他几个行列式,如 ...
- ORACLE清除某一字段重复的数据(选取重复数据中另一个字段时期最大值)
需求:资产维修表中同一资产可能维修完继续申请维修,这时候维修状态需要根据最近的维修时间去判断维修状态,所以同一资产ID下会出现重复的数据(维修审批通过,维修审批未通过),或者可能不出现(未申请维修), ...
- 解决java.lang.UnsupportedClassVersionError
出现java.lang.UnsupportedClassVersionError 错误的原因,是因为我们使用高版本的JDK编译的Java class文件试图在较低版本的JVM上运行,所报的错误. 版本 ...