事件冒泡和捕捉是兩種機制,主要描述當在一個元素上有兩個相同類型的事件處理器被激活會發生什麼。
當一個事件發生在具備父元素的元素上:html
在捕獲階段:瀏覽器
<html>
,是否在捕獲階段中註冊了一個onclick
事件處理程序,若是是,則運行它。<html>
中單擊元素的下一個祖先元素,並執行相同的操做,而後是單擊元素再下一個祖先元素,依此類推,直到到達實際點擊的元素。在冒泡階段,偏偏相反:bash
onclick
事件處理程序,若是是,則運行它<html>
元素。當事件捕獲和事件冒泡一塊兒存在的狀況,事件又是如何觸發呢。
這裏記被點擊的DOM節點爲target節點
app
W3C給瀏覽器提供了一個函數 - addEventListener
函數
baba.attachEvent('onclick',fn)
//冒泡 baba.addEventListener('click',fn)
//捕獲 baba.addEventListener('click',fn,bool)
bool
不傳或爲falsy
fn
走冒泡,即當前瀏覽器在冒泡階段發現baba
有fn
監聽函數,就會調用fn
,並提供事件信息bool
爲true
fn
走捕獲,即當瀏覽器在捕獲階段發現baba
有fn
監聽函數,就會調用fn
,並提供事件信息冒泡還容許咱們利用事件委託——這個概念依賴於這樣一個事實,若是你想要在大量子元素中單擊任何一個均可以運行一段代碼,能夠將事件監聽器設置在其父節點上,並讓子節點上發生的事件冒泡到父節點上,而不是每一個子節點單獨設置事件監聽器。ui
你要給多個按鈕添加點擊事件spa
<div id="div1">
<button>click 1</button>
<button>click 2</button>
<button>click 3</button>
<button>click 4</button>
<button>click 5</button>
<button>click 6</button>
<button>click 7</button>
<button>click 8</button>
<button>click 9</button>
</div>
複製代碼
監聽這些按鈕的祖先,等冒泡的時候判斷target
是否是這寫按鈕中的一個代理
div.addEventListener('click',(e)=>{
const t = e.target
if(t.tagName.toLowerCase() === 'button'){
console.log('button 被點擊了')
}
})
複製代碼
你要監聽目前不存在的元素的點擊事件code
<div id="div1">
</div>
複製代碼
監聽祖先元素,等點擊的時候看看是否是我想要監聽的元素便可cdn
setTimeout(()=>{
const button = document.creatElement('button')
button.textContent = 'click 1'
div1.appendChild(button)
},1000)
div1.addEventListener('click',(e)=>{
const t =e.target
if(t.tagName.toLowerCase() === 'button'){
console.log('button 被 click')
}
})
複製代碼
function on(eventType,element,selector, fn){
if(!(element instanceof Element)){
element = document.querySelector(element)
}
element.addEventListener(evenType,(e)=>{
const t = e.targer
if(t.matches(selector)){
fn(e)
}
})
}
複製代碼