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 相关文章推荐
jQuery Ajax之$.get()方法和$.post()方法
Oct 12 Javascript
JS画线(实例代码)
Nov 20 Javascript
jQuery实现表单提交时判断的方法
Dec 13 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
Mar 23 Javascript
jquery使整个div区域可以点击的方法
Jun 24 Javascript
如何判断出一个js对象是否一个dom对象
Nov 24 Javascript
基于JavaScript表单脚本(详解)
Oct 18 Javascript
详解如何制作并发布一个vue的组件的npm包
Nov 10 Javascript
微信小程序云开发实现增删改查功能
May 17 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
Oct 17 Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
Feb 21 Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
Mar 03 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
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
如何使用PHP计算上一个月的今天
2013/05/23 PHP
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
javascript中的注释使用与注意事项小结
2011/09/20 Javascript
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
让checkbox不选中即将选中的checkbox不选中
2014/07/11 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
JS仿QQ好友列表展开、收缩功能(第一篇)
2017/07/07 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
微信小程序iOS下拉白屏晃动问题解决方案
2019/10/12 Javascript
使用vue打包进行云服务器上传的问题
2020/03/02 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
2020/03/08 Javascript
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
快速解决element的autofocus失效问题
2020/09/08 Javascript
[01:42]DOTA2 – 虚无之灵
2019/08/25 DOTA
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
python搭建微信公众平台
2016/02/09 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
python实现图片上添加图片
2019/11/26 Python
python Gabor滤波器讲解
2020/10/26 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
What is the purpose of Void class? Void类的作用是什么?
2016/10/31 面试题
什么是servlet链?
2014/07/13 面试题
大学生自我鉴定
2013/12/16 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
医院竞聘演讲稿
2014/05/16 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书
详解JS数组方法
2021/11/20 Javascript
pt-archiver 主键自增
2022/04/26 MySQL