JavaScript中的事件委托及好处


Posted in Javascript onJuly 12, 2016

1,什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。

也就是:利用冒泡的原理,把事件加到父级上,触发执行效果。

好处呢:1,提高性能。

我们可以看一个例子:需要触发每个li来改变他们的背景颜色。

<ul id="ul">
<li>aaaaaaaa</li>
<li>bbbbbbbb</li>
<li>cccccccc</li>
</ul> 
window.onload = function(){
var oUl = document.getElementById("ul");
var aLi = oUl.getElementsByTagName("li");
for(var i=0; i<aLi.length; i++){
aLi[i].onmouseover = function(){
this.style.background = "red";
}
aLi[i].onmouseout = function(){
this.style.background = "";
}
}
}

这样我们就可以做到li上面添加鼠标事件。

但是如果说我们可能有很多个li用for循环的话就比较影响性能。

下面我们可以用事件委托的方式来实现这样的效果。html不变

window.onload = function(){
var oUl = document.getElementById("ul");
var aLi = oUl.getElementsByTagName("li");
/*
这里要用到事件源:event 对象,事件源,不管在哪个事件中,只要你操作的那个元素就是事件源。
ie:window.event.srcElement
标准下:event.target
nodeName:找到元素的标签名
*/
oUl.onmouseover = function(ev){
var ev = ev || window.event;
var target = ev.target || ev.srcElement;
//alert(target.innerHTML);
if(target.nodeName.toLowerCase() == "li"){
target.style.background = "red";
}
}
oUl.onmouseout = function(ev){
var ev = ev || window.event;
var target = ev.target || ev.srcElement;
//alert(target.innerHTML);
if(target.nodeName.toLowerCase() == "li"){
target.style.background = "";
}
}
}

好处2,新添加的元素还会有之前的事件。

我们还拿这个例子看,但是我们要做动态的添加li。点击button动态添加li

如:

<input type="button" id="btn" />
<ul id="ul">
<li>aaaaaaaa</li>
<li>bbbbbbbb</li>
<li>cccccccc</li>
</ul>

不用事件委托我们会这样做:

window.onload = function(){
var oUl = document.getElementById("ul");
var aLi = oUl.getElementsByTagName("li");
var oBtn = document.getElementById("btn");
var iNow = 4;
for(var i=0; i<aLi.length; i++){
aLi[i].onmouseover = function(){
this.style.background = "red";
}
aLi[i].onmouseout = function(){
this.style.background = "";
}
}
oBtn.onclick = function(){
iNow ++;
var oLi = document.createElement("li");
oLi.innerHTML = 1111 *iNow;
oUl.appendChild(oLi);
}
}

这样做我们可以看到点击按钮新加的li上面没有鼠标移入事件来改变他们的背景颜色。

因为点击添加的时候for循环已经执行完毕。

那么我们用事件委托的方式来做。就是html不变

window.onload = function(){
var oUl = document.getElementById("ul");
var aLi = oUl.getElementsByTagName("li");
var oBtn = document.getElementById("btn");
var iNow = 4;
oUl.onmouseover = function(ev){
var ev = ev || window.event;
var target = ev.target || ev.srcElement;
//alert(target.innerHTML);
if(target.nodeName.toLowerCase() == "li"){
target.style.background = "red";
}
}
oUl.onmouseout = function(ev){
var ev = ev || window.event;
var target = ev.target || ev.srcElement;
//alert(target.innerHTML);
if(target.nodeName.toLowerCase() == "li"){
target.style.background = "";
}
}
oBtn.onclick = function(){
iNow ++;
var oLi = document.createElement("li");
oLi.innerHTML = 1111 *iNow;
oUl.appendChild(oLi);
}
}

ok:

如同在我们用微博中,新发微博照样有之前的鼠标事件。

以上所述是小编给大家介绍的JavaScript中的事件委托及好处,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
csdn 博客中实现运行代码功能实现
Aug 29 Javascript
jQuery实现 注册时选择阅读条款 左右移动
Apr 11 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
Nov 20 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
Jun 17 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
Dec 23 Javascript
jQuery中slidedown与slideup方法用法示例
Sep 16 Javascript
原生js实现电商侧边导航效果
Jan 19 Javascript
jquery append与appendTo方法比较
May 24 jQuery
React学习笔记之条件渲染(一)
Jul 02 Javascript
vue 插值 v-once,v-text, v-html详解
Jan 19 Javascript
详解vue 项目白屏解决方案
Oct 31 Javascript
js实现轮播图特效
May 28 Javascript
原生js实现class的添加和删除简单代码
Jul 12 #Javascript
JavaScript动态添加事件之事件委托
Jul 12 #Javascript
html+js实现简单的计算器代码(加减乘除)
Jul 12 #Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
Jul 12 #Javascript
javascript加减乘除的简单实例
Jul 12 #Javascript
浅谈javascript中的加减时间
Jul 12 #Javascript
多功能jQuery树插件zTree实现权限列表简单实例
Jul 12 #Javascript
You might like
如何使用脚本模仿登陆过程
2006/11/22 PHP
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
php后台如何避免用户直接进入方法实例
2013/10/15 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
php阳历转农历优化版
2016/08/08 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
在html页面中包含共享页面的方法
2008/10/24 Javascript
javascript 写类方式之一
2009/07/05 Javascript
javascript 最常用的10个自定义函数[推荐]
2009/12/26 Javascript
鼠标事件延时切换插件
2011/03/12 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
JQuery Mobile实现导航栏和页脚
2016/03/09 Javascript
javascript cookie的基本操作(添加和删除)
2017/07/24 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
在vue中阻止浏览器后退的实例
2019/11/06 Javascript
vue实现简单计算商品价格
2020/09/14 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
使用python实现rsa算法代码
2016/02/17 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
使用jupyter notebook直接打开.md格式的文件
2020/04/10 Python
Python使用正则表达式实现爬虫数据抽取
2020/08/17 Python
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
类的返射机制中的包及核心类
2016/09/12 面试题
护理学中专毕业生求职信
2013/11/11 职场文书
2014年高考决心书
2014/03/11 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
史上最全书信经典范文大全(建议收藏)
2019/07/10 职场文书
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis
在虚拟机中安装windows server 2008的图文教程
2022/06/28 Servers