๐ŸŒ JavaScript DOM & Browser BOM
Estimated reading: 4 minutes 115 views

โšก JavaScript โ€“ Events, addEventListener, Delegation & Custom Events: The Complete Guide


๐Ÿงฒ Introduction โ€“ Why JavaScript Events Matter

JavaScript events power every interaction on a websiteโ€”whether it’s clicking a button, typing in a form, or hovering over a menu. Mastering event handling is essential to building dynamic, interactive applications.

By the end of this guide, youโ€™ll understand:

  • โœ… What events are and how to listen for them
  • โœ… How addEventListener works
  • โœ… How to implement event delegation efficiently
  • โœ… How to create and dispatch custom events

๐Ÿ”” 1. What is an Event in JavaScript?

An event is a signal that something has happened in the browserโ€”like a click, key press, mouse movement, form submit, etc.

โœ… Example: Basic Click Event

document.querySelector("button").onclick = function () {
  alert("Button clicked!");
};

๐Ÿ“˜ This sets an inline event handler for a button click. However, this approach is less flexible than addEventListener.


๐ŸŽง 2. Using addEventListener()

addEventListener() is the modern, preferred method for attaching events.

โœ… Syntax:

element.addEventListener(event, handler, options);
ParameterDescription
eventEvent type like 'click', 'submit', 'keydown'
handlerCallback function to execute
options (optional)Object or boolean (e.g., { once: true })

โœ๏ธ Example: Click Event Listener

const btn = document.querySelector("#myBtn");

btn.addEventListener("click", () => {
  console.log("Clicked!");
});

โœ… Flexible, allows multiple handlers on the same event.


๐Ÿ’ก Advanced Example: Remove Event Listener

function greet() {
  console.log("Hello!");
  btn.removeEventListener("click", greet); // Removes itself
}

btn.addEventListener("click", greet);

โœ… Ideal for one-time tasks or toggles.


๐Ÿงช 3. Event Object & Properties

Every event triggers an event object, which contains useful info.

element.addEventListener("click", function (e) {
  console.log(e.target);  // Element that triggered the event
  console.log(e.type);    // Type of event, e.g., "click"
});

โœ… Use event.preventDefault() to stop default browser actions, and event.stopPropagation() to prevent event bubbling.


๐ŸŒฟ 4. Event Propagation: Bubbling vs Capturing

JavaScript events propagate in two phases:

PhaseDescription
CapturingFrom the outermost element down to the target
BubblingFrom the target element up to the root

By default, addEventListener() listens during bubbling.


๐Ÿ” Example: Bubbling

document.body.addEventListener("click", () => {
  console.log("Body clicked");
});

document.getElementById("inner").addEventListener("click", () => {
  console.log("Inner clicked");
});

โœ… Clicking inner triggers both listeners due to bubbling.


๐Ÿ”— 5. Event Delegation โ€“ Efficient Event Handling

Instead of adding events to many child elements, add it to a common ancestor and use event.target.

โœ… Use Case: Delegating to a <ul>

<ul id="list">
  <li>Item 1</li>
  <li>Item 2</li>
</ul>
document.getElementById("list").addEventListener("click", (e) => {
  if (e.target.tagName === "LI") {
    alert(`You clicked ${e.target.textContent}`);
  }
});

โœ… Saves performance by using a single listener for dynamic elements too!


๐ŸŽฏ 6. Creating Custom Events

You can define and dispatch your own events with CustomEvent.

โœ… Example: Create & Dispatch Custom Event

const myEvent = new CustomEvent("launch", {
  detail: { mission: "Apollo 11" },
});

document.addEventListener("launch", (e) => {
  console.log("Mission:", e.detail.mission);
});

document.dispatchEvent(myEvent);

โœ… Custom events can carry data (detail) and be used for decoupled communication between components.


๐Ÿ“„ Event Listener Options

OptionDescription
onceRun the listener only once
captureListen during capturing phase
passiveTells browser not to block scroll behavior
element.addEventListener("touchstart", handler, { passive: true });

โœ… Helps improve performance on scroll events.


๐Ÿ’ก Best Practices

  • โœ… Use addEventListener() for clean, flexible code
  • โœ… Always remove listeners in long-lived apps to avoid memory leaks
  • โœ… Use delegation for large or dynamic DOM structures
  • โœ… Avoid inline handlers (onclick="...")โ€”theyโ€™re harder to maintain
  • โœ… Always reference event.target for accuracy in delegation

๐Ÿ“Œ Summary

Letโ€™s recap:

โœ… JavaScript events power all browser interactivity
โœ… addEventListener() is the preferred modern approach
โœ… Event delegation improves performance for dynamic UIs
โœ… Custom events allow component-level communication
โœ… Always clean up event listeners to avoid memory leaks


โ“ FAQs

โ“ What is the difference between onclick and addEventListener?

  • onclick can only assign one handler
  • addEventListener supports multiple handlers and extra options like once and capture

โ“ How does event delegation improve performance?

It reduces the number of event listeners by leveraging event bubblingโ€”ideal for dynamic lists or tables.

โ“ How do I prevent the default action of an event?

Use event.preventDefault(), for example:

document.querySelector("form").addEventListener("submit", (e) => {
  e.preventDefault();
});

โ“ What is event.target vs event.currentTarget?

  • event.target: The actual element that triggered the event
  • event.currentTarget: The element the listener is attached to

โ“ When should I use Custom Events?

Use them to decouple components and trigger custom behaviors like โ€œmodal:openโ€, โ€œuser:loginโ€, etc.


Share Now :
Share

JavaScript โ€” Events / addEventListener / Delegation / Custom Events

Or Copy Link

CONTENTS
Scroll to Top