JavaScript
// Method 1: Basic event delegation
const list = document.getElementById('myList');
// Instead of adding listener to each item
list.addEventListener('click', function(e) {
if (e.target.tagName === 'LI') {
console.log('List item clicked:', e.target.textContent);
e.target.classList.toggle('active');
}
});
// Method 2: Dynamic content
const container = document.getElementById('container');
container.addEventListener('click', function(e) {
if (e.target.classList.contains('button')) {
console.log('Button clicked:', e.target.id);
}
});
// Add new buttons dynamically - they work automatically!
function addButton(text) {
const btn = document.createElement('button');
btn.className = 'button';
btn.textContent = text;
container.appendChild(btn);
}
// Method 3: Multiple selectors
container.addEventListener('click', function(e) {
if (e.target.matches('.delete-btn')) {
deleteItem(e.target.dataset.id);
} else if (e.target.matches('.edit-btn')) {
editItem(e.target.dataset.id);
} else if (e.target.matches('.view-btn')) {
viewItem(e.target.dataset.id);
}
});
// Method 4: Closest method
container.addEventListener('click', function(e) {
const card = e.target.closest('.card');
if (card) {
console.log('Card clicked:', card.dataset.id);
}
});
// Method 5: Event delegation with data attributes
const table = document.getElementById('dataTable');
table.addEventListener('click', function(e) {
const row = e.target.closest('tr');
if (row) {
const id = row.dataset.id;
const action = e.target.dataset.action;
if (action === 'delete') {
deleteRow(id);
} else if (action === 'edit') {
editRow(id);
}
}
});Output
// Output depends on user interaction
Event delegation handles events on parent.
Benefits
- Works with dynamic content
- Better performance
- Less memory usage
- Single event listener
How It Works
- Add listener to parent
- Check event.target
- Handle based on target
Use Cases
- Dynamic lists
- Tables with actions
- Cards and containers
- Forms with dynamic fields
Best Practices
- Use closest() for nested elements
- Check target with matches()
- Use data attributes for actions