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 相关文章推荐
指定位置如果有图片显示图片,无图片显示广告的JS
Jun 05 Javascript
jQuery操作input值的各种方法总结
Nov 21 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
Aug 04 Javascript
jQuery中outerHeight()方法用法实例
Jan 19 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
Mar 09 Javascript
JavaScript实现同时调用多个函数的方法
Nov 09 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
Dec 13 Javascript
webpack+react+antd脚手架优化的方法
Apr 02 Javascript
vuex进阶知识点巩固
May 20 Javascript
vue组件之间数据传递的方法实例分析
Feb 12 Javascript
详解无限滚动插件vue-infinite-scroll源码解析
May 12 Javascript
vue实现前端列表多条件筛选
Oct 26 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判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
php中的观察者模式简单实例
2015/01/20 PHP
PHP简单实现文本计数器的方法
2016/04/28 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
js数组中如何随机取出一个值
2014/06/13 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
jQuery上传插件webupload使用方法
2017/08/01 jQuery
使用微信小程序开发弹出框应用实例详解
2018/10/18 Javascript
Vue的click事件防抖和节流处理详解
2019/11/13 Javascript
Python实现Const详解
2015/01/27 Python
python中sys.argv参数用法实例分析
2015/05/20 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
python else语句在循环中的运用详解
2020/07/06 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
CSS3中的弹性布局em运用入门详解 1em等于多少像素
2021/02/08 HTML / CSS
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
如何在.net Winform里面显示PDF文档
2012/09/11 面试题
实验教师岗位职责
2014/02/13 职场文书
师德先进个人材料
2014/12/20 职场文书
酒店辞职信怎么写
2015/02/27 职场文书
服装区域经理岗位职责
2015/04/10 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书
2016情人节宣传语
2015/07/14 职场文书
2016年五一国际劳动节活动总结
2016/04/06 职场文书
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS
MySQL表锁、行锁、排它锁及共享锁的使用详解
2022/04/02 MySQL