JavaScript之事件委托实例(附原生js和jQuery代码)


Posted in jQuery onJuly 22, 2017

事件委托的原理依赖于事件冒泡,可以通过给父元素的事件委托来确定是哪个子元素触发了事件从而做一系列操作。

使用事件委托的优点

1、操作子元素时不用一一遍历,可以根据事件触发的对象而进行相应操作

dom结构如下:

<ul id = "oUl">
 <li class = "item"></li>
 <li class = "item"></li>
 <li class = "item"></li>
 <li class = "item"></li> 
 <li class = "item"></li>
</ul>

当li被点击时,打印该li的值。

在我们还没有学事件委托的时候我们会遍历所有li并给它们添加一个click事件,比如这样:

var aLi = document.getElementsByTagName('li');

for(var i = 0; i < aLi.length; i++) // 遍历li
 aLi[i].addEventListener('click', function() { //给每个li添加事件
 console.log(this.innerHTML); 
 });

学了事件委托之后js原生代码如下:

var oUl = document.getElementById('oUl');

oUl.addEventListener('click', function(ev) {
 ev = ev||window.event;
 var tag = ev.target; // 触发事件的对象保存在事件的target里面
 console.log(tag.innerHTML);
})

jQuery代码如下:

$('#oUl').on('click', '.item', function() { 
 console.log($(this).html()); // this指向oUl中触发了click事件并且class为item的子元素
})

相比之下,事件委托只需要获取父元素并且不需要遍历li,效率提高了不少。

2、将事件委托给父元素后,动态创建(删除)的子元素不用重新绑定(解绑)事件,实现了元素与事件的同步更新

在以往的js事件监听中,用js动态创建的子元素是没有事件的,必须重新为它们绑定事件,但是用事件委托就不用这么麻烦了,不需要重新绑定事件依旧可以实现事件监听。

当然事件绑定也是有弊端的,因为它依赖于事件冒泡,如果不支持冒泡那么就不能实现事件绑定了,不过我认为这种几率还是不高的。还有就是会发生事件误判,比如页面中的button1和button2的作用是点击时弹出值,而button3的作用是点击是页面变色,这三个button的同一个事件实现功能不同,当你将click事件委托给它们共同的父元素那么就会出现事件误判。

所以我认为事件委托是发生在一个子集合的事件功能相同的情况下,如果不相同则不要使用事件委托,以免弄巧成拙。

在实际开发中,掌握事件绑定对于代码的规范性以及效率会有一定提高,总的来说利大于弊。

以上这篇JavaScript之事件委托实例(附原生js和jQuery代码)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

jQuery 相关文章推荐
jquery实现全选、全不选以及单选功能
Mar 23 jQuery
jQuery插件之validation插件
Mar 29 jQuery
jQuery Validate表单验证插件实现代码
Jun 08 jQuery
JQuery.dataTables表格插件添加跳转到指定页
Jun 09 jQuery
深入理解jquery的$.extend()、$.fn和$.fn.extend()
Jul 08 jQuery
基于jquery实现多选下拉列表
Aug 02 jQuery
JS+jQuery实现注册信息的验证功能
Sep 26 jQuery
jQuery轻量级表单模型验证插件
Oct 15 jQuery
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
Oct 26 jQuery
jQuery实现的点击图片居中放大缩小功能示例
Jan 16 jQuery
jQuery实现动态生成年月日级联下拉列表示例
May 11 jQuery
JQuery特殊效果和链式调用操作示例
May 13 jQuery
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
Jul 22 #jQuery
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
Jul 22 #jQuery
js案例之鼠标跟随jquery版(实例讲解)
Jul 21 #jQuery
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
Jul 20 #jQuery
jQuery实现可编辑表格并生成json结果(实例代码)
Jul 19 #jQuery
jQuery实现导航栏头部菜单项点击后变换颜色的方法
Jul 19 #jQuery
利用jQuery异步上传文件的插件用法详解
Jul 19 #jQuery
You might like
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
Symfony2实现在doctrine中内置数据的方法
2016/02/05 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
2017/02/15 PHP
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
2016/12/02 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
使用bootstrap插件实现模态框效果
2017/05/10 Javascript
angular中使用Socket.io实例代码
2017/06/03 Javascript
node.js 发布订阅模式的实例
2017/09/10 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
了解JavaScript表单操作和表单域
2019/05/27 Javascript
sortable+element 实现表格行拖拽的方法示例
2019/06/07 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
js模拟F11页面全屏显示
2019/09/17 Javascript
Vue scoped及deep使用方法解析
2020/08/01 Javascript
python分析apache访问日志脚本分享
2015/02/26 Python
python中Apriori算法实现讲解
2017/12/10 Python
Python使用Tkinter实现机器人走迷宫
2018/01/22 Python
使用python实现链表操作
2018/01/26 Python
Python实现多进程的四种方式
2019/02/22 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
2020/07/31 Python
Python如何将模块打包并发布
2020/08/30 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
卡骆驰新加坡官网:Crocs新加坡
2018/06/12 全球购物
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
装饰工程师岗位职责
2014/06/08 职场文书
诉讼授权委托书
2014/10/15 职场文书
三潭印月的导游词
2015/02/12 职场文书
城南旧事观后感
2015/06/11 职场文书