Loading content…
Loading content…
Master the single-threaded JavaScript Event Loop execution order and optimize DOM performance using event delegation and propagation
JavaScript Event Loop FlowchartqueueMicrotask, MutationObservers). The Event Loop executes all waiting microtasks before moving to the next phase.setTimeout, setInterval, network requests, user clicks).console.log("1. Synchronous Begin");
setTimeout(() => {
console.log("2. Macrotask (setTimeout)");
}, 0);
Promise.resolve().then(() => {
console.log("3. Microtask (Promise)");
});
console.log("4. Synchronous End");
1. Synchronous Begin
4. Synchronous End
3. Microtask (Promise)
2. Macrotask (setTimeout)
Window ─┐ ┌─ Window (Phase 3: Bubbling)
Body │ Phase 1: Capturing (Downwards) │ Body
List │ │ List
Item ──────────► Target ────────────┘
(Phase 2: Target)
Window object to the target element. (Rarely used in practice, active only if addEventListener(..., { capture: true }) is set).event.target).Window object. By default, standard event listeners trigger during this phase.event.stopPropagation();
event.target to handle clicks dynamically.<ul id="todoList">
<li data-id="1">Buy Groceries <button class="delete-btn">X</button></li>
<li data-id="2">Write Code <button class="delete-btn">X</button></li>
<li data-id="3">Go running <button class="delete-btn">X</button></li>
</ul>
<script>
const list = document.getElementById("todoList");
// One single listener handles all child delete buttons, even new items!
list.addEventListener("click", (event) => {
if (event.target.classList.contains("delete-btn")) {
const listItem = event.target.closest("li");
const todoId = listItem.dataset.id;
console.log(`Deleting todo ID: ${todoId}`);
listItem.remove();
}
});
</script>
<ul>, the browser recalculates layouts 1,000 times, causing major page lag.const list = document.getElementById("todoList");
// Create a virtual offscreen DOM container
const fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {
const li = document.createElement("li");
li.textContent = `Generated item ${i}`;
fragment.appendChild(li); // Appending to virtual fragment triggers NO reflow
}
// Append once to the live page: triggers only 1 reflow calculation!
list.appendChild(fragment);
Senior Developer Wisdom
Common Pitfall
Event Loop & DOM Checklist
setTimeout).Marking it complete updates your roadmap progress percentage.