舉例
<div id="div1">
<div id="div2">
<div id="div3">
<div id="div4">
</div>
</div>
</div>
</div>
如果在 d3 上點(diǎn)擊鼠標(biāo),事件流是這樣的:
捕獲階段 在 div1 處檢測是否有 useCapture 為 true 的事件處理程序,若有,則執(zhí)行該程序,然后再同樣地處理 div2。
目標(biāo)階段 在 div3 處,發(fā)現(xiàn) div3 就是鼠標(biāo)點(diǎn)擊的節(jié)點(diǎn),所以這里為目標(biāo)階段,若有事件處理程序,則執(zhí)行該程序,這里不論 useCapture 為 true 還是 false。
冒泡階段 在 div2 處檢測是否有 useCapture 為 false 的事件處理程序,若有,則執(zhí)行該程序,然后再同樣地處理 div1。
addEventListener 有三個參數(shù):第一個參數(shù)表示事件名稱(不含 on,如 "click");第二個參數(shù)表示要接收事件處理的函數(shù);第三個參數(shù)為 useCapture,本文就講解它。
<div id="outDiv">
<div id="middleDiv">
<div id="inDiv">請在此點(diǎn)擊鼠標(biāo)。</div>
</div>
</div>
<div id="info"></div>
var outDiv = document.getElementById("outDiv");
var middleDiv = document.getElementById("middleDiv");
var inDiv = document.getElementById("inDiv");
var info = document.getElementById("info");
outDiv.addEventListener("click", function () { info.innerHTML += "outDiv" + "<br>"; }, false);
middleDiv.addEventListener("click", function () { info.innerHTML += "middleDiv" + "<br>"; }, false);
inDiv.addEventListener("click", function () { info.innerHTML += "inDiv" + "<br>"; }, false);
上述是我們測試的代碼,根據(jù) info 的顯示來確定觸發(fā)的順序,有三個 addEventListener,而 useCapture 可選值為 true 和 false,所以 2*2*2,可以得出 8 段不同的程序。
•全為 false 時,觸發(fā)順序為:inDiv、middleDiv、outDiv;
•全為 true 時,觸發(fā)順序為:outDiv、middleDiv、inDiv;
•outDiv 為 true,其他為 false 時,觸發(fā)順序為:outDiv、inDiv、middleDiv;
•middleDiv 為 true,其他為 false 時,觸發(fā)順序為:middleDiv、inDiv、outDiv;
•……
最終得出如下結(jié)論:
•true 的觸發(fā)順序總是在 false 之前;
•如果多個均為 true,則外層的觸發(fā)先于內(nèi)層;
•如果多個均為 false,則內(nèi)層的觸發(fā)先于外層。
新聞熱點(diǎn)
疑難解答