javascript 冒泡是一種事件傳遞機制,它的原理是事件先在內部元素進行處理,然后再傳遞到外部元素。當一個事件被觸發時,該事件會從觸發它的元素開始,逐層向上冒泡,直到達到文檔根部或被停止(event.stopPropagation())。
例如,我們有一個HTML結構如下:
<div id="outer"> <div id="inner"> <p id="paragraph">Hello, world!</p> </div> </div>
我們給paragraph元素綁定一個點擊事件,并在點擊事件回調中打印當前元素的ID:
<script> var paragraph = document.getElementById('paragraph'); paragraph.addEventListener('click', function(event) { console.log('Clicked paragraph:', event.target.id); }); </script>
當我們點擊paragraph元素時,事件會首先在paragraph元素內部進行處理,然后向父元素inner進行傳遞,最后傳遞到outer元素。我們可以在控制臺中看到以下輸出:
Clicked paragraph: paragraph Clicked paragraph: inner Clicked paragraph: outer
這就是javascript冒泡的基本原理。
通過冒泡機制,我們可以方便的監聽一個元素的所有祖先元素上發生的某個事件。例如,我們可以在outer元素上監聽paragraph元素發生點擊事件,并在回調中打印事件的target元素ID:
<script> var outer = document.getElementById('outer'); outer.addEventListener('click', function(event) { console.log('Clicked element:', event.target.id); }); </script>
當我們點擊paragraph元素時,事件會依次在paragraph、inner和outer三個元素上被觸發,并在回調中打印輸出以下內容:
Clicked element: paragraph Clicked element: inner Clicked element: outer
我們可以看到,通過冒泡機制,我們成功的監聽到了paragraph元素在outer元素上的點擊事件。
在冒泡傳遞過程中,我們可以通過event.stopPropagation()方法來阻止事件繼續向上冒泡,即停止事件傳遞。例如,我們可以為inner元素添加一個點擊事件,并在回調中調用event.stopPropagation()方法:
<script> var inner = document.getElementById('inner'); inner.addEventListener('click', function(event) { console.log('Clicked inner:', event.target.id); event.stopPropagation(); }); </script>
當我們點擊paragraph元素時,事件會依次在paragraph和inner兩個元素上被觸發,并在回調中打印輸出以下內容:
Clicked paragraph: paragraph Clicked inner: inner
我們可以看到,通過調用event.stopPropagation()方法,我們成功的停止了事件繼續冒泡到外部元素。
javascript冒泡機制的靈活運用可以幫助我們更好的實現一些交互效果,例如將一個下拉列表封裝在一個div元素內,并在div元素上監聽點擊事件,在事件回調中判斷點擊的是否是下拉列表,如果是,則展開下拉列表,否則收起下拉列表。代碼實現如下:
<div id="dropdown"> <div id="menu"> <button id="button">Options</button> <ul id="list" style="display:none"> <li>Option 1</li> <li>Option 2</li> <li>Option 3</li> </ul> </div> </div> <script> var dropdown = document.getElementById('dropdown'); dropdown.addEventListener('click', function(event) { if (event.target.id === 'button') { var list = document.getElementById('list'); list.style.display = 'block'; } else { var list = document.getElementById('list'); list.style.display = 'none'; } }); </script>
通過使用javascript冒泡機制,我們可以簡單的實現一個下拉菜單。