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 相关文章推荐
jquery插件 autoComboBox 下拉框
Dec 22 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
Dec 12 Javascript
js中opener与parent的区别详细解析
Jan 14 Javascript
javascript 判断整数方法分享
Dec 16 Javascript
深入理解JavaScript中的箭头函数
Jul 28 Javascript
ANGULARJS中使用JQUERY分页控件
Sep 16 Javascript
JavaScript数组合并的多种方法
May 22 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
Nov 01 Javascript
对于Javascript 执行上下文的全面了解
Sep 05 Javascript
详解基于Koa2开发微信二维码扫码支付相关流程
May 16 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
Jul 20 Javascript
微信小程序实现限制用户转发功能的实例代码
Feb 22 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
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
destoon找回管理员密码的方法
2014/06/21 PHP
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
jquery自定义插件——window的实现【示例代码】
2016/05/06 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
jQuery用noConflict代替$的实现方法
2017/04/12 jQuery
深入理解angular2启动项目步骤
2017/07/15 Javascript
vuex进阶知识点巩固
2018/05/20 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
vue elementUI 表单校验功能之数组多层嵌套
2019/06/04 Javascript
微信小程序实现点击效果
2019/06/21 Javascript
JS中的算法与数据结构之集合(Set)实例详解
2019/08/20 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
[57:24]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python检测lvs real server状态
2014/01/22 Python
Python判断文件或文件夹是否存在的三种方法
2017/07/27 Python
python reduce 函数使用详解
2017/12/05 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
美国在线精品家居网站:Burke Decor
2017/04/12 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
作风建设演讲稿
2014/05/23 职场文书
我们的节日中秋活动方案
2014/08/19 职场文书
优秀党员申报材料
2014/12/18 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python