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 相关文章推荐
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
Oct 24 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
Sep 12 Javascript
JavaScript编程中容易出BUG的几点小知识
Jan 31 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
Aug 21 Javascript
浅析js绑定事件的常用方法
May 15 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
Oct 15 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
Oct 02 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
Nov 16 Javascript
javascript 构建模块化开发过程解析
Sep 11 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
Nov 06 Javascript
vue 开发企业微信整合案例分析
Dec 02 Javascript
javascript+css实现俄罗斯方块小游戏
Jun 28 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中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
php给数组赋值的实例方法
2019/09/26 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
十个免费的web前端开发工具详细整理
2017/09/18 Javascript
Angular4 Select选择改变事件的方法
2018/10/09 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
vue-week-picker实现支持按周切换的日历
2019/06/26 Javascript
Python编程中的反模式实例分析
2014/12/08 Python
Python中的defaultdict与__missing__()使用介绍
2018/02/03 Python
django ajax json的实例代码
2018/05/29 Python
Python爬虫文件下载图文教程
2018/12/23 Python
Python实现对特定列表进行从小到大排序操作示例
2019/02/11 Python
Keras模型转成tensorflow的.pb操作
2020/07/06 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
最新茶叶店创业计划书
2014/01/14 职场文书
优秀大学生自荐信
2014/06/09 职场文书
2014年最新离婚协议书范本
2014/10/11 职场文书
幼儿园见习报告范文
2014/10/30 职场文书
大学学生会竞选稿
2015/11/19 职场文书
python解决12306登录验证码的实现
2021/04/18 Python
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL
解决 redis 无法远程连接
2022/05/15 Redis
聊聊CSS粘性定位sticky案例解析
2022/06/01 HTML / CSS