文章出處
文章列表
件冒泡和事件捕獲的demo了
<!doctype html> <html> <head> <meta charset="utf-8"> <title>無標題文檔</title> <style> .p{ width:500px; height:500px; background:#CCF; } .s{ width:300px; height:300px; background:#fff; } .min{ width:100px; height:100px; background:#063; } </style> </head> <body> <div class="p"> <div class="s"> <div class="min"></div> </div> </div> <script> window.alert = function (msg) { console.log(msg); }; var p = document.getElementsByClassName('p')[0]; var s = document.getElementsByClassName('s')[0]; p.addEventListener('click', function (e) { alert( (e.target === e.currentTarget) + ' '+ e.eventPhase) alert('父節點捕獲11'); }, true); p.addEventListener('click', function (e) { alert( (e.target === e.currentTarget) + ' '+ e.eventPhase) alert('父節點冒泡') }, false); s.addEventListener('click', function (e) { alert( (e.target === e.currentTarget) + ' '+ e.eventPhase) alert('子節點捕獲11'); }, true); s.addEventListener('click', function (e) { alert( (e.target === e.currentTarget) + ' '+ e.eventPhase) alert('子節點冒泡') }, false); /*e.target時指向當前目標,e.currentTarget是指向點擊的this*/ </script> </body> </html>
事件的eventPhase說明了事件執行所在狀態, 1為捕獲, 2為在目標上, 3為冒泡階段, 如果;
Event.CAPTURING_PHASE | 1 |
Event.AT_TARGET | 2 |
Event.BUBBLING_PHASE | 3 |
當我們點擊的是目標元素的時候, 捕獲的事件, 冒泡的事件和 正常綁定的事件都會觸發, 而且eventPhase的值為2,
當我們點擊的是目標元素內部元素時候,事件會根據捕獲,標準, 冒泡的順序執行 , 捕獲時eventPhase的值為1, 冒泡和標準時候eventPhase值為3;
某些事件只捕獲, 沒有冒泡, 比如img的onload事件, 有些事件即冒泡又捕獲,比如click事件。 雖然說捕獲平常用不到, 但是也有存在的意義吧;
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body style="padding:100px"> <div id="div0">div0</div> <div> body </div> <script> var l = function() { console.log( arguments[0] ) }; var div0 = document.getElementById("div0"); div0.addEventListener("click", function(ev) { l(ev.eventPhase); l("div0點擊事件"); }); document.body.addEventListener("click", function(ev) { l(ev.eventPhase); l("在目標上"); }); document.body.onclick = function(ev) { l(ev.eventPhase); l("在目標上"); } document.body.addEventListener("click", function(ev) { l(ev.eventPhase); l("冒泡"); }, false); document.body.addEventListener("click", function(ev) { l(ev.eventPhase); l("捕獲"); }, true); </script> </body> </html>
文章列表
全站熱搜