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

那么,

什么是事件委托呢?

简单来说,事件就是指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. 【RAC】使用一条“ps”命令获取Linux环境下全部RAC集群进程信息

    如何仅使用一条ps命令便能获取到所有与RAC集群进程相关的信息.  从所使用的命令角度上看很简单,仅需使用ps命令结合grep命令便能实现.问题关键是需要确定检索哪些关键字. 1.与RAC集群有关的进 ...

  2. linux SSH各配置项解释

    Linux下SSH各配置项解释 关于ssh 设置的相关总结(ssh最大连接数.ssh连接时长.安全性配置等)以redhat6.3为例 ssh配置文件在: /etc/ssh/sshd_config可以打 ...

  3. java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: scala/runtime/java8/JFunction1$mcII$sp

    报错信息: Exception in thread "main" java.lang.BootstrapMethodError: java.lang.NoClassDefFound ...

  4. ASM配置管理

    http://blog.chinaunix.net/uid-22646981-id-3060280.htmlhttp://blog.sina.com.cn/s/blog_6a5aa0300102uys ...

  5. MySQL的Join使用

    在MySQL(以5.1为例)中,表连接的语法可以参见MySQL官方手册:MySQL官方手册-JOIN 在查询中,连接的语法类似 SELECT select_expr FROM table_refere ...

  6. C/C++动态分配连续空间,下标越界导致的free():invalid next size问题

    昨天帮导师做的一个程序出了内存泄露的bug(在VS上程序运行一切正常,等return返回后才出错) 而且是程序运行结束后才出现的错误,在退出前一切代码都顺利执行完了,只是return之后出错. 之后我 ...

  7. bzoj1212 L语言

    Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D ...

  8. 峰Spring4学习(1)HelloWorld

    HelloWorld.java: package com.cy.test; public class HelloWorld { public void say(){ System.out.printl ...

  9. java正则表达式学习

    1.简单认识正则: public class Test { public static void main(String[] args) { //简单认识正则 p("abc".ma ...

  10. [转]修改DLL

    部分内容来自:http://blog.csdn.net/csdncshuan/article/details/51477705 为没有源码的DLL文件添加强名称 如果项目中引用了其他没有源码的dll文 ...