JS中的事件委托实例浅析


Posted in Javascript onMarch 22, 2018

本文实例讲述了JS中的事件委托。分享给大家供大家参考,具体如下:

事件委托(也叫事件代理),其实这个问题也简单,要想弄明白事件委托,我们先要把事件冒泡的机制搞清楚。举个事件冒泡的例子:

<ul>
    <li>点击</li>
</ul>
<script>
    var ul=document.getElementsByTagName('ul')[0];
    var li=document.getElementsByTagName('li')[0];
    ul.addEventListener('click', function(){
      alert('我是ul,我被点击了');
    }, false);
    li.addEventListener('click', function(){
      alert('我是li,我被点击了');
    }, false);
</script>

在这段代码中,当我们点击li的时候出发了li的click事件,但是在这时,ul的click事件也被触发了,这就是事件的冒泡。搞明白这个之后,我们就可以来说事件委托了,既然事件能从子元素(li)冒泡的父元素(ul)身上,那么我们就可以给ul自己加一个click事件,把所有li的事件都委托给了我们的父级(ul)身上,可能到这里有些朋友还是不明白这个事件委托到底有什么用,我们在举一个事件委托的实例来说明一下:

<ul>
    <li>点击1</li>
    <li>点击2</li>
    <li>点击3</li>
    <li>点击4</li>
    <li>点击5</li>
</ul>
<script>
    //使用事件委托的代码
    var ul=document.getElementsByTagName('ul')[0];
    ul.addEventListener('click', function(e){
      alert(e.target.innerHTML);
    }, false);
    //不使用事件委托,循环给li添加click事件
    var li=document.getElementsByTagName('li')
    for(var i=0;i<li.length;i++){
      li[i].onclick=function(){
        alert(this.innerHTML);
      }
    }
</script>

我们以上代码把事件委托给了ul,只给ul增加点击事件,在浏览器中运行点击对应的li会弹出li对应的innerHTML,这个function(e){};中的e这个参数实际上就是当前我们点击li时,系统传给我们的一些事件信息,e.target实际上指的就是当前我们点击的这个li,在这里我们每次弹出的都是当前点击对象的innerHTML,这就是一个简单的事件委托的案例。

而事件委托对于我们优化代码意义是非常大的,我们都知道,频繁的dom操作是非常耗费性能的,现在ul里边是5个li,我们假如不用事件委托实现上面代码所作的事情,就需要用for循环,给每个li都写一个click事件,这样一来dom操作就比较多了,如果是10个li呢,100个甚至更多呢,单不说dom操作影响的性能,li过多for循环自身就会占用大量的事件。如果利用事件委托,既避免了for循环耗费的性能,又省去了繁多的dom操作耗费的性能。

PS:关于javascript事件说明可参考本站javascript事件与功能说明大全:http://tools.3water.com/table/javascript_event

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
ASP中用Join和Array,可以加快字符连接速度的代码
Aug 22 Javascript
js对table的td进行相同内容合并示例详解
Dec 27 Javascript
js sort 二维数组排序的用法小结
Jan 24 Javascript
JavaScript中使用arguments获得函数传参个数实例
Aug 27 Javascript
详细解读AngularJS中的表单验证编程
Jun 19 Javascript
JS中的二叉树遍历详解
Mar 18 Javascript
AngularJs基本特性解析(一)
Jul 21 Javascript
微信小程序 教程之wxapp视图容器 swiper
Oct 19 Javascript
前端主流框架vue学习笔记第一篇
Jul 26 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
Dec 06 Javascript
webstrom Debug 调试vue项目的方法步骤
Jul 17 Javascript
深入理解javascript中的this
Feb 08 Javascript
jquery的 filter()方法使用教程
Mar 22 #jQuery
p5.js实现斐波那契螺旋的示例代码
Mar 22 #Javascript
基于JavaScript实现幸运抽奖页面
Jul 05 #Javascript
Vue封装一个简单轻量的上传文件组件的示例
Mar 21 #Javascript
基于vue-video-player自定义播放器的方法
Mar 21 #Javascript
基于iScroll实现内容滚动效果
Mar 21 #Javascript
JS中的回调函数实例浅析
Mar 21 #Javascript
You might like
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
php中将数组存到文件里的实现代码
2012/01/19 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
php实现数据库的增删改查
2017/02/26 PHP
调试php程序的简单步骤
2019/10/04 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
jquery京东商城双11焦点图多图广告特效代码分享
2015/09/06 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
2016/07/11 Javascript
详解AngularJS ui-sref的简单使用
2017/04/24 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
使用异步controller与jQuery实现卷帘式分页
2019/06/18 jQuery
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
基于Python实现文件大小输出
2016/01/11 Python
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
基于pandas数据样本行列选取的方法
2018/04/20 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
Pyqt QImage 与 np array 转换方法
2019/06/27 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
python和c语言哪个更适合初学者
2020/06/22 Python
党性心得体会
2014/09/03 职场文书
收款授权委托书
2014/10/02 职场文书
SQL写法--行行比较
2021/08/23 SQL Server