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 插件学习实例1 插件制作说明与tableUI优化
Apr 02 Javascript
解析javascript 实用函数的使用详解
May 10 Javascript
js 异步操作回调函数如何控制执行顺序
Dec 24 Javascript
JS实现点击链接取消跳转效果的方法
Jan 24 Javascript
用box固定长宽实现图片自动轮播js代码
Jun 09 Javascript
JS+CSS实现的蓝色table选项卡效果
Oct 08 Javascript
JavaScript实现短信倒计时60s
Oct 09 Javascript
js实现图片粘贴上传到服务器并展示的实例
Nov 08 Javascript
express启用https使用小记
May 21 Javascript
小试小程序云开发(小结)
Jun 06 Javascript
解决layui数据表格排序图标被超出的表头挤出去的问题
Sep 19 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
Oct 16 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基于GD库画五星红旗的方法
2015/02/24 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
Laravel框架用户登陆身份验证实现方法详解
2017/09/14 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
学习YUI.Ext第五日--做拖放Darg&amp;Drop
2007/03/10 Javascript
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
2015/08/21 Javascript
深入理解JQuery中的事件与动画
2016/05/18 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
javascript ES6中箭头函数注意细节小结
2017/02/17 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
详解在Vue中如何使用axios跨域访问数据
2017/07/07 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
vue新建项目并配置标准路由过程解析
2019/12/09 Javascript
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
python中的reduce内建函数使用方法指南
2014/08/31 Python
Python基于pillow判断图片完整性的方法
2016/09/18 Python
Python简单生成8位随机密码的方法
2017/05/24 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
python启动应用程序和终止应用程序的方法
2019/06/28 Python
Python多版本开发环境管理工具介绍
2019/07/03 Python
Python实现Restful API的例子
2019/08/31 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
python 解决mysql where in 对列表(list,,array)问题
2020/06/06 Python
html5的input的required使用中遇到的问题及解决方法
2018/04/24 HTML / CSS
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
法国一家芭蕾舞鞋公司:Repetto
2018/11/12 全球购物
芭比波朗加拿大官方网站:Bobbi Brown Cosmetics CA
2020/11/05 全球购物
连锁酒店店长职责范本
2014/02/13 职场文书
初中高效课堂实施方案
2014/02/26 职场文书
元宵节晚会主持词
2015/07/01 职场文书