Events and Forms
Respond to interaction, validate form data, and manage event flow.
Events report that something happened: a click, input change, submission, key press, or network result. Listen at the element responsible for the behavior.
Add an event listener
theme.js
const toggle = document.querySelector("#theme-toggle");
toggle?.addEventListener("click", (event) => {
console.log(event.currentTarget);
document.documentElement.classList.toggle("dark");
});
currentTarget is the element with the listener. target is the deepest element where the event began.
Handle a form
signup.js
const form = document.querySelector("#signup");
form?.addEventListener("submit", (event) => {
event.preventDefault();
const data = new FormData(form);
const email = String(data.get("email") ?? "").trim();
if (!form.checkValidity()) {
form.reportValidity();
return;
}
console.log({ email });
});
Listen for submit, not only a button click: forms can be submitted by keyboard and other mechanisms. Native validation remains useful, but the server must validate again.
Delegate repeated interactions
courses.js
document.querySelector("#course-list")?.addEventListener("click", (event) => {
const button = event.target.closest("button[data-course]");
if (!button) return;
openCourse(button.dataset.course);
});
One listener on a stable parent can handle present and future children as the event bubbles.
Keep this
Listen for semantic events, distinguish target from current target, handle form submission itself, and validate at every trust boundary.
Your place is saved on this device.