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 相关文章推荐
AeroWindow 基于JQuery的弹出窗口插件
Jun 27 Javascript
IE和Firefox的Javascript兼容性总结[推荐收藏]
Oct 19 Javascript
一个字符串反转函数可实现字符串倒序
Sep 15 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
Nov 28 Javascript
javascript 数组操作详解
Jan 29 Javascript
javascript每日必学之多态
Feb 23 Javascript
基于jquery实现ajax无刷新评论
Aug 19 Javascript
JS使用onerror捕获异常示例
Aug 03 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
May 11 Javascript
Vue监听页面刷新和关闭功能
Jun 20 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
Jul 23 Javascript
仿照Element-ui实现一个简易的$message方法
Sep 14 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
php 文件缓存函数
2011/10/08 PHP
CI框架中通过hook的方式实现简单的权限控制
2015/01/07 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
javascript求日期差的方法
2016/03/02 Javascript
Bootstrap轮播插件简单使用方法介绍
2016/06/21 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
JavaScript中的一些隐式转换和总结(推荐)
2017/12/22 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
jQuery实现手风琴效果(蒙版)
2020/01/11 jQuery
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
[56:48]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python自动化测试之从命令行运行测试用例with verbosity
2014/09/28 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
在Python中操作文件之seek()方法的使用教程
2015/05/24 Python
深入讲解Python编程中的字符串
2015/10/14 Python
Linux系统上Nginx+Python的web.py与Django框架环境
2015/12/25 Python
详解python分布式进程
2018/10/08 Python
python使用正则筛选信用卡
2019/01/27 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
python反转列表的三种方式解析
2019/11/08 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
Laravel的加密解密与哈希实例讲解
2021/03/24 PHP
小学生保护环境倡议书
2014/05/15 职场文书
订货会邀请函
2015/01/31 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
python基础之文件处理知识总结
2021/05/23 Python