e.stopPropagation只能阻止事件冒泡吗?

127 阅读1分钟

前言

最近看了react源码中事件注册、事件收集、事件派发关于合成事件这部分的实现,对原生的事件机制及react的合成事件也有了一部分新的认识。所以才有了标题,e.stopPropagation真正的作用是什么?

1. js中的事件处理机制

我们知道,在js中事件的触发分为3个阶段:事件捕获、处于事件目标、事件冒泡3个阶段。

image.png

在网上经常看到一些文章说,stopPropagation用于阻止事件冒泡,而我自己对于stopPropagation的认识也一直停留在只阻止冒泡这一层面。看个dmeo

2. stopPropagation停止事件的传播

看下面的demo,父元素div绑定了捕获阶段的click事件并调用了stopPropagation

<body>
  <div id="root">
    <div id="parent">
      <p>这是简单实现dispatch机制的demo,便于理解</p>
      <button id="child">click</button>
    </div>
  </div>
</body>
<script>
  const root = document.getElementById('root')
  const parent = document.getElementById('parent')
  const child = document.getElementById('child')

  parent.addEventListener('click', (e) => {
    e.stopPropagation()
    console.log('父-原生-捕获')
  }, true)
  parent.addEventListener('click', () => console.log('父-原生-冒泡'), false)

  child.addEventListener('click', () => console.log('子-原生-捕获'), true)
  child.addEventListener('click', () => console.log('子-原生-冒泡'), false)
  
  child.onclick = function(){
    console.log('111111')
  }
  
</script>

上面的打印结果:

image.png

从上面的执行结果,我们知道,stopPropagation方法也可以用来阻止捕获阶段事件向下的传播。

于是接着查看了MDN官方的定义:

image.png

3. 结尾

以此做个分享总结吧,分享给和我一样对stopPropagation理解有误的前端伙伴们,加油,前端伙伴!