JavaScript是一門很強大的語言,在開發網絡應用程序的過程中,事件機制扮演著至關重要的角色。當頁面中的元素發生交互行為,如點擊、鼠標移動時,就會觸發相應的事件。事實上,JavaScript中的事件是按照一定的規則進行冒泡的。本文就來探討一下JavaScript事件的冒泡行為。
冒泡行為指的是,事件會從最具體的元素(文檔中的嵌套層次最深的那個節點)開始,然后逐級向上層元素傳遞,直至最不具體的元素(document對象)所在位置。如下面這個例子所示:
//HTML頁面元素結構 <div id="grandparent"> <div id="parent"> <div id="child"> <button>點擊</button> </div> </div> </div> //JavaScript代碼 const grandparent = document.querySelector('#grandparent'); const parent = document.querySelector('#parent'); const child = document.querySelector('#child'); const button = document.querySelector('button'); function logEvent(event) { console.log(event.currentTarget.id); } grandparent.addEventListener('click', logEvent, false); parent.addEventListener('click', logEvent, false); child.addEventListener('click', logEvent, false); button.addEventListener('click', logEvent, false);
當用戶點擊按鈕時,會按照以下順序依次輸出元素的id:
1. child 2. parent 3. grandparent
可以看出,事件首先被child元素捕獲,然后向上冒泡至parent元素,最后再傳遞到grandparent元素。
需要注意的是,我們在后面添加的button元素,其實并沒有被捕獲到。這是因為我們設置了冒泡的第三個參數為false,表示事件不會向上冒泡到更高層級的元素,因此button元素的事件只會在自身調用。
除了使用addEventListener()方法來綁定事件之外,我們還可以通過onxxxx屬性直接綁定事件,例如:
<button onclick="logEvent(event)">點擊</button> function logEvent(event) { console.log(event.currentTarget.id); }
然而,這種方式比不上addEventListener()方法更為簡單和靈活,也不利于代碼的維護。
冒泡行為還可以被cancelBubble屬性所阻止。例如:
const button = document.querySelector('button'); function logEvent(event) { console.log(event.currentTarget.id); event.stopPropagation(); } button.addEventListener('click', logEvent, false);
停用冒泡后,按鈕被點擊時只會輸出自己的id,不再被其他元素所攔截。
總之,通過了解JavaScript事件的冒泡行為,我們可以更好地把控頁面相應的邏輯,使得用戶交互體驗更為順暢。
上一篇css文字上下居中屬性
下一篇div{區域動畫}