JS Events

Events allow your code to respond to user interactions. Handle clicks, inputs, and other browser events.

On this page

Intro to Events

JavaScript events are actions that happen in the browser: clicking a button, typing in an input, loading a page, and more. You can respond to events using event handlers.

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

btn.addEventListener("click", () => {
  console.log("Button clicked");
});

Mouse Events

Mouse events include click, dblclick, mousedown, mouseup, mousemove, mouseenter, mouseleave.

const box = document.querySelector("#box");

box.addEventListener("mouseenter", () => {
  box.classList.add("active");
});

box.addEventListener("mouseleave", () => {
  box.classList.remove("active");
});

You can read mouse position with clientX and clientY.

document.addEventListener("mousemove", (e) => {
  // e.clientX / e.clientY are viewport coordinates
  // console.log(e.clientX, e.clientY);
});

Keyboard Events

Keyboard events are fired when the user interacts with the keyboard: keydown, keyup.

const input = document.querySelector("#search");

input.addEventListener("keydown", (e) => {
  if (e.key === "Enter") {
    console.log("Enter pressed:", input.value);
  }
});

Useful properties: key, code, and modifier keys.

document.addEventListener("keydown", (e) => {
  if (e.ctrlKey && e.key.toLowerCase() === "s") {
    e.preventDefault();
    console.log("Ctrl+S captured");
  }
});

Load Events

Use DOMContentLoaded to run code after the DOM is ready (recommended). Use load to wait for all resources (images, CSS, etc.).

document.addEventListener("DOMContentLoaded", () => {
  console.log("DOM is ready");
});

window.addEventListener("load", () => {
  console.log("All resources loaded");
});

Timing Events

Timing events allow delayed or repeated execution using setTimeout and setInterval.

const t = setTimeout(() => {
  console.log("Runs once after 1s");
}, 1000);

let count = 0;
const i = setInterval(() => {
  count++;
  console.log("Tick", count);
  if (count === 3) clearInterval(i);
}, 500);

Tip: Prefer requestAnimationFrame for animation loops.

let x = 0;
function animate() {
  x += 1;
  // update DOM here...
  if (x < 60) requestAnimationFrame(animate);
}
requestAnimationFrame(animate);

Manage Events

You can control event behavior using preventDefault() and stopPropagation().

Prevent form submission:

const form = document.querySelector("#form");

form.addEventListener("submit", (e) => {
  e.preventDefault();
  console.log("Form submit prevented");
});

Stop bubbling (use carefully):

const outer = document.querySelector("#outer");
const inner = document.querySelector("#inner");

outer.addEventListener("click", () => console.log("outer click"));
inner.addEventListener("click", (e) => {
  e.stopPropagation();
  console.log("inner click");
});

Event Examples

Example: toggle a class on click.

const btn2 = document.querySelector("#toggle");
const panel = document.querySelector("#panel");

btn2.addEventListener("click", () => {
  panel.classList.toggle("open");
});

Example: live character counter (input event).

const message = document.querySelector("#message");
const counter = document.querySelector("#counter");

message.addEventListener("input", () => {
  counter.textContent = message.value.length;
});

Event Listener

Use addEventListener to attach handlers. You can remove handlers with removeEventListener if you keep a reference to the function.

const btn3 = document.querySelector("#once");

function handleClick() {
  console.log("Clicked once");
  btn3.removeEventListener("click", handleClick);
}

btn3.addEventListener("click", handleClick);

Modern tip: Use event delegation for lists and dynamic content.

const list = document.querySelector("#list");

list.addEventListener("click", (e) => {
  const item = e.target.closest("li");
  if (!item) return;

  console.log("Clicked item id:", item.dataset.id);
});

Next Step

Continue with JS Projects to build small practical examples using DOM + events.

JS Events Examples (8)