每个事件都有事件监听器(有时也叫事件监听器),也就是触发事件时运行的代码块。严格来说事件监听器监听事件是否发生,然后事件处理器对事件做出反应。
从外向内找监听函数,叫事件捕获
从内向外找监听函数,叫事件冒泡
<div class="grandfather">
<div class="father">
<div class="son"></div>
hi
</div>
</div>
//假如给三个div分别添加事件监听 fnYe / fnBa / fnEr
点击文字,算不算点击儿子?
点击文字,算不算点击爸爸?
点击文字,算不算点击爷爷?
答案:都算
调用监听函数顺序是什么呢?
事件捕获:fnYe > fnBa > fnEr , 也就是从外到内去调用
事件冒泡:fnEr > fnBa > fnYe , 也就是从内到外去调用
调用顺序是谁定义的?
W3C在2002年发布了标准, 文件名为DOM Level 2 Events Specification
规定浏览器同时支持两种调用顺序
首先按爷爷->爸爸->儿子顺序看有没有函数监听,先事件捕获
然后按儿子->爸爸->爷爷顺序看有没有函数监听,再事件冒泡
如何指定走捕获还是冒泡呢?
事件绑定 API
IE 5*:baba.attachEvent('onclick', fn) // 冒泡
网景:baba.addEventListener('click',fn) // 捕获
W3C:baba.addEventListener('click', fn, bool)
如果 bool 不传或为 falsy
就让 fn 走冒泡,即当浏览器在冒泡阶段发现 baba 有 fn 监听函数,就会调用 fn,并提供事件信息
如果 bool 为 true
就让 fn 走捕获,即当浏览器在捕获阶段发现 baba 有 fn 监听函数,就会调用 fn ,并提供事件信息
target与currentTarget区别
e.target - 用户操作的元素
e.currentTarget - 程序员监听的元素
<div>
<span>文字</span>
</div>
e.target就是span,用户操作的元素。e.currentTarget就是div, 程序员监听的元素。
取消冒泡
e.stopPropagation() 可中断冒泡,浏览器不再向上走
捕获不可取消,但冒泡可以