事件循环相关 | 青训营

137 阅读3分钟

1. 事件冒泡和事件捕获

事件冒泡和捕获是两种不同的事件传播方式,它们描述了当一个元素触发事件时,这个事件如何在它的父元素和子元素之间传递。

事件冒泡是指当一个元素触发事件时,这个事件会从最内层的元素开始,逐层向外传播,直到最外层的元素。也就是说,先触发当前元素的事件处理函数,然后再触发它的父元素的事件处理函数,依次类推,直到 document 对象。

事件捕获是指当一个元素触发事件时,这个事件会从最外层的元素开始,逐层向内传播,直到最内层的元素。也就是说,先触发 document 对象的事件处理函数,然后再触发它的子元素的事件处理函数,依次类推,直到当前元素。

事件冒泡和捕获都是为了实现事件委托,即利用事件在 DOM 树中的传播机制,让父元素或祖先元素代替子元素或后代元素处理事件,从而减少事件监听器的数量,提高性能。

我们可以使用 addEventListener 方法来为元素添加事件监听器,并指定第三个参数 useCapture 来决定是在冒泡阶段还是捕获阶段执行事件处理函数。默认情况下,useCapture 为 false,表示在冒泡阶段执行。如果设置为 true,则表示在捕获阶段执行。

我们也可以使用 stopPropagation 方法来阻止事件的进一步传播,即在当前元素执行完事件处理函数后,不再向外或向内传递。这样可以避免一些不必要的冲突或重复操作。

2. 说一下事件委托

事件委托的原理是基于事件的传播机制,即当一个元素触发事件时,这个事件会在它的父元素和子元素之间传递。我们可以利用这个特性,让一个元素代替它的子元素或后代元素处理事件,从而减少事件监听器的数量,提高性能。

例如,如果我们有一个 ul 元素,里面有很多个 li 元素,我们想要给每个 li 元素添加点击事件。如果我们直接为每个 li 元素都添加事件监听器,那么会占用很多内存,并且如果动态添加或删除 li 元素,还需要更新事件监听器。但是如果我们利用事件委托,只为 ul 元素添加一个事件监听器,然后在事件处理函数中判断触发事件的元素是哪个 li 元素,就可以实现同样的效果,而且更加灵活和高效。

优点

  • 减少事件监听器的数量,节省内存和提高性能。
  • 动态添加或删除子元素或后代元素时,无需更新事件监听器,更加灵活和高效。

局限性

  • 事件必须能够冒泡
  • 其次,委托可能会增加 CPU 负载,因为容器级别的处理程序会对容器中任意位置的事件做出反应,而不管我们是否对该事件感兴趣。