简述事件委托

138 阅读2分钟

1.事件委托的原理

事件委托利用事件冒泡(从最深的节点开始,然后逐步向上传播事件)只在他们的父元素上指定一个事件处理程序,就可以管理某一类型的的所有事件。

2.事件委托的实现

事件源:Event对象提供了一个属性叫target,可以返回事件的目标节点。

3.为什么要用事件委托

dom需要有事件处理程序,我们都会直接给它设事件处理,那如果是很多的dom需要添加事件处理?比如我们有100个li,每个li都有相同的click点击事件,可能我们会用for循环的方法,来遍历所有的li,然后给它们添加事件,那这么做会存在什么影响呢?

  • 操作DOM次数过多,造成浏览器的重排和重绘就越多;
  • 每个事件都是一个对象,事件处理程序越多,占用的内存越多,影响前端性能;

4.事件委托优点

  • 减少DOM操作的,减少浏览器的重绘(repaint)和重排(reflow),从而提高性能;
  • 减少内存空间的占用率,因为每一个函数都是一个对象,对象越多,内存占有率就越大,自然性能就越差,使用事件委托,只需要在其父元素中定义一个事件就可以。
  • 适合事件委托的事件有:click,mousedown,mouseup,keydown,keyup,keypress
  • 可以方便地动态添加和修改元素,不需要因为元素的改动而修改事件绑定。

5.示例

<div id="div1">
 <input type="button" id="add" value="添加" />
 <input type="button" id="remove" value="删除" />
 <input type="button" id="move" value="移动" />
 <input type="button" id="select" value="选择" />
 </div>
复制代码

target是获得了当前节点位置,但不知道具体节点名称,所以使用tagName来来获取标签名。当input被点击时,由于冒泡原理,事件就会冒泡到div上,因为div上有点击事件,所以事件就会触发。

div1.addEventListener('click', (e) => {
 const t = e.target;
 if (t.tagName.toLowerCase() === 'input') {
 switch (t.id) {
 case 'add':
 alert('添加');
 break;
 case 'remove':
 alert('删除');
 break;
 case 'move':
 alert('移动');
 break;
 case 'select':
 alert('选择');
 break;
        }
    }
})