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

那么,

什么是事件委托呢?

简单来说,事件就是指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事件的能力。

下面这个例子:弹窗可能会经常用到,点击非子元素的父元素区域时,父元素隐藏,点击子元素不隐藏。

CSS部分:

body{
margin:;
padding:;
}
#div1{
width:100%;
height:100%;
background:#000;
opacity:0.5;
filter:alpha(opacity=50);
position:fixed;
}
#div2{
width:500px;
height:500px;
top:50%;
left:50%;
margin-left:-250px;
margin-top:-250px;
background:green;
position:absolute;
}

DOM结构:

<div id='div1'>
<div id="div2"></div>
</div>

javascript部分:

var div1=document.getElementById('div1');
div1.onclick=function(e){
var e=e||window.event;
var o=e.target||e.srcElement;
if(o==this) //this也可以替换成div1
{
this.style.display="none";
}
else
{
return false;
}
}

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

  1. JS中的五种去重方法

    JS中的五种去重方法 第一种方法: 第二种方法:  第三种方法: 第四种方法: 第五种方法:优化遍历数组法 思路:获取没重复的最右一值放入新数组 * 方法的实现代码相当酷炫,* 实现思路:获取没重复的 ...

  2. js中的几种继承方法

    JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一. 继承:子承父业:一个原本没有某些方法或属性的对象,统一写方法,拿到了另外一个对象的属性和方法 下面是js中的几种继承方式 1.改变this ...

  3. JS中的两种刷新方法以及区别和适用范围

    在项目中有一个人信息修改的页面,但是修改后显示的却是修改之前的内容,分析问题后发现查询语句写在了修改语句之前,有些某些需要又必须这么写,但是修改信息后先却显示之前的信息也太不科学了. 所以我就想用js ...

  4. 研究分析JS中的三种逻辑语句

    JS中的三种逻辑语句:顺序.分支和循环语句. 一.顺序语句 代码规范如下:1. <script type="text/javascript"> var a = 10;  ...

  5. js oop中的三种继承方法

    JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方 ...

  6. js中的三种函数写法

    js中的三种函数写法 <script type="text/javascript"> //普通的声明方式 function myFun(m,n){ alert(m+n) ...

  7. 实现一个函数clone,可以对JS中的5种数据类型(Number、String、Object、Array、Boolean)进行值复制

     实现一个函数clone,可以对JS中的5种数据类型(Number.String.Object.Array.Boolean)进行值复制

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

    提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以 ...

  9. JavaScript -- 时光流逝(三):js中的 String 对象的方法

    JavaScript -- 知识点回顾篇(三):js中的 String 对象的方法 (1) anchor(): 创建 HTML 锚. <script type="text/javasc ...

随机推荐

  1. bzoj 4539 [Hnoi2016]树——主席树+倍增

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4539 明明就是把每次复制的一个子树当作一个点,这样能连出一个树的结构,自己竟然都没想到.思维 ...

  2. x86 openwrt虚拟路由代理上网

    一.代理服务器设置 1.下载代理软件CCProxy 6.8 Build 2.设置如下 二.x86 路由设置 1.在/etc目录下编辑profile http_proxy= https_proxy= f ...

  3. VS2008项目使用VS2015打开时,出现错误: error CS1012: Too many characters in character literal

    VS2008项目使用VS2015打开时,出现错误: error CS1012: Too many characters in character literal ------------------- ...

  4. C# 教程

    http://www.runoob.com/csharp/csharp-tutorial.html

  5. serialize unserialize

    转自 http://www.cnblogs.com/yeer/archive/2009/03/25/1421161.html php函数serialize()与unserialize()   seri ...

  6. android 关于 webview 控制其它view的显示 以及更改view数据失败的问题总结

    总结: 1.webview 无法直接更改view的属性,可以通过 handler实现,因为跨线程 2.webview可以通过js api读取 view的属性值 代码: private Handler ...

  7. BASIC-12_蓝桥杯_十六进制转八进制

    总结: 1.使用库函数可有效节省空间,但时间花费较多; 2.由于本题的输入数据较大,又限制时间,故要注意利用空间换时间; 3.使用顺序结构换取最小运行时间; 示例代码: #include <st ...

  8. Qt 常用类——QStandardItemModel

    转载:落叶知秋时 类QabstractItemModel,QabstractListModel,QAbstractTableModel不保存数据,用户需要从这些类派生出子类,并在子类中定义某种数据结构 ...

  9. 微信公众平台测试帐号的注册与使用(自己的服务器<---->微信后台<---->测式公众号)

    打开注册的网址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 用手机微信扫描网页左边的二维码,然后在手机上确认即可: 至此 ...

  10. (转)USB中CDC-ECM的了解和配置

    USB中典型类及子类: 类别 解释 子类 典型应用 IC芯片 备注 UVC 视频类 免驱USB摄像头 CDC 通讯类 RNDIS ECM(p24) 免驱USB网卡 RTL8152B EEM ..... ...