事件委托
什么是事件委托?
什么是事件委托? 事件委托也称之为事件代理(Event Delegation)。 是JavaScript中常用绑定事件的常用技巧。 顾名思义,“事件代理”即是把原本需要绑定在子元素的响应事件委托给父元素,让父元素担当事件监听的职务。
举个通俗的例子:比如一个宿舍的同学同时快递到了,一种方法就是他们一个个去领取,还有一种方法就是把这件事情委托给宿舍长,让一个人出去拿好所有快递,然后再根据收件人一 一分发给每个宿舍同学;
在这里,取快递就是一个事件,每个同学指的是需要响应事件的 DOM 元素,而出去统一领取快递的宿舍长就是代理的元素,所以真正绑定事件的是这个元素,按照收件人分发快递的过程就是在事件执行中,需要判断当前响应的事件应该匹配到被代理元素中的哪一个或者哪几个。
场景一
你要给100个按钮添加点击事件,咋办?
答:监听这100个按钮的祖先,等冒泡的时候判断target是不是这100个按钮中的一个
场景二
你要监听目前不存在的元素的点击事件,咋办?
答:监听祖先,等点击的时候看看是不是我想要监听的元素即可优点省监听数(内存)可以监听动态元素
委托的优点
- 减少内存消耗 试想一下,若果我们有一个列表,列表之中有大量的列表项,我们需要在点击列表项的时候响应一个事件;
<ul id="list">
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
......
<li>item n</li>
</ul>
// ...... 代表中间还有未知数个 li
如果给每个列表项一一都绑定一个函数,那对于内存消耗是非常大的,效率上需要消耗很多性能;
因此,比较好的方法就是把这个点击事件绑定到他的父层,也就是 ul
上,然后在执行事件的时候再去匹配判断目标元素;
所以事件委托可以减少大量的内存消耗,节约效率。
- 动态绑定事件 比如上述的例子中列表项就几个,我们给每个列表项都绑定了事件;
在很多时候,我们需要通过 AJAX 或者用户操作动态的增加或者去除列表项元素,那么在每一次改变的时候都需要重新给新增的元素绑定事件,给即将删去的元素解绑事件;
如果用了事件委托就没有这种麻烦了,因为事件是绑定在父层的,和目标元素的增减是没有关系的,执行到目标元素是在真正响应执行事件函数的过程中去匹配的;
所以使用事件在动态绑定事件的情况下是可以减少很多重复工作的。
封装事件委托
要求
写出这样一个函数on('click','#testiv','li',fn)
当用户点击#testDiv里的li元素时,调用fn函娄要求用到事件委托
答案一
判断target是否匹配'li
实例代码:
饥人谷JS Bin (jirengu.com)
答案二
递归判断target / target的爸爸/target的爷爷
引用文献:JavaScript 事件委托详解
推荐阅读
-
App:templatesNuxt.js 应用程序中生成的事件钩子详解
-
如何在 uniapp 上绑定全局事件总线(引入弹出窗口等自定义全局组件)
-
详细介绍 Nuxt.js 应用程序中的应用程序:解析事件钩子
-
服务器发送事件 (SSE) GPT 场景实施 - 服务器端(后端)
-
模块:Nuxt.js 应用程序中的事件钩子前详解
-
OpenCV 高级图形用户界面(4)获取鼠标滚轮事件增量值的函数 getMouseWheelDelta 的使用--代码示例
-
为 unity 中指定的动画片段添加动画事件,播放动画并获取片段的持续时间。-示例 1
-
JQuery 基本介绍和用法-JQuery 事件
-
Qt --- 系统相关 --- 事件、文件操作、多线程编程、网络编程、多媒体
-
1.随机事件和概率