element.onclick = fn - лише один обробник: наступне присвоєння перезаписує попередній. addEventListener додає скільки завгодно обробників на одну подію й має налаштування.
button.onclick = () => track('click');
button.onclick = () => openModal(); // track більше не спрацює
button.addEventListener('click', () => track('click'));
button.addEventListener('click', () => openModal()); // спрацюють обидва
Опції addEventListener:
once: true- обробник автоматично знімається після першого спрацювання.passive: true- обіцянка не викликатиpreventDefault(). Дляtouchstart/wheelце дозволяє браузеру прокручувати сторінку плавно, не чекаючи обробника.capture: true- обробник спрацює на фазі перехоплення, ще до цільового елемента.signal- зняти обробник черезAbortController, зручно для кількох обробників одразу.
Зняти обробник можна лише тим самим посиланням на функцію:
function onResize() { /* ... */ }
window.addEventListener('resize', onResize);
window.removeEventListener('resize', onResize); // працює
window.addEventListener('resize', () => {});
window.removeEventListener('resize', () => {}); // нічого не зніме: інша функція
Атрибути в HTML (<button onclick="...">) - найгірший варіант: код змішано з розміткою, а суворий Content Security Policy такі обробники блокує.