CodeGym /Kurs Javy /Frontend SELF PL /Event Bubbling i Capturing

Event Bubbling i Capturing

Frontend SELF PL
Poziom 42 , Lekcja 1
Dostępny

7.1 Event Bubbling (Wynurzanie zdarzeń)

W JavaScript zdarzenia, które występują w jednym elemencie, mogą rozchodzić się w drzewie DOM. Proces ten nazywa się propagacją zdarzeń i obejmuje dwa główne mechanizmy: wynurzanie zdarzeń (event bubbling) i przechwytywanie zdarzeń (event capturing).

Mechanizmy propagacji zdarzeń:

  1. Event Bubbling (Wynurzanie zdarzeń).
  2. Event Capturing (Przechwytywanie zdarzeń).

Wynurzanie zdarzeń to proces, w którym zdarzenie występujące w elemencie potomnym rozprzestrzenia się w górę łańcucha rodziców do elementu korzeniowego (zwykle document).

Wyjaśnienie:

  • Kiedy przycisk child jest kliknięty, najpierw uruchamia się handler zdarzeń na elemencie child (Child clicked)
  • Następnie zdarzenie wynurza się do elementu parent i uruchamia jego handler (Parent clicked)

Przykład:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Event Bubbling Example</title>
        </head>
        <body>
          <div id="parent">
            <button id="child">Click Me</button>
          </div>
          <script>
            const parent = document.getElementById('parent');
            const child = document.getElementById('child');

            parent.addEventListener('click', function(event) {
              console.log('Parent clicked');
            });

            child.addEventListener('click', function(event) {
              console.log('Child clicked');
            });
          </script>
        </body>
      </html>
    
  

7.2 Event Capturing (Przechwytywanie zdarzeń)

Przechwytywanie zdarzeń to proces, w którym zdarzenie najpierw rozprzestrzenia się od elementu korzeniowego w dół łańcucha rodziców do docelowego elementu, na którym wystąpiło zdarzenie.

Aby użyć przechwytywania zdarzeń, należy ustawić parametr capture na true przy dodawaniu handlera zdarzeń.

Wyjaśnienie:

  • Kiedy przycisk child jest kliknięty, najpierw uruchamia się handler zdarzeń na elemencie parent (Parent clicked) dzięki ustawieniu parametru capture na true
  • Następnie zdarzenie dociera do docelowego elementu child i uruchamia jego handler (Child clicked)

Przykład:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Event Capturing Example</title>
        </head>
        <body>
          <div id="parent">
            <button id="child">Click Me</button>
          </div>
          <script>
            const parent = document.getElementById('parent');
            const child = document.getElementById('child');

            parent.addEventListener('click', function(event) {
              console.log('Parent clicked');
            }, true);

            child.addEventListener('click', function(event) {
              console.log('Child clicked');
            });
          </script>
        </body>
      </html>
    
  

7.3 Trójfazowy model propagacji zdarzeń

W procesie obsługi zdarzenia w DOM uczestniczą trzy fazy:

1. Capturing Phase (Faza przechwytywania). Zdarzenie rozprzestrzenia się od elementu korzeniowego (zwykle document) w dół łańcucha rodziców do docelowego elementu.

2. Target Phase (Faza celu). Zdarzenie dociera do docelowego elementu, na którym wystąpiło zdarzenie.

3. Bubbling Phase (Faza wynurzania). Zdarzenie rozprzestrzenia się od docelowego elementu w górę łańcucha rodziców do elementu korzeniowego.

Kontrola propagacji zdarzeń

Istnieją metody do zarządzania propagacją zdarzeń:

  1. stopPropagation(). Zatrzymuje dalsze rozprzestrzenianie się zdarzenia zarówno podczas wynurzania, jak i przechwytywania.
  2. stopImmediatePropagation(). Zatrzymuje dalsze rozprzestrzenianie się zdarzenia i zapobiega wykonywaniu innych handlerów zdarzeń na bieżącym elemencie.
  3. preventDefault(). Anuluje domyślne działanie związane ze zdarzeniem (np. wysłanie formularza po kliknięciu przycisku).

7.4 Przykład użycia stopPropagation

Wyjaśnienie:

  • Kiedy przycisk child jest kliknięty, uruchamia się handler zdarzeń na elemencie child (Child clicked)
  • Wynurzanie zdarzenia zostaje zatrzymane za pomocą event.stopPropagation(), a handler zdarzeń na elemencie parent się nie uruchamia
HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Stop Propagation Example</title>
        </head>
        <body>
          <div id="parent">
            <button id="child">Click Me</button>
          </div>
          <script>
            const parent = document.getElementById('parent');
            const child = document.getElementById('child');

            parent.addEventListener('click', function(event) {
              console.log('Parent clicked');
            });

            child.addEventListener('click', function(event) {
              console.log('Child clicked');
              event.stopPropagation(); // Zatrzymuje wynurzanie zdarzenia
            });
          </script>
        </body>
      </html>
    
  
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION