本文是原創文章,如需轉載,請註明文章出處javascript
JS和AS師出同源,因此事件流的3個階段也跟AS同樣,分別是捕獲階段,目標階段,冒泡階段。html
下面寫了個例子能夠清晰的看出事件流的順序:java
eventTest.htmlspa
<!doctype html> <html> <head> <meta charset="utf-8"> <script type="text/javascript" src="eventTest.js"></script> </head> <body> <div id="div" style="position:relative;width:100%;height:200px;background: #00ff00"> <button id="btn" style="position:absolute;display:block;left:50%;top:50%;margin-left:-26px;margin-top:-10px">button</button> </div> </body> </html>
eventTest.jscode
window.onload = function() { init(); } function init(){ var div = document.getElementById("div"); div.addEventListener("click", onDivCaptureHandler, true); div.addEventListener("click", onDivBubbleHandler, false); var com = document.getElementById("btn"); com.addEventListener("click", onBtnCaptureHandler, true); com.addEventListener("click", onBtnBubbleHandler, false); } function onDivCaptureHandler(event){ console.log("div capture----eventPhase:" + event.eventPhase); } function onDivBubbleHandler(event){ console.log("div Bubble-----eventPhase:" + event.eventPhase); } function onBtnCaptureHandler(event){ console.log("btn capture-----eventPhase:" + event.eventPhase); } function onBtnBubbleHandler(event){ console.log("btn bubble-----eventPhase:" + event.eventPhase); }
這個例子很簡單,先添加一個綠色的div,其中有個居中的按鈕,JS代碼中分別給div和按鈕添加點擊事件的監聽器,須要注意的是,addEventListener的第三個參數,爲true時這個事件只在捕獲階段觸發。htm
如下是結果:對象
點擊按鈕以後,控制檯輸出:blog
div capture----eventPhase:1
btn capture-----eventPhase:2
btn bubble-----eventPhase:2
div Bubble-----eventPhase:3事件
由此能夠清晰的看出,捕獲階段是從最上層的元素逐層向下直到最具體的點擊對象,而冒泡階段是從最具體的點擊對象逐層向上直到最上層。ip
另外,須要注意的是,addEventListener的第三個參數不管是true仍是false,當具體對象的監聽器觸發時,事件階段都是2,也就是目標階段。