DOM 事件机制

189 阅读2分钟

每个事件都有事件监听器(有时也叫事件监听器),也就是触发事件时运行的代码块。严格来说事件监听器监听事件是否发生,然后事件处理器对事件做出反应。
从外向内找监听函数,叫事件捕获
从内向外找监听函数,叫事件冒泡

<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 规定浏览器同时支持两种调用顺序
首先按爷爷->爸爸->儿子顺序看有没有函数监听,先事件捕获
然后按儿子->爸爸->爷爷顺序看有没有函数监听,再事件冒泡

Untitled.png

如何指定走捕获还是冒泡呢?

事件绑定 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() 可中断冒泡,浏览器不再向上走
捕获不可取消,但冒泡可以