通俗易懂地理清js事件流中的捕獲階段,目標階段和冒泡階段的具體運行順序

衆所周知,事件流分爲三個階段冒泡分爲捕獲階段,目標階段和冒泡階段,

在這裏插入圖片描述
這三個階段到底是如何運行的呢?如果給同一個事件綁定上冒泡和捕獲的事件到底會怎樣觸發呢?

下面我用dom2級事件函數來變換捕獲和冒泡,用eventPhase來判斷事件的是捕獲,還是目標階段,還是捕獲,

document.addEventListener(事件,function ,true or false); true代表捕獲,false代表冒泡事件

目標對象.eventPhase如果顯示1代表捕獲階段,2代表目標階段3是冒泡階段

基於上述代碼我寫出瞭如下的測試代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button id="btn" onclick="testt()">點我啊</button>


<script>
function testt(){
  console.log("事件零級處理程序");
}
  document.getElementById('btn').addEventListener('click',function (e) {
    console.log('2級事件處理程序ture');
    console.log(e.eventPhase);
  },true)
  document.body.addEventListener('click',function (e) {
    console.log('2級事件處理程序turebody');
    console.log(e.eventPhase);
  },true);
  document.documentElement.addEventListener('click',function (e) {
    console.log('2級事件處理程序turedocumentElement');
    console.log(e.eventPhase);
  },true);
  document.addEventListener('click',function (e) {
    console.log('2級事件處理程序turedocument');
    console.log(e.eventPhase);
  },true);
  window.addEventListener('click',function (e) {
    console.log('2級事件處理程序turewindow');
    console.log(e.eventPhase);
  },true);
  document.getElementById('btn').onclick=function (e) {
    console.log('0級事件處理程序');
    console.log(e.eventPhase);}
  document.getElementById('btn').addEventListener('click',function (e) {
    console.log('2級事件處理程序false');
    console.log(e.eventPhase);
  },false)
  document.body.addEventListener('click',function (e) {
    console.log('2級事件處理程序falsebody');
    console.log(e.eventPhase);
  },false);
  document.documentElement.addEventListener('click',function (e) {
    console.log('2級事件處理程序falsedocumentElement');
    console.log(e.eventPhase);
  },false);
  document.addEventListener('click',function (e) {
    console.log('2級事件處理程序falsedocument');
    console.log(e.eventPhase);
  },false);
  window.addEventListener('click',function (e) {
    console.log('2級事件處理程序falsewindow');
    console.log(e.eventPhase);
  },false);

</script>

</body>
</html>

在這裏插入圖片描述
從上面可以明確地看出噹噹鼠標單擊時,事件最先從window的捕獲階段開始再到目標階段再到冒泡階段,這也就清楚地解釋了,爲什麼有的時候在打出

`document.getElementById('btn').addEventListener('click',function (e) {
    console.log('2級事件處理程序ture');
    console.log(e.eventPhase);
  },true)

類似如上的代碼時eventPhase會返回2而不返回1的問題,因爲事件已經由window這一最不具體的對象捕獲到button這個最具體的對象了,已經是目標階段了所以就返回了2,無視了true的設定,false也同理,但是在同一階段內true還是比false要靠前的。
從結果可以看出零級事件處理程序在目標階段的優先級比2級事件處理程序要高,因爲html事件處理程序會被零級事件處理程序覆蓋,所以我又測試了一下,html事件處理程序的優先級也在2級事件處理程序之前。
所以事件的觸發是由捕獲從不具體到具體,再有具體到不具體分爲三個階段分別是捕獲,目標,冒泡階段

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章