← Back to all snippets
JAVASCRIPT

Implement Efficient Event Delegation for Dynamic Elements

Optimize event handling for multiple or dynamically added elements by attaching a single event listener to a common parent using event delegation in JavaScript.

function setupEventDelegation(parentElementId, selector, eventType, handler) {
    const parent = document.getElementById(parentElementId);
    if (!parent) {
        console.error(`Parent element with ID '${parentElementId}' not found.`);
        return;
    }

    parent.addEventListener(eventType, function(event) {
        // Check if the clicked element matches the selector
        const targetElement = event.target.closest(selector);
        if (targetElement && parent.contains(targetElement)) {
            handler.call(targetElement, event); // Call handler with 'this' set to the target element
        }
    });
}

// Example Usage:
// <div id="myListContainer">
//   <button class="list-item">Item 1</button>
//   <button class="list-item">Item 2</button>
// </div>

setupEventDelegation('myListContainer', '.list-item', 'click', function(event) {
    alert(`You clicked: ${this.textContent}`);
    this.style.backgroundColor = 'lightblue'; // 'this' refers to the clicked button
});

// You can dynamically add new buttons, and the handler will still work:
// setTimeout(() => {
//   const container = document.getElementById('myListContainer');
//   const newButton = document.createElement('button');
//   newButton.className = 'list-item';
//   newButton.textContent = 'New Dynamic Item';
//   container.appendChild(newButton);
// }, 2000);
How it works: This snippet demonstrates event delegation, a powerful pattern for handling events on multiple child elements or elements added dynamically to the DOM. Instead of attaching a listener to each child, a single listener is attached to a common parent. When an event bubbles up, `event.target.closest(selector)` checks if the originating element matches a specific selector, and if so, the provided `handler` function is executed. This improves performance and simplifies code for dynamic content.

Need help integrating this into your project?

Our team of expert developers can help you build your custom application from scratch.

Hire DigitalCodeLabs