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 相关文章推荐
HTML5+jQuery实现搜索智能匹配功能
Mar 24 jQuery
jQuery操作css样式
May 15 jQuery
详谈表单格式化插件jquery.serializeJSON
Jun 23 jQuery
jQuery查找和过滤_动力节点节点Java学院整理
Jul 04 jQuery
jQuery Validate插件ajax方式验证输入值的实例
Dec 21 jQuery
jQuery实现判断上传图片类型和大小的方法示例
Apr 11 jQuery
jQuery阻止事件冒泡实例分析
Jul 03 jQuery
JQuery事件委托原理与用法实例分析
May 13 jQuery
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
Oct 26 jQuery
jQuery实现弹出层效果
Dec 10 jQuery
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 jQuery
JS实现选项卡插件的两种写法(jQuery和class)
Dec 30 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基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
2013/12/23 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
jquery禁用右键示例
2014/04/28 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
Angularjs的Controller间通信机制实例分析
2016/11/07 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
URL中“#” “?” &amp;“”号的作用浅析
2017/02/04 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
JS获取url参数,JS发送json格式的POST请求方法
2018/03/29 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
Python中死锁的形成示例及死锁情况的防止
2016/06/14 Python
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
详解python pandas 分组统计的方法
2019/07/30 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
2020/06/17 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
标记环介质访问控制协议
2016/03/27 面试题
网站编辑求职信
2013/10/17 职场文书
信息技术毕业生自荐信范文
2014/03/13 职场文书
老师对学生的寄语
2014/04/09 职场文书
社区志愿者活动总结
2014/06/26 职场文书
党支部审查意见
2015/06/02 职场文书
2016年寒假见闻
2015/10/10 职场文书
助学金申请书该怎么写?
2019/07/16 职场文书
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript