关于浏览器的事件流

90 阅读1分钟

先说结果: 捕获 > 冒泡

说一下我的理解: 界面中的每个元素其实都会有感知事件的能力,元素感知的无非就是两种

  • 捕获
  • 冒泡 通常我们怎么给元素绑定一个监听呢? 没错就是 addEventListener
    dom.addEventListener('click', () => {}, ifCapture) 显而易见, 第三个参数就是告诉浏览器这个元素是否感知捕获事件,也就是在事件触发的那一刻是否执行你绑定的这个函数。 默认是 false 也就是感知冒泡事件。
  <div class="baba">
    <div class="son"></div>
  </div>
  document.addEventListener('click', e => {
    console.log('document')
  }, false)


  ba.addEventListener('click', e => {
    console.log('baba')
  }, true)


  son.addEventListener('click', e => {
    console.log('son1')
  }, false)

  son.addEventListener('click', e => {
    console.log('son2')
  }, true)

打印结果: // baba son2 son1 document

然后我解释一下这个打印是怎么发生的:

  • 在你点击元素 son 的时候, 点击这个动作先被 document 捕获到, 但是你绑定的方法是去感知冒泡的,此时是捕获阶段,所以不打印。捕获开始向子元素流, baba这个元素感知了捕获这个事件,打印结果 baba 继续向下流,son这个元素感知了捕获和冒泡,但是此时是捕获阶段,所以打印 son2, 捕获阶段结束,开始冒泡,从son元素开始向上, 打印 son1 document。