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 chosen动态设置值实例介绍
Aug 08 Javascript
jquery中交替点击事件toggle方法的使用示例
Dec 08 Javascript
js中判断对象是否为空的三种实现方法
Dec 23 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
Jul 30 Javascript
javascript实现画不相交的圆
Apr 07 Javascript
JS实现的不规则TAB选项卡效果代码
Sep 18 Javascript
浅谈angularJS的$watch失效问题的解决方案
Aug 11 Javascript
深入理解React高阶组件
Sep 28 Javascript
使用vue2.0创建的项目的步骤方法
Sep 25 Javascript
浅入深出Vue之组件使用
Jul 11 Javascript
js判断一个对象是数组(函数)的方法实例
Dec 19 Javascript
使用Vue 自定义文件选择器组件的实例代码
Mar 04 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版自动生成文章摘要
2008/07/23 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
2011/07/18 PHP
一个典型的PHP分页实例代码分享
2011/07/28 PHP
Yii扩展组件编写方法实例分析
2015/06/29 PHP
PHP实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
JavaScript window.setTimeout() 的详细用法
2009/11/04 Javascript
javascript call方法使用说明
2010/01/11 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
javascript常用函数(2)
2015/11/05 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
Node.js测试中的Mock文件系统详解
2016/11/21 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
vue-router2.0 组件之间传参及获取动态参数的方法
2017/11/10 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
python判断计算机是否有网络连接的实例
2018/12/15 Python
python中metaclass原理与用法详解
2019/06/25 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
Python3 集合set入门基础
2020/02/10 Python
django跳转页面传参的实现
2020/09/17 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
英国最大的女性服装零售商:Dorothy Perkins
2017/03/30 全球购物
为什么Runtime.exec(“ls”)没有任何输出?
2014/10/03 面试题
销售演讲稿范文
2014/01/08 职场文书
消防安全管理制度
2014/02/01 职场文书
优秀电子工程系毕业生求职信
2014/05/24 职场文书
社区志愿者活动方案
2014/08/18 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
文明单位申报材料
2014/12/23 职场文书