Click an item
Clicks report id below.
If you searched event delegation javascript, attach one listener on a parent instead of per-row handlers. Match event.target with closest('button') for dynamic tables and menus.
One listener for many buttons.
Click an item
Clicks report id below.
list.addEventListener('click', (e) => {
const btn = e.target.closest('button[data-id]');
if (!btn) return;
console.log(btn.dataset.id);
});Delete buttons work on new rows too.
| A |
Add row then remove with ×.
tbody.addEventListener('click', (e) => {
if (e.target.matches('.remove-row')) {
e.target.closest('tr').remove();
}
});Mark scroll/touch listeners passive when not preventDefault.
Use { passive: true } for scroll performance unless blocking scroll.
Improves main-thread scrolling.
window.addEventListener('scroll', onScroll, { passive: true });