简述 DOM 事件模型

260 阅读1分钟

先从一个例子入手:

<div class=爷爷>
 <div class=爸爸>
  <div class=儿子>
   文字
  </div>
 </div>
</div>
  • 当我们点击文字的时候,都算点击了儿子,爸爸和爷爷。
  • 如果分别给这三个div做事件监听,那么先从谁开始呢。这个具有争议的话题,不同的浏览器有不同的看法.
  • IE认为应该按照儿子->爸爸->爷爷的顺序,但是当时的网景却认为应该按照爷爷->爸爸->儿子的顺序来执行.
  • 最后W3C规定:首先按爷爷->爸爸->儿子的顺序看有没有函数监听;然后按儿子->爸爸->爷爷的顺序看有没有函数监听。有监听就调用,并提供事件信息,没有就跳过。

术语

事件捕获:从外向内找监听函数

事件冒泡:从内向外找监听函数

事件绑定API:addEventListener

W3C: baba.addEventListener('click',fn,bool)

  • 如果bool不传或者为falsy,让fn走冒泡
  • 如果bool为true让fn走捕获

取消冒泡

  • 捕获不可以取消,但是冒泡可以

  • e.stopPropagation()

  • 但有些事件不可取消冒泡,如:scroll滚动事件

  • MDN查看是否冒泡:

    BUbbles表示是否冒泡

    Cancelable表示是否支持开发者取消冒泡