什么是“事件代理”
参考答案:
事件代理(Event Delegation)也称之为事件委托。是JavaScript中常用绑定事件的常用技巧。
顾名思义,“事件代理”即是把原本需要绑定在子元素的响应事件委托给父元素,让父元素担当事件监听的职务。
事件代理的原理是DOM元素的事件冒泡。
一个事件触发后,会在子元素和父元素之间传播(propagation)。这种传播分成三个阶段。
- 捕获阶段:从window对象传导到目标节点(上层传到底层)称为“捕获阶段”(capture phase),捕获阶段不会响应任何事件;
- 目标阶段:在目标节点上触发,称为“目标阶段”
- 冒泡阶段:从目标节点传导回window对象(从底层传回上层),称为“冒泡阶段”(bubbling phase)。事件代理即是利用事件冒泡的机制把里层所需要响应的事件绑定到外层。
事件委托的优点:
- 可以大量节省内存占用,减少事件注册。
比如在ul上代理所有li的click事件就非常棒
<ul id="list">
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
......
<li>item n</li>
</ul>如上面代码所示,如果给每个li列表项都绑定一个函数,那对内存的消耗是非常大的,因此较好的解决办法就是将li元素的点击事件绑定到它的父元素ul身上,执行事件的时候再去匹配判断目标元素。
- 可以实现当新增子对象时无需再次对其绑定(动态绑定事件)
假设上述的例子中列表项li就几个,我们给每个列表项都绑定了事件;
在很多时候,我们需要通过 AJAX 或者用户操作动态的增加或者删除列表项li元素,那么在每一次改变的时候都需要重新给新增的元素绑定事件,给即将删去的元素解绑事件;
如果用了事件委托就没有这种麻烦了,因为事件是绑定在父层的,和目标元素的增减是没有关系的,执行到目标元素是在真正响应执行事件函数的过程中去匹配的;所以使用事件在动态绑定事件的情况下是可以减少很多重复工作的。
使用事件委托注意事项:使用“事件委托”时,并不是说把事件委托给的元素越靠近顶层就越好。事件冒泡的过程也需要耗时,越靠近顶层,事件的”事件传播链”越长,也就越耗时。如果DOM嵌套结构很深,事件冒泡通过大量祖先元素会导致性能损失。
题目要点:
事件代理(Event Delegation)是一种在JavaScript中绑定事件的技巧,它允许开发者将事件监听器绑定到父元素上,而不是直接绑定到子元素上。事件代理的原理基于DOM事件流中的事件冒泡阶段。
事件流分为三个阶段:
- 捕获阶段:事件从窗口开始向下传播,直到目标元素。
- 目标阶段:事件在目标元素上触发。
- 冒泡阶段:事件从目标元素向上传播,直到窗口。
事件代理利用冒泡阶段来监听事件。将事件监听器绑定到父元素上,当子元素触发事件时,事件会冒泡到父元素,然后父元素上的事件监听器会处理事件。
事件代理的优点包括:
- 减少内存占用和事件注册:只需要给父元素绑定一个事件监听器,而不是为每个子元素都绑定一个。
- 动态绑定事件:当子元素动态添加或移除时,不需要重新绑定事件监听器。
注意事项:
- 事件委托的深度:事件委托应谨慎使用,尤其是在DOM结构复杂或嵌套很深的情况下。因为事件冒泡会经过多个祖先元素,这可能会导致性能问题。
- 事件委托的适用性:并不是所有事件都适合使用事件代理。对于那些不需要冒泡或需要立即处理的事件,直接绑定到目标元素上可能更高效。