事件委托(事件代理)

222 阅读2分钟

一、何为事件委托

JavaScript里面一项很火热的技术应该是事件委托(event delegation)。使用事件委托技术能避免对每个元素添加事件监听器。相反,把事件监听器添加到它们的父元素上。事件监听器会分析从子元素冒泡上来的事件,找到它是哪个子元素的事件。也就是说把监听子元素上的监听函数放到它的父节点上。这样新添加的子元素仍然可以执行事件回调函数。在一些低版本的浏览器(如IE6),由于子元素并没有绑定事件,因此在删除改子元素时不会造成内存泄漏的问题。因此,事件委托有三大优势,即减少事件的数量、避免内存的外泄、预测未来的元素。

二、优点

1.减少内存的消耗

试想一下,如果我们有一个列表,列表之中有大量的列表项,我们需要在点击列表项的时候响应一个事件;

如果给每个列表项一一都绑定一个函数,那对于内存消耗是非常大的,效率上需要消耗很多性能;

因此,比较好的方法就是把这个点击事件绑定到他的父层,也就是 ul 上,然后在执行事件的时候再去匹配判断目标元素;

所以事件委托可以减少大量的内存消耗,节约效率。 在代码中, target 元素则是在 #list 元素之下具体被点击的元素,然后通过判断 target 的一些属性(比如:nodeName,id 等等)可以更精确地匹配到某一类 #list li 元素之上。

比如 focus、blur 之类的事件本身没有事件冒泡机制,所以无法委托; mousemove、mouseout这样的事件,虽然有事件冒泡,但是只能不断通过位置去计算定位,对性能消耗高,因此也是不适合于事件委托。

2.可以监听动态元素

问:可以监听当前不存在的元素吗???

答:Of course 可以监听未来会出现的元素。

3.总结

事件委托,利用DOM事件机制,在父元素上添加事件监听器,由于DOM可以事件冒泡,事件监听器可以监听到子元素的触发事件,可设监听器数量,可以监听动态(未来)元素。