ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Event delegation
    Web/DOMBrowser 2019. 9. 29. 01:40

    1. Overview

    Capturing and bubbling allow us to implement one of the most powerful event handling patterns called event delegation.

    The idea is that if we have a lot of elements handled in a similar way, then instead of assigning a handler to each of them – we put a single handler on their common ancestor.

    In the handler we get event.target, see where the event actually happened and handle it.

    2. Event delegation

    <table>
      <tr>
        <th colspan="3"><em>Bagua</em> Chart: Direction, Element, Color, Meaning</th>
      </tr>
      <tr>
        <td class="nw"><strong>Northwest</strong><br>Metal<br>Silver<br>Elders</td>
        <td class="n">...</td>
        <td class="ne">...</td>
      </tr>
      <tr>...2 more lines of this kind...</tr>
      <tr>...2 more lines of this kind...</tr>
    </table>

    The table has 9 cells, but there could be 99 or 9999, doesn’t matter.

    Our task is to highlight a cell <td> on click.

    Instead of assign an onclick handler to each <td> (can be many) – we’ll setup the “catch-all” handler on <table> element.

    It will use event.target to get the clicked element and highlight it.

    The code:

    let selectedTd;
    
    table.onclick = function(event) {
      let target = event.target; // where was the click?
    
      if (target.tagName != 'TD') return; // not on TD? Then we're not interested
    
      highlight(target); // highlight it
    };
    
    function highlight(td) {
      if (selectedTd) { // remove the existing highlight if any
        selectedTd.classList.remove('highlight');
      }
      selectedTd = td;
      selectedTd.classList.add('highlight'); // highlight the new td
    }

    2.1 The behavior pattern

    For instance, here the attribute data-counter adds a behavior: “increase value on click” to buttons:

    Counter: <input type="button" value="1" data-counter>
    One more counter: <input type="button" value="2" data-counter>
    
    <script>
      document.addEventListener('click', function(event) {
    
        if (event.target.dataset.counter != undefined) { // if the attribute exists...
          event.target.value++;
        }
    
      });
    </script>

    There can be as many attributes with data-counter as we want. We can add new ones to HTML at any moment. Using the event delegation we “extended” HTML, added an attribute that describes a new behavior.

    3. References

    https://javascript.info/event-delegation

    https://javascript.info/event-delegation

    https://davidwalsh.name/event-delegate

    https://medium.com/@bretdoucette/part-4-what-is-event-delegation-in-javascript-f5c8c0de2983

    https://learn.jquery.com/events/event-delegation/#targetText=Event%20delegation%20refers%20to%20the,now%20or%20in%20the%20future.

    'Web > DOMBrowser' 카테고리의 다른 글

    Browser Rendering Process  (0) 2020.02.23
    Event bubbling and capturing  (0) 2019.09.29
    Difference between event.stopPropagation and event.preventDefault  (0) 2019.09.28

    댓글

Designed by Tistory.