先从一个例子入手:
<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表示是否支持开发者取消冒泡