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插件FusionCharts绘制2D环饼图效果示例【附demo源码】
Apr 10 jQuery
jQuery实现鼠标滑过预览图片大图效果的方法
Apr 26 jQuery
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
May 20 jQuery
基于jQuery实现的Ajax 验证用户名唯一性实例代码
Jun 28 jQuery
基于jQuery Easyui实现登陆框界面
Jul 10 jQuery
用户管理的设计_jquery的ajax实现二级联动效果
Jul 13 jQuery
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
Aug 01 jQuery
JavaScript自执行函数和jQuery扩展方法详解
Oct 27 jQuery
使用jQuery动态设置单选框的选中效果
Dec 06 jQuery
jQuery实现获取当前鼠标位置并输出功能示例
Jan 05 jQuery
javascript/jquery实现点击触发事件的方法分析
Nov 11 jQuery
基于jQuery拖拽事件的封装
Nov 29 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地址引用(php地址引用的效率问题)
2012/03/23 PHP
php IP转换整形(ip2long)的详解
2013/06/06 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
php通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
JS实现日期时间动态显示的方法
2015/12/07 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
2016/02/19 Javascript
详解Angularjs中的依赖注入
2016/03/11 Javascript
深入理解js promise chain
2016/05/05 Javascript
Angular.js组件之input mask对input输入进行格式化详解
2017/07/10 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
Angular使用动态加载组件方法实现Dialog的示例
2018/05/11 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
python静态方法实例
2015/01/14 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
SQL中where和having的区别
2012/06/17 面试题
售后服务承诺书范文
2014/03/26 职场文书
个人授权委托书范本
2014/09/14 职场文书
员工保密协议书
2014/09/27 职场文书
卖房协议书样本
2014/10/30 职场文书
小学一年级学生评语大全
2014/12/25 职场文书
项目经理岗位职责
2015/01/31 职场文书
2016新年慰问信范文
2015/03/25 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书
护理培训心得体会
2016/01/22 职场文书