1.事件的三個階段
- 捕獲
- 目標
- 冒泡
捕獲(IE8及以下版本不支持),目標,冒泡 捕獲階段給事件截獲提供了可行性。
2.冒泡階段觸發事件
<body style="height:500px">
<div id="all">
<div>div1</div>
<div>div2</div>
</div>
<script> document.getElementsByTagName('body')[0].addEventListener('click', function(e) { alert(1); }, false); document.getElementById('all').addEventListener('click', function(e) { alert(2); }, false); </script>
點擊body區域:alert(1)
點擊all區域:alert(2) alert(1)
3.捕獲階段觸發事件
<body style="height:500px">
<div id="all">
<div>div1</div>
<div>div2</div>
</div>
<script>
//將這里的false,改成true.表明body的綁定事件發生在捕獲階段
document.getElementsByTagName('body')[0].addEventListener('click', function(e) { alert(1); }, true); document.getElementById('all').addEventListener('click', function(e) { alert(2); }, false); </script>
4.看圖說話
當點擊目標元素的時候都是這三步,唯一的區別是你控制事件觸發在哪個階段。
所以我們可以看到要想截獲事件必須要在目標元素事件發生之前,也就是捕獲階段。
5.冒泡與捕獲的相對性
看了什么捕獲,冒泡的時機問題。肯定有熊孩子會這么寫:
寫個例子:
<!DOCTYPE html>
<html>
<head>
<title>demo</title>
</head>
<body>
<a id="A">元素A</a>
</body>
<script type="text/javascript">
var domA = document.getElementById('A'); //冒泡
domA.addEventListener('click',function () { alert('A') },false) //捕獲
domA.addEventListener('click',function () { alert('B') },true) </script>
</html>
在同一個元素上綁定事件,看看哪個先彈出來(好想法!!!!)。
結果依舊是:A,B。
捕獲與冒泡不是相對與該元素的,而是相對於父級元素或子級元素的。
這里可能又會冒出這樣的想法:那么捕獲與冒泡是相對是其他級的元素,那會冒泡到相鄰兄弟元素么?
答案是不會。
我在這里測試過:冒泡,setinterval,背景圖的div綁定事件,匿名函數問題