javascript事件监听与事件委托实例详解


Posted in Javascript onAugust 16, 2019

本文实例讲述了javascript事件监听与事件委托。分享给大家供大家参考,具体如下:

事件监听与事件委托

在js中,常用到element.addEventListener()来进行事件的监听。但是当页面中存在大量需要绑定事件的元素时,这种方式可能会带来性能影响。此时,我们可以用事件委托的方式来进行事件的监听。

每个事件都经历三个阶段

  • 捕获
  • 到达目标
  • 冒泡

事件委托需要用到事件的冒泡,冒泡就是事件发生时,上层会一层一层的接收这个事件。

如下页面结构:

<body>
  <div id="div1">
    <div id="div2">
      <button>按钮</button>
    </div>
  </div>
</body>

当点击按钮,首先button接收到事件,然后向上层冒泡,接着id="div1"接收到事件,接着是id="div2",一直到达document的顶层。

所以可以添加一个事件处理器到父级,由他接收所有子节点的事件信息。这就是事件委托。

事件监听与事件委托性能比较

通过构建若干个button元素,并为其绑定事件监听器来比较事件监听与事件委托的性能。

1.构建若干个button元素,并添加到body中

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title></title>
</head>
<body id='body'>
  <script type="text/javascript">
    var body = document.getElementById('body');
    var fragment = document.createDocumentFragment();
    for (var i = 0; i < 100; i++) {
      var btn = document.createElement('button');
      btn.id = i;
      btn.className = 'btn';
      btn.type = 'button';
      btn.innerText = '按钮'
      fragment.appendChild(btn);
    }
    body.appendChild(fragment);
  </script>
</body>
</html>

此时页面生成了100个按钮,id为0到99,class为'btn';fragment是一个文档片段,相比较下面这种代码的好处是

for(var i = 0;i<100;i++){
  var btn=document.createElement('button');
  body.appendChild(btn);
}

前者页面只重排一次,后者页面重排了100次;所以若遇到大模块添加dom时,最好使用fragment

2.为button绑定事件监听器,并设置时间戳

var btn = document.querySelectorAll('.btn');
var date1 = new Date();
for (var i = 0; i < btn.length; i++) {
    (function(i) {
      btn[i].addEventListener('click', function() {
        console.log(i);
      });
    })(i)
}

3.给body绑定click事件,实现事件的委托

var date2 = new Date();
body.addEventListener('click', function(e) {
    var element = e.target;
    if (element.className == 'btn') {
      console.log(element.id);
    }
})
var date3 = new Date();

下面我们来通过时间戳分析一下这两种方式的性能。

console.log(date2 - date1);
console.log(date3 - date1);

通过改变button的数量,得到以下数据(单位:ms):

在360兼容模式下:

  • 当button数量为100时,平均为 6 0
  • 当button数量为400时,平均为 20 0
  • 当button数量为1000时,平均为 48 0

在新版谷歌下:

  • 当button数量为1000时,平均为 3 0

可见当页面中有大量元素需要绑定事件时,并不是所有的事件都会被触发,而这时对所有需要监听的元素都绑定事件处理器无疑是要花费代价的,而通过事件委托的方式可以很好的解决性能问题,不需要为每个元素都绑定事件监听器。但是要写一些逻辑代码来判断事件源。所以,如果你的web项目对性能要求极为苛刻,事件委托也不失于一种优雅的选择

PS:这里再为大家附上javascript系统自带事件参考表供大家参考查询:

javascript事件与功能说明大全:
http://tools.3water.com/table/javascript_event

更多关于JavaScript相关内容可查看本站专题:《JavaScript事件相关操作与技巧大全》、《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
csdn 博客的css样式 v3
Feb 24 Javascript
JQuery 写的个性导航菜单
Dec 24 Javascript
JavaScript 反科里化 this [译]
Sep 20 Javascript
jquery 获取dom固定元素 添加样式的简单实例
Feb 04 Javascript
jQuery+JSON实现AJAX二级联动实例分析
Dec 18 Javascript
JavaScript的instanceof运算符学习教程
Jun 08 Javascript
vue中mint-ui环境搭建详细介绍
Apr 06 Javascript
form表单序列化详解(推荐)
Aug 15 Javascript
JS中移除非数字最多保留一位小数
May 09 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
Dec 06 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
Jul 22 Javascript
JavaScript 实现轮播图特效的示例
Nov 05 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&amp;平移轮播效果
Aug 16 #Javascript
详解Vue中组件传值的多重实现方式
Aug 16 #Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
Aug 16 #Javascript
JavaScript JSON数据处理全集(小结)
Aug 15 #Javascript
JointJS JavaScript流程图绘制框架解析
Aug 15 #Javascript
基于vue写一个全局Message组件的实现
Aug 15 #Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
Aug 15 #Javascript
You might like
日本十大科幻动漫 宇宙骑士垫底,第一已成经典
2020/03/04 日漫
php中看实例学正则表达式
2006/12/25 PHP
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
php 生成短网址原理及代码
2014/01/23 PHP
destoon官方标签大全
2014/06/20 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
js活用事件触发对象动作
2008/08/10 Javascript
jquery 页面全选框实践代码
2010/04/02 Javascript
js封装的textarea操作方法集合(兼容很好)
2010/11/16 Javascript
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
Bootstrap每天必学之响应式导航、轮播图
2016/04/25 Javascript
Vue.js学习示例分享
2017/02/05 Javascript
详解ionic本地相册、拍照、裁剪、上传(单图完全版)
2017/10/10 Javascript
vue如何获取自定义元素属性参数值的方法
2019/05/14 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
JSON Web Tokens的实现原理
2017/04/02 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
python图像处理入门(一)
2019/04/04 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
2020/02/03 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
pytorch SENet实现案例
2020/06/24 Python
matplotlib交互式数据光标实现(mplcursors)
2021/01/13 Python
通用的Django注册功能模块实现方法
2021/02/05 Python
Swanson中国官网:美国斯旺森健康产品公司
2021/03/01 全球购物
不假外出检讨书
2014/01/27 职场文书
生物制药专业求职信
2014/03/11 职场文书
个人培训自我鉴定
2014/03/28 职场文书
大学竞选班长演讲稿
2014/04/24 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
灵魂歌王观后感
2015/06/17 职场文书
写给消防战士们的一封慰问信
2019/10/07 职场文书