面试题-->关于事件委托如何理解?

630 阅读2分钟

事件委托指的是给父元素注册事件,委托给子元素处理

1.为什么要使用事件委托

在 JavaScript 中,页面内事件处理程序的个数会直接影响页面的整体性能,因为每个事件处理程序都是对象,对象会占用内存,内存中的对象越多,页面的性能则越差。此外,事件处理程序需要与 DOM 节点进行交互,访问 DOM 的次数越多,引起浏览器重绘和重排的次数也就越多,从而影响页面的性能。

2.事件委托实现原理

事件委托是利用事件的冒泡原理来实现的,大致可以分为三个步骤

  1. 确定要添加事件元素的父级元素

  2. 给父元素定义事件,监听子元素的冒泡事件

  3. 使用 event.target 来定位触发事件冒泡的子元素

3.事件委托的优点:

1.减少事件注册,节省内存

2.在table上代理所有td的click事件

3.在ul上代理所有的li的click事件

4.简化了dom节点更新时,对应事件的更新

5.不用在新添加的li上绑定click事件

6.当删除某个li时,不用移解绑上面的click事件

<ul id="list">
  <li>item 1</li>
  <li>item 2</li>
  <li>item 3</li>
  ......
  <li>item n</li>
</ul>
```

4.缺点:

1.事件委托给予冒泡,对于不冒泡的事件不支持. 2.层级过多,冒泡过程中,可能会被某层阻止掉 3.理论上委托会导致浏览器频繁调用处理函数,,虽然很可能不需要处理,所以建议就近委托,比如在table上代理id, 而不是在doncument上代理td

5.总结

要使用事件委托,需要保证事件能够发生冒泡,适合使用事件委托的事件有 click、keydown、keyup 等。需要注意的是,虽然 mouseover 和 mouseout 事件也会发生事件冒泡,但处理起来非常麻烦,所以不推荐在 mouseover 和 mouseout 事件中使用事件委托。 另外,对于不会发生事件冒泡的事件(例如 load、unload、abort、focus、blur 等),则无法使用事件委托。