Saludos. Presento a su atención la traducción del artículo "Una explicación simple de la delegación de eventos en JavaScript" publicado el 14 de julio de 2020 por Dmitri Pavlutin
En este artículo, Dmitry Pavlutin explica en qué se basa uno de los patrones básicos de trabajo con eventos DOM.
1. ¿Por qué la delegación de eventos?
Escribamos un script que, al hacer clic en un botón HTML, enviará un mensaje a la consola.
, 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) – , , ,
document
window
captureOrOptions
addEventListener
:
element.addEventListener(eventType, handler[, captureOrOptions]);
.
-
captureOrOptions
,false
`{ capture: false }, " " " " -
captureOrOptions
true
`{ 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
, ( / ) - ( )
- , , , ,
document
window
( )
.
La delegación de eventos es un patrón útil porque le permite rastrear eventos en múltiples elementos con un solo controlador.
Para que la delegación de eventos funcione, necesita 3 pasos:
- Definir el padre de los elementos para rastrear eventos
- Adjuntarle un controlador de eventos
- Use
event.target
para seleccionar el elemento de destino