Як працює Event Listeners + шпаргалка по подіям
17 Nov 2022
Вступ
Незалежно від того початківці ми в програмуванні або вже досвідчені сеньйори-помідори, в будь-якому випадку, ми повинні використовувати прослуховувачі подій (Event Listeners) у кожному своєму проекті, так як без них не може бути побудована робота із взаємодією наших користувачів.
Я впевнений, що кожен з нас вміє гарно користуватися цією технологію, але крім шпаргалки по івентам, я би хотів розібрати досить важливі теми, які можливо не так часто зустрічаються в нашої роботі, але знати їх необхідно.
Я говорю про:
- Поширення подій (Event Propagation)
- Делегування подій (Event Delegation)
Давайте швидко розберемось що до чого.
Поширення подій (Event Propagation)
В нас є кнопка, яка вкладена в якийсь блок
example 1
Коли ми натискаємо кнопку, ми впевнені що події кліка спрацює на ній. І ми матимемо рацію, проте крім кнопки, подію отримає і весь ланцюжок батьківських елементів і навіть об'єкти document і window.
Чому так відбувається? Справа в тому, що подія кліка поширюється в 3 етапи:
- Фаза занурення (capturing phase) – починаючи з window, document та кореневого елемента, подія занурюється зверху вниз по DOM-дереву через предків кнопки, на якій сталася подія.
- Фаза цілі (target phase) – спрацювання події на елементі, на який клацнув користувач. В нашому випадку - це кнопка.
- Фаза спливання (bubble phase) – нарешті, подія спливає по ланцюжку предків кнопки, доки досягне кореневого елемента та об'єктів document і window
Тобто коли ми натискаємо на кнопку, щоб дістатися до неї, подія іде зверху вниз до неї, а потім спливає назад вгору по ланцюжку.
В методі addEventListener існує третій аргумент capture(boolean), який дозволяє нам перехоплювати події на різних етапах.
elem.addEventListener(..., {capture: true})
// або просто "true", це скорочення для {capture: true}
elem.addEventListener(..., true)
- Якщо аргумент false (за замовчуванням), то подія буде спіймана при фазі спливання.
- Якщо аргумент true, то подію буде перехоплено під час фази занурення.
Ось дуже чудовий наглядний приклад як це працює - приклад
Отже, навіщо нам це знати? Ця інформація допоможе нам краще розуміти процесс делегування. Давайте розглянемо!
Делегування подій (Event Delegation)
Делегування подій - це досить зручний механізм, ідея якого проста. Коли в нас є багато елементів, на які потрібно вішати наприклад клік, замість того, щоб вішати івент на кожну кнопку, ми можемо повішати на батьківський елемент та відловлювати фазу спливання.
example 2
Нам потрібно 3 кроки:
- Визначити загальний батьківський елемент, в нашому випадку це ("buttons-wrap")
- Повісити на нього івент
- Використовувати event.target для вибору цільового елемента.
Є 2 способи використання event.target для вибору ".btn":
За допомогою classList:
buttons-wrap.addEventListener('click', event => {
if (event.target.classList.contains("btn")) {
console.log('Click!');
}
});
Та за допомогою .matches(selector) - я чув цей спосіб полюбляє гугл
buttons-wrap.addEventListener('click', event => {
if (event.target.matches(".btn")) {
console.log('Click!');
}
});
Отже, тепер ми знаємо чудовий спосіб вішання івентів на безліч елементів, використовуючи метод .addEventListener() тільки один раз.
А тепер після такої філософії, я пропоную розглянути практичну шпаргалку, яка допоможе нам у роботі
Шпаргалка по подіям
Розбиремо найпопулярніші у практиці
Події миші
- click - одинарний клік (натиснута та відпущена кнопка миші)
- dblclick - подвійний клік
- contextmenu - клік правою кнопкою миші на елементі
- mousewheel - натиснута кнопка миші в межах елемента
- mousemove - переміщення курсору миші в межах елемента
- mouseover / mouseout - курсор миші наведено на елемент (mouseover) або навпаки виведено за межі елемента(mouseout). Також подія спрацьовує на дочірні блоки - приклад.
- mouseenter / mouseleave - схожа на mouseover / mouseout, але різниця в тому що вони не реагують на свої дочірні елементи, події спрацьовують лише для батьківського елемента - приклад
Події клавіатури
- keydown - натиснута клавіша на клавіатурі
- keypress - натиснуто та відпущено клавішу на клавіатурі
- keyup - відпущена клавіша на клавіатурі
Події елементів форм
- focus - елемент отримав фокусу (BUTTON, INPUT, LABEL, SELECT, TEXTAREA)
- blur - втрата фокусу, тобто перехід до іншого елементу (BUTTON, INPUT, LABEL, SELECT, TEXTAREA)
- change - зміна значень елементів форми. виникає після події blur (INPUT, SELECT, TEXTAREA)
- reset - скидання даних форми (клік по кнопці [type="reset"]) (FORM)
- select - виділення тексту у елементі (INPUT, TEXTAREA)
- submit - надсилання даних форми (клік по кнопці [type="submit "]) (FORM)
Події вікна браузера
- load - закінчено завантаження документа (BODY, FRAMESET)
- error - помилка виконання сценарія (IMG, WINDOW)
- move - переміщення вікна (WINDOW)
- resize - зміна розмірів вікна (WINDOW)
- scroll - прокрутка вікна або області елементу
Дякую за увагу!