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 相关文章推荐
Code:findPosX 和 findPosY
Dec 20 Javascript
更优雅的事件触发兼容
Oct 24 Javascript
JS过滤url参数特殊字符的实现方法
Dec 24 Javascript
详解JavaScript语法对{}处理的坑爹之处
Jun 05 Javascript
JavaScript DOM节点添加示例
Jul 16 Javascript
Bootstrap carousel轮转图的使用实例详解
May 17 Javascript
JS对HTML表格进行增删改操作
Aug 22 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
Oct 18 Javascript
浅谈React Native Flexbox布局(小结)
Jan 08 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
Oct 08 Javascript
Vue3.0的优化总结
Oct 16 Javascript
vue组件中传值EventBus的使用及注意事项说明
Nov 16 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事务rollback&amp;commit示例
2010/02/08 PHP
php基于Snoopy解析网页html的方法
2015/07/09 PHP
PHP实现冒泡排序的简单实例
2016/05/26 PHP
PHP的Json中文处理解决方案
2016/09/29 PHP
php中get_magic_quotes_gpc()函数说明
2017/02/06 PHP
php使用crypt()函数进行加密
2017/06/08 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
2018/05/24 PHP
Yii框架中使用PHPExcel的方法分析
2019/07/25 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
Laravel框架下载,安装及路由操作图文详解
2019/12/04 PHP
php在linux环境中如何使用redis详解
2020/12/15 PHP
一个通过script自定义属性传递配置参数的方法
2014/09/15 Javascript
javascript 判断整数方法分享
2014/12/16 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
JS实现微信弹出搜索框 多条件查询功能
2016/12/13 Javascript
BootStrap实现带关闭按钮功能
2017/02/15 Javascript
js实现横向拖拽导航条功能
2017/02/17 Javascript
Web纯前端“旭日图”实现元素周期表
2017/03/10 Javascript
微信小程序手势操作之单触摸点与多触摸点
2017/03/10 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
Vue表单及表单绑定方法
2018/09/04 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
详解vuex之store源码简单解析
2019/06/13 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
[01:23]一分钟告诉你 DOTA2为什么叫信仰2
2014/06/20 DOTA
python写入xml文件的方法
2015/05/08 Python
Win10下Python环境搭建与配置教程
2016/11/18 Python
Python中常见的异常总结
2018/02/20 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
Python 处理日期时间的Arrow库使用
2020/08/18 Python
韩国女装NO.1网店:STYLENANDA
2016/09/16 全球购物
劳动竞赛活动方案
2014/02/20 职场文书
面试感谢信范文
2015/01/22 职场文书