stopPropagation真的只是阻止冒泡吗

638 阅读1分钟

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

前言

其实从英文翻译propagation是传播; 扩展; 宣传; 培养;(来自百度翻译)。所以我们常说的及一些文档里提到stopPaopagation是阻止冒泡是会让人产生误解。因此英文文档阅读能力很重要。

首先先下个结论:stopPropagation方法不是大家说的阻止冒泡,而是阻止传递(捕获 + 冒泡)

代码验证

前段时间看到一道考题,题目是这样的:

1、使用js原生方法addEventListener给parent和child均绑定click事件,分别关联onClickParent和onClickChild回调

2、需要点击child,只有onClickParent被触发,onClickChild回调不能被执行。

<div class="parent">
    <div class="child"></div>
</div>

看到第二问的时候我在想平常遇到的都是子被执行,父不执行,阻止冒泡即可。根据题意需要在捕获阶段执行,那有没有什么方法可以阻止捕获呢?我开始对stopPropagation是阻止冒泡这个方法产生了怀疑。

写代码试试在捕获阶段执行的函数里使用stopPropagation,结果是可以阻止后续事件发生的。

本题完整js代码

var parent=document.getElementsByClassName('parent')[0]
var child=document.getElementsByClassName('child')[0]
parent.addEventListener('click', onClickParent,true);
child.addEventListener('click', onClickChild); 
function onClickParent(e){
    e.stopPropagation()
}
function onClickChild(e){
}