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.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
Jan 15 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
Apr 25 Javascript
Javascript Memoizer浅析
Oct 16 Javascript
理解javascript回调函数
Dec 28 Javascript
javascript中checkbox使用方法实例演示
Nov 19 Javascript
Angular.js如何从PHP读取后台数据
Mar 24 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
Nov 01 Javascript
Vuejs+vue-router打包+Nginx配置的实例
Sep 20 Javascript
nvm、nrm、npm 安装和使用详解(小结)
Jan 17 Javascript
JavaScript实现单英文金山打字通
Jul 24 Javascript
24个解决实际问题的ES6代码片段(小结)
Feb 02 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
Jul 20 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
《星际争霸II》全新指挥官斯台特曼现已上线
2020/03/08 星际争霸
php环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
2007/03/16 PHP
php 设计模式之 单例模式
2008/12/19 PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
2011/07/13 PHP
PHP性能优化工具篇Benchmark类调试执行时间
2011/12/06 PHP
PHP与MYSQL中UTF8 中文排序示例代码
2014/10/23 PHP
Symfony核心类概述
2016/03/17 PHP
javascript中对对层的控制
2006/12/29 Javascript
js 鼠标拖动对象 可让任何div实现拖动效果
2009/11/09 Javascript
js DOM的学习笔记
2011/12/22 Javascript
js的alert弹出框出现乱码解决方案
2013/09/02 Javascript
JS简单的图片放大缩小的两种方法
2013/11/11 Javascript
javascript操作符&quot;!~&quot;详解
2015/02/10 Javascript
JavaScript操作cookie类实例
2015/03/31 Javascript
javascript动态创建表格及添加数据实例详解
2015/05/13 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
jQuery Validate 数组 全部验证问题
2017/01/12 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
浅析js实现网页截图的两种方式
2019/11/01 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
pycharm快捷键汇总
2020/02/14 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
Python中如何引入第三方模块
2020/05/27 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
全球性的在线商店:Vogca
2019/05/10 全球购物
医生自荐信
2013/10/11 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
python实现简单倒计时功能
2021/04/21 Python
nginx刷新页面出现404解决方案(亲测有效)
2022/03/18 Servers
Redis官方可视化工具RedisInsight安装使用教程
2022/04/19 Redis