事件委托,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事件的能力。
下面这个例子:弹窗可能会经常用到,点击非子元素的父元素区域时,父元素隐藏,点击子元素不隐藏。
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中的一种优化方法的更多相关文章
- JS中的五种去重方法
JS中的五种去重方法 第一种方法: 第二种方法: 第三种方法: 第四种方法: 第五种方法:优化遍历数组法 思路:获取没重复的最右一值放入新数组 * 方法的实现代码相当酷炫,* 实现思路:获取没重复的 ...
- js中的几种继承方法
JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一. 继承:子承父业:一个原本没有某些方法或属性的对象,统一写方法,拿到了另外一个对象的属性和方法 下面是js中的几种继承方式 1.改变this ...
- JS中的两种刷新方法以及区别和适用范围
在项目中有一个人信息修改的页面,但是修改后显示的却是修改之前的内容,分析问题后发现查询语句写在了修改语句之前,有些某些需要又必须这么写,但是修改信息后先却显示之前的信息也太不科学了. 所以我就想用js ...
- 研究分析JS中的三种逻辑语句
JS中的三种逻辑语句:顺序.分支和循环语句. 一.顺序语句 代码规范如下:1. <script type="text/javascript"> var a = 10; ...
- js oop中的三种继承方法
JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方 ...
- js中的三种函数写法
js中的三种函数写法 <script type="text/javascript"> //普通的声明方式 function myFun(m,n){ alert(m+n) ...
- 实现一个函数clone,可以对JS中的5种数据类型(Number、String、Object、Array、Boolean)进行值复制
实现一个函数clone,可以对JS中的5种数据类型(Number.String.Object.Array.Boolean)进行值复制
- 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以 ...
- JavaScript -- 时光流逝(三):js中的 String 对象的方法
JavaScript -- 知识点回顾篇(三):js中的 String 对象的方法 (1) anchor(): 创建 HTML 锚. <script type="text/javasc ...
随机推荐
- 【转】每天一个linux命令(31): /etc/group文件详解
原文网址:http://www.cnblogs.com/peida/archive/2012/12/05/2802419.html Linux /etc/group文件与/etc/passwd和/et ...
- EditorConfig知识点
.editorconfig 该文件定义项目的编码规范,编辑器的行为会与.editorconfig 文件中定义的一致,并且其优先级比编辑器自身的设置要高,这在多人合作开发项目时十分有用而且必要. 在哪里 ...
- 洛谷1352没有上司的舞会——树型dp
题目:https://www.luogu.org/problemnew/show/P1352 #include<iostream> #include<cstdio> using ...
- 因环境变量设置问题引起的command not found
ls command not found vi command not found 只要的原因是因为环境变量的问题,编辑profile文件没有写正确,导致在命令行下 ls等命令不能够识别.解决办法:在 ...
- vuex基本熟悉与使用
vuex的入门与使用讲解 官网:https://vuex.vuejs.org/zh/guide/state.html 定义:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式 ...
- BaseAction编写:免去一些重复的代码,比如继承ActionSupport和实现ModelDriven接口
1.BaseAction package com.learning.crm.base; import java.lang.reflect.ParameterizedType; import java. ...
- PHP错误和异常处理
1.错误报告级别: 错误E_ERROR; 警告 E_WARNING 注意 E_NOTICE 2.php.ini 中的配置 error_reporting=; 错误提示 一般设置为: error_re ...
- Linux基本操作命令及作用
文件和目录操作命令 命令 作用 cd change directory,切换目录 cp copy,其功能为复制文件或目录 find 用于查找目录或文件 mv move ,移动或重命名文件或目录 pwd ...
- 关闭IE 对剪切板访问的提示
在internet 选项-“安全”选项卡-自定义级别. 在“脚本”下面找到“允许对剪切板进行编程访问”,选择“启用”即可. -END
- HDU 2548 A strange lift
A strange lift Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...