事件委托,js中的一种优化方法

在前端编程中,我们常会遇到一种叫做事件委托的方法。

那么,

什么是事件委托呢?

简单来说,事件就是指onclick,onmouseover,onmouseout等大部分事件,为什么说是大部分后面会提到,因为有些例外;委托就是本来由元素x自己来做的事,让其父元素代为办理,这个就像儿子的学费由老子来交一样。

事件委托的原理?

事件委托的原理很简单,主要利用的javascript的事件冒泡机制。具体来讲就是,当事件源是文档或者文档元素时,在不主动阻止事件冒泡的情况下,事件会按着dom树结构由事件源逐级传递至顶端document对象,最后到达window对象。而event对象的event.target(IE9以下的event.srcElement)指向事件源,因此我们在父级元素上监听事件也可以获得触发该事件的最原始元素。

注意:focus,blur和scroll事件是不会冒泡的;文档元素上的load事件会冒泡,但传递到document对象时会终止,不会再传递给window对象,只有当整个文档都加载完毕时,才会触发window对象的load事件。

事件委托的的好处?

1、不用为每个子元素都添加单独的事件处理程序,提高页面性能尤其是当页面中存在大量子元素时。

2、动态添加的子元素也具有了相应的事件处理能力。

一个简单的例子:

DOM结构:

<ul id="myul">
    <li>1</li>
    <li>2</li>
    <li>3</li>
</ul>

JS部分:

var myul=document.getElementById(‘myul‘);
myul.onclick=function(e){
    var e=e||window.event;  //window.event兼容IE9以下版本    a=e.target||e.srcElement; //e.srcElement兼容IE9以下版本       alert(a.innerHTML);
};var b=document.createElement(‘li‘);b.innerHTML="4";myul.appendChild(b);

这样我们就不再需要用for循环为每个li添加onclick事件了,并且后面添加的li元素也具有了处理onclick事件的能力。

时间: 2024-10-29 14:44:10

事件委托,js中的一种优化方法的相关文章

js oop中的三种继承方法

JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方法.(继承的两方,发生在两个类之间)> 一.通过object实现继承 1:定义父类 function Parent(){} 2:定义子类 funtion Son(){} 3:通过原型给Object对象添加一个扩展方法. Object.prototype.customExtend = function(p

Button的Click事件与js函数的两种不同顺序触发方式

先执行js,或者先执行Click事件,最近就遇到了这个问题,开始弄了两个按钮分别执行,那才叫一个蛋疼... 1.先执行js,再执行Button的Click函数 <asp:Button ID="btn_delete" runat="server" Text="提交" onclick="button1_Click"/> 前台js为 <script language="javascript"&g

判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解

转载自[脚本之家],原文链接:http://www.jb51.net/article/42864.htm 提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以都转换成小写,以防出错 1.typeof(param) 返回param的类型(string) 这种方法是JS中的定义的全局方法,也是编译者们最常用的方法,优点就是使用简单.好记,缺点是不能很好的

js面向对象初步探究(上) js面向对象的5种写方法

很长一段时间看网上大神的JS代码特别吃力,那种面向对象的写法方式让人看得云里来雾里去.于是就研究了一下JS面向对象,由于是初学,就将自己在网上找到的资料整理一下,作为记忆. js面向对象的5种写方法:(来自http://www.iteye.com/topic/434462) 首先 定义circle类,拥有成员变量r,常量PI和计算面积的成员函数area(): //第1种写法 function Circle(r) { this.r = r; } Circle.PI = 3.14159; Circl

hdu3572--Task Schedule(最大流+两种优化方法,dinic)

Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3651    Accepted Submission(s): 1271 Problem Description Our geometry princess XMM has stoped her study in computational geometry t

在JS中使用COM组件的方法

首先创建一个COM组件,插入一个双接口Itest,在此接口上实现以下三个方法: STDMETHODIMP Ctest::test(void) //无输入输出参数 { // TODO: 在此添加实现代码 MessageBox(NULL,L"test",L"test",MB_OK); return S_OK; } STDMETHODIMP Ctest::test1(BSTR a1) //有一个字符串输入参数 { // TODO: 在此添加实现代码 MessageBox(

Angular.js中处理页面闪烁的方法详解

Angular.js中处理页面闪烁的方法详解 前言 大家在使用{{}}绑定数据的时候,页面加载会出现满屏尽是{{xxx}}的情况.数据还没响应,但页面已经渲染了.这是因为浏览器和angularjs渲染页面都需要消耗一定的时间,这个间隔可能很小,甚至让人感觉不到,这种情况一切正常,但这个时间也可能很长,这时候用户可能会看到满屏尽是{{xxxx}}.这种情况被叫做"Flash Of Unrendered Content (FOUC)(K)?and is always unwanted.".

AOP在 .NET中的七种实现方法

 7Approaches for AOP in .Net AOP在 .NET中的七种实现方法 Here are all the ways that I can think of to add AOPto your application. This mostly focus on the interception side of things,because once you have that, everything else it just details. 在这里列表了我想到的在你的应

js中字符串常用熟悉和方法

for(var i=0;i<=450;i++){ for(var j=380-i;j+i<=450 && j+i>=380;j++){ if((i*75+j*80.1)==(i+j)*76){ alert('nan:'+i+'nv:'+j); } } } js中字符串常用熟悉和方法,布布扣,bubuko.com