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 相关文章推荐
JQUERY THICKBOX弹出层插件
Aug 30 Javascript
javascript将数组插入到另一个数组中的代码
Jan 10 Javascript
JavaScript 命名空间 使用介绍
Aug 29 Javascript
jquery动态添加option示例
Dec 30 Javascript
javascript中offset、client、scroll的属性总结
Aug 13 Javascript
Jquery获取radio选中的值
May 05 jQuery
hammer.js实现图片手势放大效果
Aug 29 Javascript
轻松理解vue的双向数据绑定问题
Oct 30 Javascript
JS点击动态添加标签、删除指定标签的代码
Apr 18 Javascript
jQuery实现输入框的放大和缩小功能示例
Jul 21 jQuery
单页面vue引入百度统计的使用方法示例详解
Oct 13 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
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
在线竞拍系统的PHP实现框架(二)
2006/10/09 PHP
快速开发一个PHP扩展图文教程
2008/12/12 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
php动态读取数据清除最右边距的方法
2017/04/12 PHP
自制PHP框架之模型与数据库
2017/05/07 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
js分页代码分享
2014/04/28 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
深入理解vue $refs的基本用法
2017/07/13 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
layui输入框中只允许输入整数的实现方法
2019/09/18 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
谈谈JavaScript中的垃圾回收机制
2020/09/17 Javascript
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
Python基于Tkinter实现的记事本实例
2015/06/17 Python
Python 爬虫图片简单实现
2017/06/01 Python
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
pygame游戏之旅 添加游戏介绍
2018/11/20 Python
Python中函数参数匹配模型详解
2019/06/09 Python
python实现从本地摄像头和网络摄像头截取图片功能
2019/07/11 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
Python extract及contains方法代码实例
2020/09/11 Python
python import 上级目录的导入
2020/11/03 Python
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
微笑面对生活演讲稿
2014/05/13 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
五年级下册复习计划
2015/01/19 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书