JavaScript Tutorial · JavaScript in the Browser · Lesson 42 of 44
JavaScript Events
Respond to clicks, input and keyboard events with addEventListener.
addEventListener
Events are things that happen on the page: clicks, key presses, form input, page load. Register a function to run when an event fires:
<button id="btn">Click me</button>
<p id="out">Not clicked yet.</p>
<input id="name" placeholder="Type your name">
<p id="greeting"></p>
<script>
let clicks = 0;
document.getElementById("btn").addEventListener("click", () => {
clicks++;
document.getElementById("out").textContent = `Clicked ${clicks} time(s).`;
});
document.getElementById("name").addEventListener("input", (event) => {
document.getElementById("greeting").textContent = `Hello, ${event.target.value || "stranger"}!`;
});
</script>
Avoid inline onclick="..." attributes — addEventListener keeps JavaScript out of the HTML and allows several listeners.
The event object
The listener receives an event object with details: event.target (the element), event.key for keyboard events, and event.preventDefault() to stop the default browser action (like following a link or submitting a form).
Event delegation
Events bubble up from the target through its ancestors. Instead of a listener on every list item, put one on the parent and check event.target — it also works for items added later:
<ul id="todo">
<li>Learn the DOM <button>Done</button></li>
<li>Learn events <button>Done</button></li>
</ul>
<button id="add">Add task</button>
<script>
const todo = document.getElementById("todo");
todo.addEventListener("click", (event) => {
if (event.target.matches("button")) {
event.target.closest("li").style.textDecoration = "line-through";
}
});
let n = 0;
document.getElementById("add").addEventListener("click", () => {
todo.insertAdjacentHTML("beforeend", `<li>New task ${++n} <button>Done</button></li>`);
});
</script>
Test yourself
Which method stops a form from submitting normally?
event.stop()event.preventDefault()return trueevent.cancelSubmit()
Show answer
Answer: event.preventDefault()