js事件event處理機制_js事件event處理詳細(xì)講解

JavaScript事件處理的核心在于理解事件冒泡事件捕獲和事件委托。1. 事件冒泡是從目標(biāo)元素逐級向上傳播到頂層文檔,例如點擊內(nèi)層div時,外層div和document的事件也會被依次觸發(fā);2. 事件捕獲則是從頂層文檔開始向下傳播到目標(biāo)元素,通過將addEventlistener的第三個參數(shù)設(shè)為true啟用;3. 事件委托是利用冒泡機制,將事件監(jiān)聽器綁定到父元素上,從而提高性能并減少監(jiān)聽器數(shù)量;4. 可以使用event.stoppropagation()阻止事件傳播,event.stopimmediatepropagation()阻止同一元素其他監(jiān)聽器觸發(fā),event.preventdefault()阻止事件默認(rèn)行為;5. event對象在事件處理函數(shù)中提供了關(guān)于事件的詳細(xì)信息,如事件類型、目標(biāo)元素、鼠標(biāo)位置等,便于開發(fā)者進(jìn)行精確控制。

js事件event處理機制_js事件event處理詳細(xì)講解

JavaScript事件處理的核心在于,當(dāng)用戶與網(wǎng)頁交互時,瀏覽器會觸發(fā)一系列事件,而我們作為開發(fā)者,需要編寫代碼來響應(yīng)這些事件。理解事件冒泡、事件捕獲和事件委托,是掌握事件處理機制的關(guān)鍵。

js事件event處理機制_js事件event處理詳細(xì)講解

事件處理機制的詳細(xì)講解

js事件event處理機制_js事件event處理詳細(xì)講解

事件冒泡:從目標(biāo)元素到頂層文檔

事件冒泡,顧名思義,就像氣泡從水底冒到水面一樣。當(dāng)一個html元素上的事件被觸發(fā)后,這個事件會從觸發(fā)事件的元素(也就是目標(biāo)元素)開始,逐級向上傳播到其父元素,直到document對象。這意味著,如果你在多個嵌套的元素上都綁定了同一個事件,那么最內(nèi)層元素的事件被觸發(fā)后,所有外層元素的相同事件也會被依次觸發(fā)。

js事件event處理機制_js事件event處理詳細(xì)講解

例如,你有一個嵌套的

結(jié)構(gòu):

<div id="outer">   <div id="inner">     Click Me!   </div> </div>  <script>   document.getElementById('inner').addEventListener('click', function(event) {     console.log('Inner div clicked');   });    document.getElementById('outer').addEventListener('click', function(event) {     console.log('Outer div clicked');   });    document.addEventListener('click', function(event) {     console.log('Document clicked');   }); </script>

當(dāng)你點擊 “Click Me!” 時,控制臺會依次輸出 “Inner div clicked”、”Outer div clicked” 和 “Document clicked”。這就是事件冒泡的效果。

事件捕獲:從頂層文檔到目標(biāo)元素

與事件冒泡相反,事件捕獲是從頂層文檔開始,逐級向下傳播到目標(biāo)元素。也就是說,事件會先被最外層的元素捕獲,然后依次傳遞到內(nèi)層元素,直到到達(dá)目標(biāo)元素。

要使用事件捕獲,需要在addEventListener()方法的第三個參數(shù)設(shè)置為true:

<div id="outer">   <div id="inner">     Click Me!   </div> </div>  <script>   document.getElementById('inner').addEventListener('click', function(event) {     console.log('Inner div clicked');   });    document.getElementById('outer').addEventListener('click', function(event) {     console.log('Outer div clicked');   }, true); // 啟用捕獲    document.addEventListener('click', function(event) {     console.log('Document clicked');   }, true); // 啟用捕獲 </script>

在這種情況下,點擊 “Click Me!” 時,控制臺會依次輸出 “Document clicked”、”Outer div clicked” 和 “Inner div clicked”。注意,默認(rèn)情況下,addEventListener()方法的第三個參數(shù)是false,也就是使用事件冒泡。

事件委托:利用冒泡提高性能

事件委托是一種利用事件冒泡機制來提高性能的技術(shù)。它的核心思想是,將事件監(jiān)聽器綁定到父元素上,而不是綁定到每個子元素上。當(dāng)子元素上的事件被觸發(fā)時,由于事件冒泡,父元素上的監(jiān)聽器也會被觸發(fā)。然后,父元素可以根據(jù)事件的目標(biāo)元素來判斷具體是哪個子元素觸發(fā)了事件,并執(zhí)行相應(yīng)的操作。

例如,你有一個包含多個

  • 元素的
      列表:

      <ul id="myList">   <li>Item 1</li>   <li>Item 2</li>   <li>Item 3</li> </ul>  <script>   document.getElementById('myList').addEventListener('click', function(event) {     if (event.target && event.target.nodeName == 'LI') {       console.log('List item clicked:', event.target.textContent);     }   }); </script>

      在這個例子中,我們將點擊事件監(jiān)聽器綁定到了

        元素上。當(dāng)任何一個

      • 元素被點擊時,
          元素上的監(jiān)聽器都會被觸發(fā)。然后,我們通過event.target屬性來獲取觸發(fā)事件的元素,并判斷它是否是一個

        • 元素。如果是,我們就執(zhí)行相應(yīng)的操作。

          事件委托的優(yōu)點在于,它可以減少事件監(jiān)聽器的數(shù)量,從而提高性能。特別是當(dāng)你有大量的子元素需要綁定事件時,事件委托的優(yōu)勢就更加明顯。 想象一下,如果不用事件委托,每次新增一個

        • ,你都要重新綁定事件,簡直是噩夢。

          如何阻止事件冒泡和捕獲?

          有時候,我們可能需要阻止事件冒泡或捕獲,以防止不必要的事件觸發(fā)。可以使用event.stopPropagation()方法來阻止事件繼續(xù)傳播。

          <div id="outer">   <div id="inner">     Click Me!   </div> </div>  <script>   document.getElementById('inner').addEventListener('click', function(event) {     console.log('Inner div clicked');     event.stopPropagation(); // 阻止冒泡   });    document.getElementById('outer').addEventListener('click', function(event) {     console.log('Outer div clicked');   }); </script>

          在這個例子中,點擊 “Click Me!” 時,只會輸出 “Inner div clicked”,而不會輸出 “Outer div clicked”。因為我們在inner元素的點擊事件處理函數(shù)中調(diào)用了event.stopPropagation()方法,阻止了事件繼續(xù)向上冒泡。

          另外,event.stopImmediatePropagation()方法可以阻止同一個元素上的其他事件監(jiān)聽器被觸發(fā)。

          preventDefault()的作用是什么?

          event.preventDefault()方法用于阻止事件的默認(rèn)行為。例如,點擊一個鏈接時,瀏覽器會默認(rèn)跳轉(zhuǎn)到鏈接的URL。如果你調(diào)用了event.preventDefault()方法,瀏覽器就不會跳轉(zhuǎn)。

          <a href="https://www.example.com" id="myLink">Click Me!</a>  <script>   document.getElementById('myLink').addEventListener('click', function(event) {     event.preventDefault(); // 阻止默認(rèn)行為     console.log('Link clicked, but no navigation');   }); </script>

          在這個例子中,點擊 “Click Me!” 時,瀏覽器不會跳轉(zhuǎn)到https://www.example.com,而是會在控制臺輸出 “Link clicked, but no navigation”。preventDefault()在表單提交、右鍵菜單等場景下非常有用。

          為什么事件處理函數(shù)中要傳入event對象?

          事件處理函數(shù)中的event對象包含了關(guān)于事件的各種信息,例如事件類型、目標(biāo)元素、鼠標(biāo)位置、鍵盤按鍵等等。通過event對象,我們可以獲取這些信息,并根據(jù)需要進(jìn)行處理。

          例如,我們可以使用event.type屬性來獲取事件類型:

          <button id="myButton">Click Me!</button>  <script>   document.getElementById('myButton').addEventListener('click', function(event) {     console.log('Event type:', event.type); // 輸出 "Event type: click"   }); </script>

          或者,我們可以使用event.clientX和event.clientY屬性來獲取鼠標(biāo)點擊位置的坐標(biāo):

          <div id="myDiv" style="width: 200px; height: 100px; border: 1px solid black;"></div>  <script>   document.getElementById('myDiv').addEventListener('click', function(event) {     console.log('Mouse position:', event.clientX, event.clientY);   }); </script>

          總之,event對象是事件處理函數(shù)中非常重要的一個參數(shù),它提供了豐富的信息,讓我們能夠更好地處理事件。

  • ? 版權(quán)聲明
    THE END
    喜歡就支持一下吧
    點贊13 分享