-
Event delegationWeb/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
'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