Всплытие событий - Event bubbling

Всплытие событий это тип распространения событий[1] где событие сначала запускается на самом внутреннем целевом элементе, а затем последовательно запускается на предках (родителях) целевого элемента в той же иерархии вложенности, пока не достигнет самого внешнего ДОМ элемент или объект документа[2] (При условии, что обработчик инициализирован). Это один из способов обработки событий в браузере. События - это действия, выполняемые пользователем, такие как нажатие кнопки, изменение поля и т. Д. Обработчики событий используются для выполнения кода, когда происходит определенный тип события пользовательского интерфейса, например, когда была нажата кнопка или когда веб-страница завершила загрузку.

Обзор

Рассмотрим структуру DOM, где есть 3 элемента, вложенных в следующем порядке: элемент 1 (Div), элемент 2 (Span), элемент 3 (кнопка), чьи обработчики при щелчке - это handler1 (), handler2 () и handler3 () соответственно. .

Как работает всплытие событий в структуре DOM
<div id="Element1" onclick="handler1()">   <span id="Element2" onclick="handler2()">      <input type="button" id="Element3" onclick="handler3()"/>    </span>  </div>  

Когда нажимается кнопка Element3, сначала запускается обработчик событий для Element 3, затем всплывает событие и вызывается обработчик для непосредственного родительского элемента - Element 2, за которым следует обработчик для Element 1 и так далее, пока он не достигнет самого внешнего DOM элемент.

Порядок обработки событий: handler3 () -> handler2 () -> handler1 ()

Самый внутренний элемент, откуда запускается событие, называется целевым элементом.[3] Большинство браузеров рассматривают восходящую цепочку событий как способ распространения событий по умолчанию. Однако есть другой подход к распространению событий, известный как Захват событий,[4] что является прямой противоположностью восходящей цепочки событий, когда обработка событий начинается с самого внешнего элемента (или документа) структуры DOM и идет до целевого элемента, выполняя обработчик целевого элемента последним по порядку.

Выполнение

Все обработчики событий рассматривают восходящую цепочку событий как способ обработки событий по умолчанию. Но пользователь может вручную выбрать способ распространения, указав это в качестве последнего параметра в addEventListener () [5] любого элемента в JavaScript.

addEventListener ("тип", "Listener", "CaptureMode")

Если CaptureMode имеет значение False, событие будет обрабатываться с использованием восходящей цепочки событий.

Если CaptureMode имеет значение True, событие будет обрабатываться с использованием захвата событий.

Если пользователь не указывает никакого значения аргумента CaptureMode, то по умолчанию это рассматривается как восходящая цепочка событий. Большинство браузеров поддерживают как всплытие событий, так и захват событий (за исключением IE <9 и Opera <7.0, которые не поддерживают захват событий).[1]

JavaScript также предоставляет свойство события, называемое пузыри чтобы проверить, является ли событие восходящим или нет. Он возвращает логическое значение True или False в зависимости от того, может ли событие всплывать до родительских элементов в структуре DOM или нет.

var isBubblePossible = event.bubbles;

isBubblePossible: True, если событие может всплыть до предков

isBubblePossible: False, если событие не может всплыть[6]

Использование пузырей событий

Для обработки случаев, когда одно событие имеет более одного обработчика, может быть реализована концепция восходящей цепочки событий. Основное использование восходящей цепочки событий - регистрация функций по умолчанию, присутствующих в программе. В последнее время немногие разработчики используют, в частности, захват событий или всплытие. Нет необходимости реализовывать восходящую цепочку событий; пользователям может быть сложно отслеживать действия, выполняемые из-за события.[1]

Предотвращение всплытия событий

Иногда полезно остановить один триггер для одного элемента, что приведет к нескольким триггерам для предков. JavaScript предоставляет следующие методы для предотвращения всплытия событий:

1) stopPropagation (): Этот метод останавливает дальнейшее распространение любого конкретного события его родителям, вызывая только обработчик событий целевого элемента. Хотя поддерживается всеми Браузеры, совместимые с W3C, Internet Explorer ниже версии 9 требует исторического псевдонима cancelBubble,[7] как в:

event.cancelBubble = true;

Для всех браузеров, совместимых с W3C:

event.stopPropagation ();

2) stopImmediatePropagation (): Этот метод не только остановит дальнейшее распространение, но также остановит выполнение любого другого обработчика целевого события. В модели DOM одно и то же событие может иметь несколько независимых обработчиков, поэтому остановка выполнения одного обработчика событий обычно не влияет на другие обработчики той же цели. Но метод stopImmediatePropagation () предотвращает выполнение любого другого обработчика той же цели.[7]

Для всех браузеров, совместимых с W3C:

event.stopImmediatePropagation ();

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

Смотрите также

Рекомендации

  1. ^ а б c «Javascript - порядок событий». www.quirksmode.org. Получено 2016-09-11.
  2. ^ «Объекты документа HTML DOM». www.w3schools.com. Получено 2016-09-11.
  3. ^ https://www.w3schools.com/jsref/event_target.asp
  4. ^ "Пузыри и захват | Учебное пособие по JavaScript". javascript.info. Получено 2016-09-11.
  5. ^ "Метод HTML DOM addEventListener ()".
  6. ^ "Свойство события пузырей". www.w3schools.com. Получено 2016-09-11.
  7. ^ а б «Пузырьки событий, как это предотвратить?». www.markupjavascript.com. Получено 2016-09-11.