Skip to content

Events

Events represent actions or occurrences in the browser such as clicks, typing, scrolling, or loading.

JavaScript listens to these events and executes code, enabling interactive applications.


graph TD A[User Action] --> B[Event Created] B --> C[Capture Phase] C --> D[Target Phase] D --> E[Bubble Phase]
  • Capture Phase → event travels from root → target
  • Target Phase → event reaches target element
  • Bubble Phase → event moves back to root

const btn = document.querySelector("#btn");
function handleClick() {
console.log("Clicked");
}
btn.addEventListener("click", handleClick);

btn.addEventListener("click", handleClick, {
once: true,
capture: false,
passive: true
});
  • once → runs only once
  • capture → runs in capture phase
  • passive → improves scroll performance

btn.removeEventListener("click", handleClick);

input.addEventListener("input", (event) => {
console.log(event.target.value);
console.log(event.type);
});

target

Actual element where event occurred

currentTarget

Element where listener is attached

type

Type of event (click, input, etc.)


parent.addEventListener("click", (e) => {
console.log(e.target); // actual clicked element
console.log(e.currentTarget); // parent
});

Mouse

click, dblclick, mousemove

Keyboard

keydown, keyup

Form

submit, input, change

Window

load, resize, scroll


form.addEventListener("submit", (e) => {
e.preventDefault();
});
child.addEventListener("click", (e) => {
e.stopPropagation();
});

graph TD A[Window] --> B[Document] B --> C[Parent] C --> D[Target] D --> E[Bubble Up]

list.addEventListener("click", (e) => {
if (e.target.matches("li")) {
console.log(e.target.textContent);
}
});

  • Fewer listeners → better performance
  • Works with dynamically added elements

graph LR A[Parent Listener] --> B[Child Events]

setTimeout(() => {
console.log("Runs once");
}, 2000);

graph TD A[Call Stack] --> B{Empty?} B -->|No| C[Wait] B -->|Yes| D[Take Event Callback] D --> E[Execute]

form.addEventListener("submit", (e) => {
e.preventDefault();
const data = new FormData(form);
console.log(data.get("email"));
});

btn.addEventListener("click", async () => {
btn.disabled = true;
await new Promise(r => setTimeout(r, 1000));
btn.disabled = false;
});

element.removeEventListener("click", handler);
clearInterval(timerId);

  1. Use addEventListener, not inline handlers
  2. Prefer event delegation for lists
  3. Keep handlers small
  4. Clean up listeners when not needed
  5. Avoid unnecessary DOM queries inside handlers