JAVASCRIPT
Implement Efficient Event Delegation for Dynamic Content
Optimize web application performance and simplify event handling for elements added dynamically to the DOM by using event delegation, listening on a parent element.
document.addEventListener('DOMContentLoaded', () => {
const listContainer = document.getElementById('dynamic-list');
if (listContainer) {
// Attach a single event listener to the parent container
listContainer.addEventListener('click', (event) => {
// Check if the clicked element matches a specific selector
if (event.target.matches('.list-item')) {
const itemId = event.target.dataset.itemId;
console.log(`Clicked item with ID: ${itemId} and content: ${event.target.textContent}`);
// Add your specific logic here for the clicked item
event.target.classList.toggle('selected');
} else if (event.target.matches('.delete-btn')) {
const listItem = event.target.closest('.list-item');
if (listItem) {
console.log(`Deleting item: ${listItem.textContent}`);
listItem.remove();
}
}
});
// Function to add new items dynamically
document.getElementById('add-item-btn')?.addEventListener('click', () => {
const newItem = document.createElement('li');
const newItemCount = listContainer.children.length + 1;
newItem.textContent = `New Item ${newItemCount}`;
newItem.classList.add('list-item');
newItem.dataset.itemId = `item-${newItemCount}`;
const deleteButton = document.createElement('button');
deleteButton.textContent = 'X';
deleteButton.classList.add('delete-btn');
newItem.appendChild(deleteButton);
listContainer.appendChild(newItem);
});
}
});
// Example HTML structure:
/*
<ul id="dynamic-list">
<li class="list-item" data-item-id="item-1">Item 1 <button class="delete-btn">X</button></li>
<li class="list-item" data-item-id="item-2">Item 2 <button class="delete-btn">X</button></li>
</ul>
<button id="add-item-btn">Add New Item</button>
*/
How it works: Event delegation involves attaching a single event listener to a parent element rather than to individual child elements. When an event (like a click) bubbles up from a child to the parent, the listener on the parent checks `event.target` (the actual element that was clicked) using `matches()` or `closest()` to determine if it should react, even for child elements added to the DOM after the initial page load. This significantly improves performance and simplifies code for dynamic lists or grids.