当前位置: 移动技术网 > IT编程>开发语言>JavaScript > JavaScript进阶(四十三):捕获,srcElement

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

2020年08月10日  | 移动技术网IT编程  | 我要评论

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

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

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

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

 

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

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

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

首先,addEventListener 有三个参数:

第一个是事件名。

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

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

 

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

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

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

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

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

什么意思呢?

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

它是先从上往下走:

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

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

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

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

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

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

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

 

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

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

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

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

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

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

 

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

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

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

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

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

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

 

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网