理解Javascript——事件的捕获和冒泡

1.事件流如何去传播?

我们在学习与理解事件的捕获与冒泡之前,首先应该清楚下一个事件是如何在DOM内部传播的。当我们正在处理有几个嵌套元素的同一个事件,我们往往会对哪一个事件处理程序先触发的问题而感到疑惑。因此,理清事件的传播的顺序非常重要。

通常情况下,一个事件会从父元素开始向目标元素传播,然后它又被传播回到父元素。

Javascript分为如下三个阶段:

(1)捕获阶段:事件从父元素开始向目标元素传播,先从Windows对象开始传播。

(2)  目标阶段:该事件到达目标元素或开始该事件的元素。

  (3)   冒泡阶段:此阶段与捕获阶段相反,事件向父元素传播,直到Windows对象。

下图有助于我们进一步理解事件传播的生命周期:

 2.事件捕获和事件冒泡是什么?

(1)事件捕获:事件捕获是事件传播的初始场景,从包装元素开始,一直到启动事件生命周期的目标元素。它刚好与事件冒泡相反,从顶到底,从外到内。如下图:

  (2)  事件冒泡:事件冒泡将从一个子元素开始,在 DOM 树上传播,直到最上面的父元素事件被处理。通俗易懂的讲,事情发生的顺序就像在水底的一个气泡浮起来一样,从底到顶,从内到外。如下图:

(3)当事件捕获和事件冒泡同时存在时,捕获事件的优先级比冒泡事件的优先级高。

3.事件委托与动态绑定事件

1)事件委托

事件委托也可以叫做事件代理,是事件冒泡与事件捕获的运用。是把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事件的是外层元素,当事件响应到需要绑定的元素上时(事件捕获),会通过事件冒泡机制从而触发它的外层元素的绑定事件上,然后在外层元素上去执行函数。

比如说:在一个宿舍中,到饭点了几个人同时饿了,可以大家同时出去各买各的饭;也可以派一个代表委托给他,然后根据每个人点的不同的饭买给他。

在这个例子中,买饭就是一个事件,宿舍里的同学就是响应事件的DOM元素,委托出去买饭的代表就是代理元素,真正绑定事件的是这个元素,根据同学们不同的饭去买就是在执行事件,需要判断当前响应的事件应该匹配到被代理元素中的哪些。

事件委托的优点:能够极大程度的减少内存消耗。

(2)动态绑定事件

我们经常会通过ajax或者用户动态操作的增加、去除列表项元素,在每一次改变时都需要重新绑定或者解绑事件。通过事件委托就会变得简单很多,剩去很多重复的工作,因为事件是绑定在父层的,和目标元素的增减是没有关系的,执行到目标元素是在真正响应执行事件函数的过程中去匹配的。

4.阻止事件捕获和事件冒泡

我们在学习的时候经常会碰到一问题:如果我们在某个节点上绑定了一个事件,我们需要在点击时触发这个事件,但是由于事件冒泡,这个节点的事件被它的子元素触发了,我们应该怎么解决这个问题呢?

我们可以通过stopPropagation()来处理这个问题。

event.stopPropagation();

尽管stopPropagation()会阻止事件捕获和事件冒泡,但是无法阻止标签的默认行为,我们可以通过preventDefault()来取消默认操作。

event.preventDefault();

猜你喜欢

转载自blog.csdn.net/weixin_57959921/article/details/129360390