Saudações. Apresento a sua atenção a tradução do artigo "Uma explicação simples da delegação de eventos em JavaScript" publicado em 14 de julho de 2020 por Dmitri Pavlutin

Neste artigo, Dmitry Pavlutin explica em que se baseia um dos padrƵes bƔsicos de trabalho com eventos DOM.
1. Por que delegar eventos?
Vamos escrever um script que, ao clicar em um botão HTML, enviarÔ uma mensagem para o console.
, JavaScript addEventListener() .
<button id="buttonId">Click me</button>
<script>
document.getElementById('buttonId')
.addEventListener('click', () => console.log('Clicked!'));
</script>
. , .
, ? :
<div id="buttons">
<button class="buttonClass">Click me</button>
<button class="buttonClass">Click me</button>
<!-- ... -->
<button class="buttonClass">Click me</button>
</div>
<script>
const buttons = document.getElementsByClassName('buttonClass');
for (const button of buttons) {
button.addEventListener('click', () => console.log('Clicked!'));
}
</script>
, , CodeSandbox
, for (const button of buttons) , . , , .
?
, " ", .
" ". , , .
2.
HTML-:
<html>
<body>
<div id="buttons">
<button class="buttonClass">Click me</button>
</div>
</body>
</html>
click? , . , , ( document window).
3 :
- / (capturing phase) ā
window,document, DOM- , - (target phase) ā ,
- (bubble phase) ā , , ,
documentwindow

captureOrOptions addEventListener:
element.addEventListener(eventType, handler[, captureOrOptions]);
.
-
captureOrOptions,false`{ capture: false }, " " " " -
captureOrOptionstrue`{ capture: true }, " ()"
<body> " ":
document.body.addEventListener('click', () => {
console.log('Body click event in capture phase');
}, true);
CodeSandbox, , , .
, ?
: , , . .
3.
, :
<div id="buttons"> <!-- 1 -->
<button class="buttonClass">Click me</button>
<button class="buttonClass">Click me</button>
<!-- ... -->
<button class="buttonClass">Click me</button>
</div>
<script>
document.getElementById('buttons')
.addEventListener('click', event => { // Step 2
if (event.target.className === 'buttonClass') { // Step 3
console.log('Click!');
}
});
</script>
. , <div id="buttons">. , , ( ?).
3 :
1.
<div id="buttons"> .
2.
document.getElementById('buttons').addEventListener('click', handler) . , - ( ).
3. event.target
, - : event. event.target , ( ā ):
// ...
.addEventListener('click', event => {
if (event.target.className === 'buttonClass') {
console.log('Click!');
}
});
, , event.currentTarget. event.currentTarget <div id="buttons">.
: , , , .
4.
( ):
-
window,document, ( / ) - ( )
- , , , ,
documentwindow( )
.
A delegação de eventos é um padrão útil porque permite rastrear eventos em vÔrios elementos com apenas um manipulador.
Para a delegação de eventos funcionar, você precisa de 3 etapas:
- Defina o pai dos elementos para rastrear eventos
- Anexe um manipulador de eventos a ele
- Use
event.targetpara selecionar o item alvo