上一篇有提到addEventListener的寫法為addEventListener('click', function(e){}, false)
,其中false
沒有特別寫時,其預設值還是為false
,但這個寫false
跟true
到底是代表什麼呢?先讓我們來看看下例:
我們先在頁面新增一個紅色方塊,並用addEventListener監聽,當點擊紅色方塊的時候,會彈跳出Hola!!!!!
的視窗 ; 另外也使用addEventListener監聽HTML body元素(最底層元素),當body被點擊時,會彈跳出 I’m Body!
的視窗。接下來試試看,當只有點擊紅色區塊的時候會出現什麼結果:
<範例程式碼>
<body class='bodyarea'>
<div class='box'></div>
<script>
var box = document.querySelector('.box');
box.addEventListener('click', function (e) {
alert("Hola!!!!!")
}, false);
var body = document.querySelector('.bodyarea');
body.addEventListener('click', function (e) {
alert("I'm Body!")}, false);
</script>
當只點擊紅色方塊後的結果,會先顯示Hola!!!!!
彈跳視窗,按完確定後緊接著會顯示I’m Body!
的彈跳視窗,如下:
使用addEventListener監聽,會向下穿透元素,並依序顯示其相對應的動作行為,而在addEventListener('click', function(e){}, false)
中的false
會從指定的元素向外找,並依序顯示,如上範例,點擊紅方塊會先彈跳出box
的Hola!!!!!
,接著再向上層繼續找到body
,彈跳出I’m Body!
。相反的,如果是設定true
的話,則會從外向內找到指定元素作顯示,而這兩種分別的事件名稱為:
false
- 從指定的元素向外找。true
- 從外向內找到指定元素。當元素重疊時,但希望只顯示出被點擊元素的回應行為,則可使用stopPropagation()
來避免元素繼續往外找,範例如下:
<body class='bodyarea'>
<div class='box'></div>
<script>
var box = document.querySelector('.box');
box.addEventListener('click', function (e) {
e.stopPropagation(); //中止繼續向外尋找元素
alert("Hola!!!!!");
}, false);
var body = document.querySelector('.bodyarea');
body.addEventListener('click', function (e) {
alert("I'm Body!")
}, false);
</script>
顯示結果只會有Hola!!!!!
,成功中止了氣泡,沒有繼續向上層尋找:
*參考資料來源:Hex School
*