Greetings. I present to your attention the translation of the article "A Simple Explanation of Event Delegation in JavaScript" published on July 14, 2020 by Dmitri Pavlutin
In this article, Dmitry Pavlutin explains what one of the basic patterns of working with DOM events is based on.
1. Why event delegation?
Let's write a script that, when clicking on an HTML button, will send a message to the 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) – , , ,
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
( )
.
Event delegation is a useful pattern because it allows you to track events on multiple elements with just one handler.
For event delegation to work, you need 3 steps:
- Define the parent of elements to track events
- Attach an event handler to it
- Use
event.target
to select target item