事件委托的优缺点

前面有篇博客已经大致介绍了JS的事件流机制,包含了捕获/冒泡/事件委托,接下来就委托的优缺点进行分析记录。

事件委托(代理)出现背景

一般情况下,我们如果想给元素绑定事件处理函数的话,都会采用DOM0级或者DOM2级提供的方法,如onclick或者addEventListener等。但是当我们在一个ul下面有很多个li元素,我们如果还用老方法一个个的进行绑定注册,这样不仅会增加我们的代码量,而且当我们要移除某个li元素时还得一个个地去解除元素和事件处理函数的绑定(关乎内存),正是这些问题的出现,才有了基于冒泡机制事件委托(代理)。

在js中,当我们移除某个元素但没有将元素和监听函数进行解绑时,事件处理函数依旧会留在内存中,无法被当成垃圾回收。

优缺点总结

优点

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

  • table可以代理所有td的click事件
  • ul代理所有li的click事件

2.减少了dom节点更新的操作,处理逻辑只需在委托元素上进行,如:

  • 新添加的li不用绑定事件
  • 删除li时,不需要进行元素与处理函数的解绑

缺点

1.事件委托基于冒泡,对于onfoucs和onblur等事件不支持
2.层级过多,冒泡过程中,可能会被某层阻止掉(建议就近委托)

总之一切都是基于冒泡的,只要事件不支持冒泡或者中途有event.stopPropagation()等,那么委托就会失败,所以并不适用于直接在document上进行委托。