欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaScript进阶(四十三):捕获,srcElement

程序员文章站 2022-06-22 11:36:11
这篇博客,我们先来说说事件流这个东西。首先,我们前面博客说的那个冒泡,它就是事件流里面的一部分。然后除了冒泡以外,其实还有另一个东西,叫做捕获。简单来说,冒泡是从下往上,从子级往父级。而捕获,是从上往下。当然,正常的情况下,如果我们用 onclick 之类的去加东西,是看不到捕获的,只有在一种情况下能看到,就是在你去用 addEventListener 去做事件绑定的时候才能看到。比如,我们现在有个 div,里面有个 button:正常的情况下,我们知道应该是按钮点击完,事....

这篇博客,我们先来说说事件流这个东西。

首先,我们前面博客说的那个冒泡,它就是事件流里面的一部分。

然后除了冒泡以外,其实还有另一个东西,叫做捕获。

简单来说,冒泡是从下往上,从子级往父级。而捕获,是从上往下。

 

当然,正常的情况下,如果我们用 onclick 之类的去加东西,是看不到捕获的,只有在一种情况下能看到,就是在你去用 addEventListener 去做事件绑定的时候才能看到。

比如,我们现在有个 div,里面有个 button:

JavaScript进阶(四十三):捕获,srcElement

正常的情况下,我们知道应该是按钮点击完,事件传给父级 div,但是现在我们要做一个不一样的事。

首先,addEventListener 有三个参数:

第一个是事件名。

第二个是事件触发时执行的函数。

第三个参数,也就是我们平常给 false 的东西,它其实管的就是事件捕获还是事件冒泡。

 

false 就是很正常的冒泡,比如我们现在就来做个小例子:

JavaScript进阶(四十三):捕获,srcElement

然后当我们点击的时候,你可以看到,先有 button,再有 div,这个很正常。

JavaScript进阶(四十三):捕获,srcElement

然后反过来,我们给它一个 true:

JavaScript进阶(四十三):捕获,srcElement

那么有了 true 之后,你就可以看到,先有 div,再有 button。

JavaScript进阶(四十三):捕获,srcElement

当然,说的更直接一点,其实捕获和冒泡,它们两个是共存的。

什么意思呢?

比如下面图中的方块,就是一级一级的元素:

JavaScript进阶(四十三):捕获,srcElement

它是先从上往下走:

JavaScript进阶(四十三):捕获,srcElement

就是说,它是先经过一个捕获的流程。

然后捕获完了之后,再从下往上走:

JavaScript进阶(四十三):捕获,srcElement

它是有前后顺序的,说白了就是先捕获,再冒泡,所以这个东西其实有一个挺好玩的用处。

就是说,有的时候,比方说我需要在父级,去处理它里面所有的事件,这种情况是存在的,我在整个父级去处理它内部的事件。

那么在这种情况下呢,就会出现一个情况,就是说我父级把这事处理完了之后,子级其实是不需要知道这个事件的。

那么在这种情况下,我们就可以用这个事件捕获了。

不过这种情况,其实出现的比较少,所以说我们一般也不太会用到它。

 

然后接下来,我现在想做一个事,我希望只有 div 响应这个事件,button 不要得到这个事件。

那么这时候,我们会很自然的想到一个 cancelBubble:

JavaScript进阶(四十三):捕获,srcElement

可以看到,现在就只有 div 了。

所以尽管它的名字叫做 cancelBubble,但它也能用来取消事件捕获。

当然,stopPropagation 也是可以的,因为 Propagation 本身的含义翻译过来就是传播的意思,stopPropagation 也就是停止传播。

JavaScript进阶(四十三):捕获,srcElement

但是 cancelBubble 是全兼容的,所以我们可以直接忘掉 stopPropagation。

 

然后,比方说我想在 div 上来处理所有的事件,但是我还得知道一件事,到底用户点的是谁,我得知道才能去做事。

所以这时候,我还需要一个东西,就是 srcElement,意思就是最原本的,是谁在触发这个事件。

JavaScript进阶(四十三):捕获,srcElement

那么你可以看到,当我们点这个 div 的时候,它告诉我们是 button。所以,我们依然可以知道是谁在触发事件。

以及,我们有些时候 ,会在一个叫做事件委托的机制下去使用它,就会很方便,这样做的目的主要是为了优化性能。

你可以想象,如果我每个元素都加一堆事件,那这个时候开销会比较大。

而如果我在最顶层,比方说我们在最顶层的实例上加一个事件,事情就会变的很方便了。

 

本文地址:https://blog.csdn.net/weixin_43921436/article/details/107813266