DEV Community

Cover image for Understanding Event Bubbling and Capturing in JavaScript
Manan Pujara
Manan Pujara

Posted on

Understanding Event Bubbling and Capturing in JavaScript

Imagine you're at a concert, and someone in the front row shouts a question. The message travels back through the crowd, row by row, until it reaches the back. This is similar to how event bubbling works in JavaScript. Conversely, if the question starts from the back and moves to the front, that's event capturing. Let's dive into these concepts!

Event Bubbling
Event bubbling is like the message moving from the child element up to its parents. When an event is triggered on an element, it first runs the handlers on it, then on its parent, then all the way up on other ancestors.

Event Capturing
Event capturing, on the other hand, is the reverse process. The event is first captured by the outermost element and propagated to the inner elements. Think of it as the message moving from the back of the concert hall to the front.

Here's a simple HTML example to illustrate these concepts:

<!DOCTYPE html>
<html>
<body>
  <div id="grandparent">Grandparent
    <div id="parent">Parent
      <div id="child">Child</div>
    </div>
  </div>

  <script>
    document.getElementById('grandparent').addEventListener('click', () => alert('Grandparent clicked!'), true); // Capturing
    document.getElementById('parent').addEventListener('click', () => alert('Parent clicked!'));
    document.getElementById('child').addEventListener('click', () => alert('Child clicked!'));
  </script>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

In this example, clicking on "Child" will first print "Grandparent clicked!" (due to capturing) and then "Child clicked!" and "Parent clicked!" (due to bubbling).

Image description

Image description

Preventing Event Bubbling and Capturing

Stopping Event Bubbling
To stop an event from bubbling up the DOM tree, use event.stopPropagation():

Copy code
document.getElementById('child').addEventListener('click', (event) => {
  alert('Child clicked!');
  event.stopPropagation(); // Stops the event from bubbling up
});
Enter fullscreen mode Exit fullscreen mode

Stopping Event Capturing
To stop an event from capturing, you can use event.stopPropagation() in the capturing phase as well:

Copy code
document.getElementById('grandparent').addEventListener('click', (event) => {
  alert('Grandparent clicked!');
  event.stopPropagation(); // Stops the event from capturing down
}, true); // Capturing phase
Enter fullscreen mode Exit fullscreen mode

Use Cases

Form Validation

Prevent form submission when validation fails using event capturing.

Event Delegation

Handle events on dynamically added elements more efficiently using event bubbling.

Here are some common mistakes developers make when dealing with events:

Forgetting to Remove Event Listeners:Always clean up event listeners to avoid memory leaks.

Incorrect Use of stopPropagation
Using event.stopPropagation() incorrectly can prevent other important event handlers from executing.

Conclusion

Event bubbling and capturing are fundamental concepts for handling events in JavaScript. Experiment with these examples to better understand how they work!

Got questions or examples? Leave a comment below and let's discuss!

Top comments (0)