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获取table表中的td标签(实例讲解)
Jul 28 jQuery
jQuery实现base64前台加密解密功能详解
Aug 29 jQuery
jquery鼠标悬停导航下划线滑出效果
Sep 29 jQuery
jquery ajax异步提交表单数据的方法
Oct 27 jQuery
jQuery EasyUI 选项卡面板tabs的使用实例讲解
Dec 25 jQuery
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
Mar 28 jQuery
jQuery实现的点击标题文字切换字体效果示例【测试可用】
Apr 26 jQuery
[jQuery] 事件和动画详解
Mar 05 jQuery
Jquery属性的获取/设置及样式添加/删除操作技巧分析
Dec 23 jQuery
jQuery实现的图片点击放大缩小功能案例
Jan 02 jQuery
jquery实现广告上下滚动效果
Mar 04 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之字符串变相相减的代码
2007/03/19 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
web前端开发也需要日志
2010/12/09 Javascript
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
jQuery fadeTo方法调整图片的透明度使用介绍
2013/05/06 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
使用Jquery实现每日签到功能
2015/04/03 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
Angular路由简单学习
2016/12/26 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
vue router 配置路由的方法
2018/07/26 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
在项目vue中使用echarts的操作步骤
2020/09/07 Javascript
[03:03]2014DOTA2国际邀请赛 EG战队专访
2014/07/12 DOTA
pycharm 使用心得(三)Hello world!
2014/06/05 Python
详解Python中的正则表达式的用法
2015/04/09 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
python判断设备是否联网的方法
2018/06/29 Python
如何在django中添加日志功能
2020/02/06 Python
python实现用户名密码校验
2020/03/18 Python
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
Timex手表官网:美国运动休闲手表品牌
2017/01/28 全球购物
学年自我鉴定
2014/01/16 职场文书
消防工作实施方案
2014/06/09 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
公司人力资源管理制度
2015/08/05 职场文书
教师培训学习心得体会
2016/01/21 职场文书
oracle通过存储过程上传list保存功能
2021/05/12 Oracle
MYSQL主从数据库同步备份配置的方法
2021/05/26 MySQL
css3 文字断裂效果
2022/04/22 HTML / CSS
Python序列化模块JSON与Pickle
2022/06/05 Python