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源码】
May 13 jQuery
jQuery实现html双向绑定功能示例
Oct 09 jQuery
jquery select插件异步实时搜索实例代码
Oct 20 jQuery
javascript+jQuery实现360开机时间显示效果
Nov 03 jQuery
浅谈jquery fullpage 插件增加头部和版权的方法
Mar 20 jQuery
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
Mar 28 jQuery
jQuery实现动态生成年月日级联下拉列表示例
May 11 jQuery
jQuery操作cookie的示例代码
Jun 05 jQuery
基于jquery实现的tab选项卡功能示例【附源码下载】
Jun 10 jQuery
基于jQuery实现可编辑的表格
Dec 11 jQuery
jQuery实现移动端笔触canvas电子签名
May 21 jQuery
jQuery是用来干什么的 jquery其实就是一个js框架
Feb 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中unserialize返回false的解决方法
2014/09/22 PHP
PHP定时任务延缓执行的实现
2014/10/08 PHP
PHP中preg_match函数正则匹配的字符串长度问题
2015/05/27 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
2015/10/10 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
原生JS实现图片左右轮播
2016/12/30 Javascript
浅谈ng-zorro使用心得
2018/12/03 Javascript
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
微信小程序中button去除默认的边框实例代码
2019/08/01 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
python操作xml文件示例
2014/04/07 Python
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
2014/05/05 Python
用Python从零实现贝叶斯分类器的机器学习的教程
2015/03/31 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
应届毕业生求职自荐书
2014/01/03 职场文书
西式婚礼主持词
2014/03/13 职场文书
2014年药店工作总结
2014/11/20 职场文书
倡议书作文
2015/01/19 职场文书
费城故事观后感
2015/06/10 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
win11无法添加打印机怎么办? 提示windows无法打开添加打印机的解决办法
2022/04/05 数码科技