1.W3C标准
- 2002年,W3C发布标准《DOM Level 2 Events Specification》。
- 它规定浏览器应该同时支持两种调用顺序。
- 首先按照爷爷=>爸爸=>儿子的顺序看有没有函数监听,然后按照儿子=>爸爸=>爷爷顺序看有没有函数监听。
- 有监听函数就调用,并提供事件信息,没有就跳过。
- 开发者可以选择将监听函数放在捕获阶段还是冒泡阶段
2.事件捕获和事件冒泡
2.1定义
- 从外向内找监听函数,叫事件捕获
- 从内向外找监听函数,叫事件冒泡
2.2图解
3.addEventListener
3.1事件绑定API
IE5以上系列:baba.attachEvent('onclick',fn)//冒泡
网景: baba.addEventListener('onclick',fn)//捕获
W3C: baba.addEventListener('onclick',fn,bool)
3.2W3C的API的bool值
- 如果bool为true,那么就让fn在冒泡阶段被浏览器被调用
- 如果bool不传或者为falsy,那么就让fn在捕获阶段浏览器调用
3.3图解
4.target和currentTarget的区别
e.target
是用户操作的元素e.currentTarget
是浏览器监听的元素 总之,两者可能相同也可能不同
5.一个特例
5.1背景
只有一个div被监听,并且fn分别在捕获阶段和冒泡阶段监听点击事件
5.2解决方案
div.addEventListener('click',f1,true)//捕获
div.addEventListener('click',f2,true)//冒泡
- 问题:请问f1先执行还是f2先执行?
- 答案:f1先执行
- 原因:谁先监听谁先执行
6.取消冒泡
- 捕获阶段不能取消监听,但冒泡阶段可以取消监听
e.stopPropagation()
放在监听函数中,一般情况下可中断冒泡,使得浏览器不再向上走- 所有的冒泡都能被取消
7.不可阻止默认动作
- 默认动作有的可以取消有的不能取消
- 查看这个信息的方法:在浏览器中搜
MDN 关键词 event
,并在MDN
的英文版中查看 MDN
搜索scroll event
,看到Bubbles
和Cancelable
.Bubbles
的意思是该事件是否冒泡。Cancelable
的意思是是否支持开发者可以阻止默认动作,与冒泡无关.