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 相关文章推荐
JavaScript XML实现两级级联下拉列表
Nov 10 Javascript
HTML5附件拖拽上传drop &amp; google.gears实现代码
Apr 28 Javascript
JQuery 中几个类选择器的简单使用介绍
Mar 14 Javascript
javascript 手动给表增加数据的小例子
Jul 10 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
Jun 06 Javascript
jQuery+PHP打造滑动开关效果
Dec 16 Javascript
理解js对象继承的N种模式
Jan 25 Javascript
React 使用browserHistory项目访问404问题解决
Jun 01 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
Jul 18 Javascript
在Create React App中使用CSS Modules的方法示例
Jan 15 Javascript
vue日历/日程提醒/html5本地缓存功能
Sep 02 Javascript
利用JS如何获取form表单数据
Dec 19 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
smarty内部日期函数html_select_date()用法实例分析
2015/07/08 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
vue组件父与子通信详解(一)
2017/11/07 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
Vue cli3 库模式搭建组件库并发布到 npm的流程
2018/10/12 Javascript
JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】
2018/12/12 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
JS面向对象之多选框实现
2020/01/17 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
python中OrderedDict的使用方法详解
2017/05/05 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
Python-openCV开运算实例
2020/07/05 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
娱乐地球:Entertainment Earth
2020/01/08 全球购物
美国领先的机场停车聚合商:Airport Parking Reservations
2020/02/28 全球购物
教育学专业毕业生的自我评价
2013/11/21 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
个人查摆问题整改措施
2014/10/04 职场文书
2015年幼儿园卫生保健工作总结
2015/05/12 职场文书
开学第一周值周总结
2015/07/16 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis