JS學習之事件流

本文是原創文章,如需轉載,請註明文章出處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,也就是目標階段。

相關文章
相關標籤/搜索