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 相关文章推荐
flash遮住div问题的正确解决方法
Feb 27 Javascript
JavaScript获取XML数据附示例截图
Mar 05 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
May 11 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
Sep 15 Javascript
将 vue 生成的 js 上传到七牛的实例
Jul 28 Javascript
浅谈vuex之mutation和action的基本使用
Aug 29 Javascript
Vue调试神器vue-devtools安装方法
Dec 12 Javascript
node.js之基础加密算法模块crypto详解
Sep 11 Javascript
vue-cli3+typescript新建一个项目的思路分析
Aug 06 Javascript
js+canvas实现两张图片合并成一张图片的方法
Nov 01 Javascript
JavaScript实现简单随机点名器
Nov 21 Javascript
vue 解决IOS10低版本白屏的问题
Nov 17 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
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
PHP中copy on write写时复制机制介绍
2014/05/13 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
ExtJs事件机制基本代码模型和流程解析
2010/10/24 Javascript
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
jQuery时间轴插件使用详解
2015/07/16 Javascript
vue数据双向绑定原理解析(get &amp; set)
2017/03/08 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
Mobile Web开发基础之四--处理手机设备的横竖屏问题
2017/08/11 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
js动态引入的四种方法
2018/05/05 Javascript
Nodejs实现爬虫抓取数据实例解析
2018/07/05 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
element-ui组件table实现自定义筛选功能的示例代码
2019/03/15 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
JavaScript实现图片伪异步上传过程解析
2020/04/10 Javascript
jQuery 淡入/淡出效果函数用法分析
2020/05/19 jQuery
用云开发Cloudbase实现小程序多图片内容安全监测的代码详解
2020/06/07 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
Python编程实现删除VC临时文件及Debug目录的方法
2017/03/22 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
python树莓派红外反射传感器
2019/01/21 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
酒店服务与管理毕业生求职信
2013/11/02 职场文书
你的创业计划书怎样才能打动风投
2014/02/06 职场文书
人事任命书范本
2015/09/21 职场文书
jquery插件实现代码雨特效
2021/04/24 jQuery
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python