This interactive page demonstrates how callbacks work with event listeners and timers in JavaScript.
Event listeners are a perfect example of callbacks. The callback function is executed when the event occurs.
// Adding a click event listener to a button document.getElementById("clickButton").addEventListener("click", function() { document.getElementById("clickOutput").textContent = "Button was clicked!"; });
Event listener callbacks receive an event object that contains information about the event.
// Using the event object in a callback document.getElementById("infoButton").addEventListener("click", function(event) { const output = document.getElementById("eventOutput"); output.innerHTML = ` Event type: ${event.type}
Target element: ${event.target.tagName}
Coordinates: X=${event.clientX}, Y=${event.clientY}
Time: ${new Date().toLocaleTimeString()} `; });
You can attach multiple event listeners to the same element. Each callback will execute when the event occurs.
// First event listener document.getElementById("multiButton").addEventListener("click", function() { document.getElementById("multiOutput").textContent += "First callback executed! "; }); // Second event listener on the same button document.getElementById("multiButton").addEventListener("click", function() { document.getElementById("multiOutput").textContent += "Second callback executed! "; });
Elements can listen for various types of events with different callbacks.
const inputElement = document.getElementById("demoInput"); // Input event occurs when value changes inputElement.addEventListener("input", function() { document.getElementById("inputOutput").textContent = `Current value: ${this.value}`; }); // Focus event inputElement.addEventListener("focus", function() { document.getElementById("inputOutput").textContent += "\nInput is focused!"; }); // Blur event (losing focus) inputElement.addEventListener("blur", function() { document.getElementById("inputOutput").textContent += "\nInput lost focus!"; });
The mousemove event demonstrates how callbacks can be called rapidly many times.
const moveArea = document.getElementById("mouseMoveArea"); const moveOutput = document.getElementById("moveOutput"); moveArea.addEventListener("mousemove", function(event) { const rect = moveArea.getBoundingClientRect(); const x = event.clientX - rect.left; const y = event.clientY - rect.top; moveOutput.textContent = `Mouse position: X=${Math.round(x)}, Y=${Math.round(y)}`; });
setTimeout and setInterval use callbacks to execute code after a specified delay or at regular intervals.
// setTimeout - executes once after a delay function delayedMessage() { setTimeout(function() { document.getElementById("timeoutOutput").textContent = "This message appeared after 2 seconds!"; }, 2000); // 2000 milliseconds = 2 seconds document.getElementById("timeoutOutput").textContent = "Waiting for 2 seconds..."; }
setInterval executes a callback repeatedly at specified intervals.
// setInterval - executes repeatedly let counter = 0; let intervalId; function startCounter() { // Clear any existing interval first clearInterval(intervalId); counter = 0; document.getElementById("intervalOutput").textContent = "Counter: " + counter; intervalId = setInterval(function() { counter++; document.getElementById("intervalOutput").textContent = "Counter: " + counter; // Stop after reaching 10 if (counter >= 10) { clearInterval(intervalId); document.getElementById("intervalOutput").textContent += "\nCounter stopped after reaching 10"; } }, 1000); // Execute every 1 second }
Combining setInterval with DOM updates to create a progress bar.
let progress = 0; let progressIntervalId; function startProgress() { // Reset first clearInterval(progressIntervalId); progress = 0; const progressBar = document.getElementById("progressBar"); progressBar.style.width = "0%"; document.getElementById("progressOutput").textContent = "Progress: 0%"; progressIntervalId = setInterval(function() { progress += 1; progressBar.style.width = progress + "%"; document.getElementById("progressOutput").textContent = `Progress: ${progress}%`; if (progress >= 100) { clearInterval(progressIntervalId); document.getElementById("progressOutput").textContent += "\nProgress complete!"; } }, 50); // Update every 50ms for smooth animation }
Using clearTimeout and clearInterval to cancel scheduled callbacks.
let timeoutId; function startTimeout() { // Clear any existing timeout clearTimeout(timeoutId); document.getElementById("clearOutput").textContent = "Timeout started. Will execute in 5 seconds..."; timeoutId = setTimeout(function() { document.getElementById("clearOutput").textContent = "Timeout executed!"; }, 5000); } function cancelTimeout() { clearTimeout(timeoutId); document.getElementById("clearOutput").textContent = "Timeout was cancelled!"; }
Creating a sequence of actions with nested timers.
function startSequence() { const output = document.getElementById("sequenceOutput"); output.textContent = "Starting sequence..."; setTimeout(function() { output.textContent += "\nFirst action after 1 second"; setTimeout(function() { output.textContent += "\nSecond action after 2 more seconds"; setTimeout(function() { output.textContent += "\nThird action after 3 more seconds"; output.textContent += "\nSequence complete!"; }, 3000); }, 2000); }, 1000); }