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实现的超出屏幕时把固定层变为定位层的代码
Feb 23 Javascript
JS图片预加载 JS实现图片预加载应用
Dec 03 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
Oct 07 Javascript
jQuery实现文本框输入同步的方法
Jun 20 Javascript
javascript实现拖动元素交换位置
Nov 29 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
Jun 09 Javascript
利用jQuery实现打字机字幕效果实例代码
Sep 02 Javascript
详解vue中使用express+fetch获取本地json文件
Oct 10 Javascript
JavaScript实现学生在线做题计时器功能
Dec 05 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
Jan 22 Javascript
Vue $emit()不能触发父组件方法的原因及解决
Jul 28 Javascript
jQuery实现简单评论区功能
Oct 26 jQuery
原生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
体育彩票排列三组选三算法分享
2014/03/07 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
PHP实现PDO操作mysql存储过程示例
2019/02/13 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
JQuery UI皮肤定制
2009/07/27 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
jQuery中after()方法用法实例
2014/12/25 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
node中koa中间件机制详解
2017/08/22 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
Nuxt.js之自动路由原理的实现方法
2018/11/21 Javascript
Vue项目中使用jsonp抓取跨域数据的方法
2019/11/10 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
[20:30]职业巡回赛回顾
2018/08/09 DOTA
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
Python入门篇之字符串
2014/10/17 Python
Python读取图片为16进制表示简单代码
2018/01/19 Python
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
python中reader的next用法
2018/07/24 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
python获取地震信息 微信实时推送
2019/06/18 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
党员群众路线对照检查材料
2014/08/31 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
TensorFlow的自动求导原理分析
2021/05/26 Python