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控制div外点击隐藏而div内点击不会隐藏的方法
Jan 13 Javascript
JavaScript 面向对象与原型
Apr 10 Javascript
javascript实现倒计时(精确到秒)
Jun 26 Javascript
JavaScript_object基础入门(必看篇)
Jun 13 Javascript
微信小程序 swiper组件详解及实例代码
Oct 25 Javascript
使用vue.js写一个tab选项卡效果
Mar 25 Javascript
无循环 JavaScript(map、reduce、filter和find)
Apr 08 Javascript
webpack4.x打包过程详解
Jul 18 Javascript
jQuery实现的模仿雨滴下落动画效果
Dec 11 jQuery
使用layer.msg 时间设置不起作用的解决方法
Sep 12 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
Oct 30 Javascript
javascript canvas实现雨滴效果
Jun 09 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
mysql 的 like 问题,超强毕杀记!!!
2007/01/18 PHP
php cache类代码(php数据缓存类)
2010/04/15 PHP
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
Windows7下的php环境配置教程
2015/02/28 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
浅谈PHP链表数据结构(单链表)
2016/06/08 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
JavaScript学习笔记--常用的互动方法
2016/12/07 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
2017/09/29 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
jquery判断滚动条距离顶部的距离方法
2018/09/05 jQuery
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
Python写的贪吃蛇游戏例子
2014/06/16 Python
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
python3使用pandas获取股票数据的方法
2018/12/22 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
极简鞋类,赤脚的感觉:Lems Shoes
2019/08/06 全球购物
学生感冒英文请假条
2014/02/04 职场文书
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
档案接收函格式
2015/01/30 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
邹越演讲观后感
2015/06/15 职场文书
文艺演出主持词
2015/07/01 职场文书
box-shadow单边阴影的实现
2023/05/21 HTML / CSS