Дом Событие

События и обработка событий обеспечивают основной метод в JavaScript для реагирования на инциденты, возникающие, когда браузер обращается к веб-странице.

Первоначально браузеры ждут, пока они не получат все ресурсы, связанные со страницей, чтобы проанализировать, обработать, нарисовать и представить страницу пользователю. Отображаемая страница остается неизменной, пока браузер не запросит новую страницу. С переходом на динамический рендеринг страницы браузеры непрерывно переключаются между обработкой, рисованием, представлением контента и ожиданием какого-либо нового триггера события. Триггеры событий включают завершение загрузки ресурса в сети например, загрузка изображения, которое теперь может быть нарисовано на экране, завершение анализа ресурса браузером например, , обрабатывает HTML-содержимое страницы, взаимодействие пользователя с содержимым страницы например, нажимает кнопку. Дуглас Крокфорд эффективно объясняет это изменение в нескольких лекциях, в частности в своем выступлении Неудобный API: теория DOM, в котором показано изменение потока по сравнению с исходным потоком в браузере.

Современные веб-браузеры следуют шаблону событий, используя стандартизированный подход. Мы используем в качестве метода регистрации для функции, которая будет обрабатывать события, метод с именем addEventListener, который ожидает в качестве аргументов строковое имя типа события и функцию-обработчик.

События разделены на разные типы событий, например:

  • События мыши
  • css Анимация События
  • форма События
  • печать событий
  • просмотр событий
  • буфер обмена События
  • keboard События
  • СМИ События
  • прогресс События
  • окно События
  • документ События
  • события датчика
  • коснитесь События
  • указатель События

Объект события имеет собственный интерфейсный интерфейс Event

interface Event {
  readonly attribute DOMString type; -> typoe of event
  readonly attribute EventTarget? target; -> target where event is       dispatched 
  // example : there is an exampel event delegation in Jquery
$('el').on('click','li'()=>{}) 
  readonly attribute EventTarget? currentTarget; -> target where event will be executed 
  sequence<EventTarget> composedPath();
  const unsigned short NONE = 0; *
  const unsigned short CAPTURING_PHASE = 1; *
  const unsigned short AT_TARGET = 2; *
  const unsigned short BUBBLING_PHASE = 3; *
  readonly attribute unsigned short eventPhase;
  void stopPropagation(); prevent buble case
  attribute boolean cancelBubble; // historical alias of .stopPropagation
  void stopImmediatePropagation(); // interrupt every event following this
  readonly attribute boolean bubbles; check if is on bubble case
  readonly attribute boolean cancelable; check if event is  canselable 
  void preventDefault(); -> prevent default function registered on element.
  readonly attribute boolean defaultPrevented; -> check if is prevented
  readonly attribute boolean composed; check if this element is composed
  [Unforgeable] readonly attribute boolean isTrusted; -> check if user interacted with dom or is another event that have done this.
  readonly attribute DOMTimeStamp timeStamp; -> time
  void initEvent(DOMString type, boolean bubbles, boolean cancelable); 
};
dictionary EventInit {
  boolean bubbles = false;
  boolean cancelable = false;
  boolean composed = false;
};

ЦЕЛЕВОЙ ИНТЕРФЕЙС СОБЫТИЯ

interface EventTarget {
  void addEventListener(DOMString type, EventListener? callback, optional (AddEventListenerOptions or boolean) options);
  void removeEventListener(DOMString type, EventListener? callback, optional (EventListenerOptions or boolean) options);
  boolean dispatchEvent(Event event);
};
callback interface EventListener {
  void handleEvent(Event event);
};
dictionary EventListenerOptions {
  boolean capture = false;
};
dictionary AddEventListenerOptions : EventListenerOptions {
  boolean passive = false;
  boolean once = false;
};

ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЬСКИХ СОБЫТИЙ

interface CustomEvent : Event {
  readonly attribute any detail;
void initCustomEvent(DOMString type, boolean bubbles, boolean cancelable, any detail);
};
dictionary CustomEventInit : EventInit {
  any detail = null;
};
  • нет 0
  • Захват 1
  • Задача 2
  • Пузыри 3

Когда событие вызывается, оно заглушается или находится в фазе none 0, событие проходит через уровни DOM до тех пор, пока не достигнет цели. Эта фаза известна как фаза захвата. Когда событие достигает цели, теперь оно находится в целевой фазе (2), затем повышается в DOM, это называется фазой пузыря (3).

ФАЗА ЗАВЕРШЕНИЯ (1)

Фаза захвата - это фаза, когда событие вызывается и распространяется на каждый уровень, пока не достигнет цели, на которой оно было вызвано. Фаза захвата - установить путь, по которому событие будет происходить из Target → Document, чтобы эта фаза определяла путь для фазы Bubbling.

addeventListener (type, callback, capturing: true) 

Мы можем остановить Фазу захвата, если установим последний параметр в значение false или undefined, и в этом случае все следующие события одного и того же типа в этом элементе не будут выполняться.

<div class="parentt">
        target
        <span class="child">current target</span>
    </div>
$j('.parent').click((e: JQueryEventObject)=>{
        console.log("some code related to rarget parent")
    });
     $j('.child').click((e: JQueryEventObject)=>{
       console.log("some code related to child inside"); 
       e.stopPropagation();
    });

Если мы удалим e.stopPropagation (); и мы нажимаем на $ (‘. child’), тогда мы запускаем обе консоли, поскольку первая функция $ (‘. child’) будет eventTarget, а $ (‘. parent’) будет currentEvetTarget. из-за того, что «пузырь» позволяет этому элементу прослушивать это событие и автоматически превращаться в прослушивающее событие. это останавливается stopPropagation ().
Но если мы установим stopImediatePropagation (), то никакое другое событие не будет выполняется на этом элементе при условии, что событие того же типа

$j('.parent').click((e: JQueryEventObject)=>{
        console.log("some code related to rarget parent")
    });
     $j('.child').click((e: JQueryEventObject)=>{
       console.log("some code related to child inside"); 
       e.stopImediatePropagation();
    });
    // ky funksion nuk do exekutohet
    $j('.child').click((e: JQueryEventObject)=>{
       console.log("some code related to child inside 2"); 
       e.stopImediatePropagation();
    });

Еще один важный элемент - event.delegationTarget; где мы можем делегировать слушателя

$('.parent').on('click','.child',(e) => {
       console.log("some code related to child inside"); 
    });

В этом случае мы делегировали прослушиватель событий элементу $ (‘. Child’), но у нас также есть делегатор, который является $ (‘. Parent’). В приведенных выше случаях delegateTarget is currentTarget цель делегата в основном используется для проблем с производительностью.

ФАЗА ПУЗЫРЬКИ

После того, как Событие достигает цели - цели, путь перемещения события здесь не заканчивается, он поднимается вверх через слои на пути, который определен в фазе захвата.

Представьте себе это как слои земли. Событие происходит на поверхности, спускается к ядру и задает путь через каждый слой. Итак, каждый слой теперь является целью, но если мы хотим прервать этот процесс, stopPropagation () остановит это событие. Следовательно, он никогда не достигнет ядра и вернется прямо наверх с завершенного уровня. Узел пузырьков никогда не достигнет других слоев. У нас должна быть очень веская причина для этого, потому что это пространство является мертвым пространством для этого события, а это означает, что в этом пространстве это событие не может быть услышано.