搜尋
首頁web前端js教程事件流:冒泡和捕獲

事件流:冒泡和捕獲

Jan 09, 2025 am 06:42 AM

這是前端面試問題系列的第 7 篇文章。如果您希望提高準備程度或保持最新狀態,請考慮加入前端訓練營? .


事件冒泡與捕獲,都是DOM(文件物件模型)中的傳播機制。這兩種機制是相反的。

事件冒泡

在事件冒泡中,事件在觸發目標元素(event.target)上的處理程序後向上傳播(冒泡)到文件的根元素。在其過程中,它會觸發父元素上的所有事件處理程序。

/*
<div>



<p>In the snippet above, when you click the button you'll see the following output in console:<br>
</p>

<pre class="brush:php;toolbar:false">"Button handler"
"Container handler"

首先呼叫按鈕上的處理程序,並將 event.target 屬性設為按鈕,因為它啟動了事件。事件在到達根元素的過程中,會呼叫其父元素的事件處理程序。

幾乎所有事件都會冒泡,但也有一些例外,例如焦點事件不會冒泡。

您可以透過呼叫事件的 stopPropagation() 方法來停止冒泡。如果上面程式碼片段中按鈕的事件處理程序停止傳播,則不會呼叫容器的事件處理程序。

btn.addEventListener('click', function(event) {
  console.log('Button handler!');

  // ancestor elements won't receive the event
  event.stopPropagation();
});

您可以透過存取 target.event 屬性來存取發起事件的元素。此外,可以使用 event.currentTarget.
存取正在執行處理程序的元素

container.addEventListener('click', function(event) {
  console.log('Container handler!'); // 'Container handler!'
  console.log(event.target); // btn
  console.log(event.currentTarget); // container
  console.log(this); // container
});

想要了解更多關於 this 關鍵字的資訊嗎?我寫了一篇關於它的文章。

事件捕捉

到目前為止我們只看到了一半的圖片。當單擊上面程式碼片段中的按鈕時,它不是接收該事件的第一個元素。 ?

事件流由三個階段組成:

  1. 捕獲階段:事件從根元素流向目標元素。
  2. 目標階段:在目標元素上接收事件。
  3. 冒泡階段:事件開始傳播回根元素。

Event Flow: Bubbling & Capturing

預設情況下,所有事件處理程序僅在目標階段和冒泡階段呼叫。若要在擷取階段呼叫事件處理程序,請傳遞 true 作為第三個參數。

el.addEventListener('click', () => {}, true);
// or to be more explicit
el.addEventListener('click', () => {}, { capture: true });

如果您在捕獲階段使用處理程序,則在冒泡階段不會呼叫它。

與冒泡類似,當在捕獲階段調用 event.stopPropagation() 時,它不會讓事件進一步流動,即在本例中沿著 DOM 向下流動。

在我們之前討論的程式碼片段中,如果容器在捕獲階段停止傳播,則永遠不會呼叫按鈕的處理程序。

/*
<div>



<p>這就是為什麼你應該總是有充分的理由使用 event.stopPropagation()。它可能會導致難以在複雜或深度嵌套的 DOM 樹中調試的意外問題。 </p>
<p>與冒泡相比,事件捕獲很少使用。冒泡有很多用例,例如「事件委託」——一種重要的效能模式。 </p>

<p>這篇文章為下一個主題-事件委託奠定了基礎。確保你理解它。有疑問嗎?將它們留在評論中。 ✌️</p>


<hr>

<h2>
  
  
  概括
</h2>

<ol>
<li>事件流由三個階段組成:捕獲、目標和冒泡階段。 </li>
<li>在捕獲階段,事件從根元素向下流向目標(event.target)元素。 </li>
<li>在冒泡階段,事件從目標元素流向根元素。 </li>
<li>預設情況下,僅在目標階段和冒泡階段呼叫所有事件處理程序。 </li>
<li>透過在 addEventListener 函數中傳遞第三個參數,您可以在擷取階段設定處理程序。 </li>
<li>在事件流中的任何一點,呼叫 event.stopPropagation() 將阻止事件進一步流動。 </li>
</ol>


<hr>

<p>喜歡你剛剛讀到的內容嗎? ?考慮加入前端訓練營的候補名單。 </p>

<p>留下一些反應“?”和評論,因此這篇文章可以幫助像您這樣的其他開發人員。 ? </p>


          </div>

            
  

            
        

以上是事件流:冒泡和捕獲的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python vs. JavaScript:開發人員的比較分析Python vs. JavaScript:開發人員的比較分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

Python vs. JavaScript:選擇合適的工具Python vs. JavaScript:選擇合適的工具May 08, 2025 am 12:10 AM

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript:了解每個的優勢Python和JavaScript:了解每個的優勢May 06, 2025 am 12:15 AM

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

Python vs. JavaScript:您應該學到哪種語言?Python vs. JavaScript:您應該學到哪種語言?May 03, 2025 am 12:10 AM

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境