Просунута робота з об’єктом event на javascript, трепачёв дмитрий

  • урок №
    Практика
    на відпрацювання циклів і функцій

Робота з DOM

Деякі просунуті речі

бібліотека jQuery

  • урок №
    Підручник
    jQuery для новачків
  • урок №
    основи
    роботи з jQuery
  • урок №
    маніпулювання
    елементами сторінки
  • урок №
    Робота
    з набором елементів
  • урок №
    Робота
    з подіями jQuery
  • урок №
    Ефекти і анімація
    бібліотеки jQuery
  • урок №
    Практика на відпрацювання
    бібліотеки jQuery
  • урок №
    Робота з
    бібліотекою jQueryUI
  • урок №
    Популярні плагіни
    бібліотеки jQuery
  • урок №
    Підручник
    за регулярними виразами
  • урок №
    Робота з регулярними
    виразами. Глава 1.
  • урок №
    Робота з регулярними
    виразами. Глава 2.
  • урок №
    Робота з регулярними
    виразами. Глава 3.
  • урок №
    Робота з регулярними
    виразами. Глава 4.
  • урок №
    відмінності
    від PHP версії

Робота з кинувся

  • урок №
    Підручник
    по роботі з canvas
  • урок №
    основи
    роботи з canvas
  • урок №
    просунута
    робота з canvas

занурення

Крім спливання подій є ще і занурення (по науковому стадія перехоплення). Це означає, що подія спочатку йде зверху вниз (стадія перехоплення), доходить до нашого елементу (стадія мети) і тільки потім починає спливати (стадія спливання).

Повісити обробник події з урахуванням стадії перехоплення можна тільки за допомогою addEventListener. Для цього у нього є третій параметр: якщо він дорівнює true - подія спрацює на стадії перехоплення, а якщо false - на стадії спливання (це за замовчуванням):

Стадію, на якій сталася подія можна визначити за допомогою властивості event.eventPhase. Воно може набувати таких значень: 1 - стадія перехоплення, 2 - стадія мети, 3 - стадія спливання.

Вступ до делегування

Уявімо собі ситуацію: нехай у нас є ul з декількома li. До кожної li прив'язане таку обставину: після натискання на li їй в кінець додається '!'.

Давайте реалізуємо описане:

Нехай тепер у нас також є кнопочка, при натисканні на яку в кінець ul додається нова li з текстом 'пункт'. Нас чекає сюрприз: прив'язане подія не буде працювати для нових li! Переконаємося в цьому:

Натисніть на кнопочку для додавання li, а потім на цю нову li - вона не зреагує:

Для вирішення проблеми можна в момент створення нової li повісити на неї функцію addSign через addEventListener. Давайте реалізуємо це:

Натисніть на кнопочку для додавання li, а потім на цю нову li - вона зреагує:

Існує і другий спосіб обійти проблему - делегування подій. Давайте його розберемо.

делегування подій

Суть делегування в наступному: навіс подія не на кожну li, а на їх батьків - на ul.

При цьому працездатність нашого скрипта повинна зберегтися: як і раніше при кліці на li їй в кінець буде додаватися '!'. Тільки подія в новому варіанті буде навісили на ul:

Як ми це проверни: так як подія навісили на ul, то всередині функції ми можемо зловити li за допомогою event.target. Нагадаю, що таке event.target - це саме той тег, в якому стався клік, в нашому випадку це li.

Отже, ось рішення нашої задачі через делегування:

Результат виконання коду:

При цьому наше рішення буде працювати автоматично навіть для нових li. адже подія навішені нема на li, а на ul:

Натисніть на кнопочку для додавання li, а потім на цю нову li - вона зреагує:

Наш код робочий, проте не без недоліків. Давайте розберемо ці недоліки і напишемо більш універсальне рішення.

Універсальне делегування подій

Недолік нашого коду проявиться в тому випадку, коли всередині li будуть якісь вкладені теги. У нашому випадку нехай це будуть теги i.

В цьому випадку натискання на i призведе до додавання знаку оклику в кінець тега i. а не тега li. як ми хотіли б (якщо натиснути на li поза курсиву - то все буде ок):

Натисніть на курсив - ви побачите як '!' додасться йому в кінець (натискання поза курсиву буде працювати нормально):

Проблема виправляється таким чином (описаний спосіб не єдиний, але найпростіший): за допомогою методу closest знайдемо найближчу li, котоорая є батьком для event.target ось так: event.target.closest ( 'li').

Як це працює: якщо клік був на i. то в event.target лежить цей i, а в event.target.closest ( 'li') - наша li, для якої має спрацювати подія.

Якщо ж клік був на самій li. то і в event.target. і в event.target.closest ( 'li') буде лежати наша li.

Результат виконання коду:

Не важливо, яка глибина вкладеності: тег i може лежати в тезі b. а той в тезі span і тільки потім в li - це не має значення: конструкція event.target.closest ( 'li') знайде батька з будь-якого рівня вкладеності.

Додаткові матеріали

Що вам робити далі:

Приступайте до вирішення завдань за наступним посиланням: завдання до уроку.

Коли все вирішите - переходите до вивчення нової теми.

  • урок №
    Практика
    на відпрацювання циклів і функцій

Робота з DOM

Деякі просунуті речі

бібліотека jQuery

  • урок №
    Підручник
    jQuery для новачків
  • урок №
    основи
    роботи з jQuery
  • урок №
    маніпулювання
    елементами сторінки
  • урок №
    Робота
    з набором елементів
  • урок №
    Робота
    з подіями jQuery
  • урок №
    Ефекти і анімація
    бібліотеки jQuery
  • урок №
    Практика на відпрацювання
    бібліотеки jQuery
  • урок №
    Робота з
    бібліотекою jQueryUI
  • урок №
    Популярні плагіни
    бібліотеки jQuery
  • урок №
    Підручник
    за регулярними виразами
  • урок №
    Робота з регулярними
    виразами. Глава 1.
  • урок №
    Робота з регулярними
    виразами. Глава 2.
  • урок №
    Робота з регулярними
    виразами. Глава 3.
  • урок №
    Робота з регулярними
    виразами. Глава 4.
  • урок №
    відмінності
    від PHP версії

Робота з кинувся

  • урок №
    Підручник
    по роботі з canvas
  • урок №
    основи
    роботи з canvas
  • урок №
    просунута
    робота з canvas