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 相关文章推荐
仿163填写邮件地址自动显示下拉(无优化)
Nov 05 Javascript
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
Apr 07 Javascript
jquery ajax 简单范例(界面+后台)
Nov 19 Javascript
如何判断元素是否为HTMLElement元素
Dec 06 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
Dec 16 Javascript
ajax+jQuery实现级联显示地址的方法
May 06 Javascript
用window.onerror捕获并上报Js错误的方法
Jan 27 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
Aug 05 Javascript
vue 组件的封装之基于axios的ajax请求方法
Aug 11 Javascript
vuejs点击class变化的实例
Sep 05 Javascript
React 组件中的 bind(this)示例代码
Sep 16 Javascript
angular组件间通讯的实现方法示例
May 07 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
制作美丽的拉花
2021/03/03 冲泡冲煮
PHP生成带有雪花背景的验证码
2006/10/09 PHP
mysql5的sql文件导入到mysql4的方法
2008/10/19 PHP
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
清除div下面的所有标签的方法
2014/02/17 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
JS hashMap实例详解
2016/05/26 Javascript
javaScript中定义类或对象的五种方式总结
2016/12/04 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
2017/03/02 Javascript
vue 粒子特效的示例代码
2017/09/19 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
python中关于日期时间处理的问答集锦
2013/03/08 Python
跟老齐学Python之Python文档
2014/10/10 Python
python测试mysql写入性能完整实例
2018/01/18 Python
如何在python字符串中输入纯粹的{}
2018/08/22 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
完美解决python3.7 pip升级 拒绝访问问题
2019/07/12 Python
python各类经纬度转换的实例代码
2019/08/08 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
python 实现屏幕录制示例
2019/12/23 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
大学生求职自荐信
2013/12/12 职场文书
高中生物教学反思
2014/02/05 职场文书
民间借贷协议书范本
2014/10/01 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL