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 相关文章推荐
js变量作用域及可访问性的探讨
Nov 23 Javascript
jQuery版仿Path菜单效果
Dec 15 Javascript
JSON 数据格式介绍
Jan 13 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
Jul 17 Javascript
jQuery实现隔行背景色变色
Nov 24 Javascript
js+jquery常用知识点汇总
Mar 03 Javascript
使用jquery实现仿百度自动补全特效
Jul 23 Javascript
详解javascript实现自定义事件
Jan 19 Javascript
js仿小米官网图片轮播特效
Sep 29 Javascript
arcgis for js 修改infowindow样式的方法
Nov 02 Javascript
vue与TypeScript集成配置最简教程(推荐)
Oct 17 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
Aug 23 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巧获服务器端信息
2006/12/06 PHP
php函数连续调用实例分析
2015/07/30 PHP
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
两个比较有用的Javascript工具函数代码
2010/02/17 Javascript
JS实现拖动示例代码
2013/11/01 Javascript
js键盘上下左右键怎么触发function(实例讲解)
2013/12/14 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
动态加载iframe时get请求传递中文参数乱码解决方法
2014/05/07 Javascript
基于socket.io和node.js搭建即时通信系统
2014/07/30 Javascript
jQuery中get和post方法传值测试及注意事项
2014/08/08 Javascript
jquery获取url参数及url加参数的方法
2015/10/26 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
[01:08:56]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第一场 2月7日
2021/03/11 DOTA
python小技巧之批量抓取美女图片
2014/06/06 Python
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
举例介绍Python中的25个隐藏特性
2015/03/30 Python
Python中特殊函数集锦
2015/07/27 Python
Python遍历目录并批量更换文件名和目录名的方法
2016/09/19 Python
python学生管理系统代码实现
2020/04/05 Python
python学习基础之循环import及import过程
2018/04/22 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
python logging设置level失败的解决方法
2020/02/19 Python
Python新手学习raise用法
2020/06/03 Python
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
小学校长竞聘演讲稿
2014/05/16 职场文书
圣诞节开幕词
2015/01/29 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js
Python实现批量自动整理文件
2022/03/16 Python
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS