Как обычно происходит всплытие событий и является ли это синонимом распространения событий?

11

Я пытаюсь обдумать общие принципы работы и принципы распределения событий в управляемых событиями (под) системах.

Хотя я несколько раз использовал его, например, в Javascript, Flash (Actionscript 2 и 3) и даже когда-то создавал для себя простую систему диспетчеризации событий в PHP, я никогда по-настоящему не понимал всплывающих событий и / или распространение это хорошо.

Первый вопрос:
является ли пузырение события синонимом распространения события?

Второй вопрос:
правильно ли я понимаю, что когда событие «пузырится», это означает, что оно «перемещается» вверх по иерархии объектов?

Третий и самый важный вопрос:
верно ли мое понимание вопроса 2; как это «продвижение» вверх по иерархии объектов обычно осуществляется?
Означает ли это, что родительский объект «повторно отправляет» то же событие своему родительскому объекту (пока не достигнет корневого объекта)? И если так; все эти объекты в иерархии должны прислушиваться к своим дочерним элементам для этих событий, или мне не хватает чего-то жизненно важного принципа в моем понимании всплытия событий, когда нет необходимости позволять родительскому объекту регистрировать себя в качестве слушателей событий дочерних объектов?

Если бы вы могли проиллюстрировать эти основные принципы с помощью простого псевдокода, я был бы более чем благодарен.

Достойный Дилетант
источник
1
Связанная статья: Заказ случая
Jonas

Ответы:

7

Первый вопрос: является ли пузырение события синонимом распространения события?

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

Второй вопрос: правильно ли я понимаю, что когда событие «пузырится», это означает, что оно «перемещается» вверх по иерархии объектов?

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

Третий и самый важный вопрос: верно ли мое понимание вопроса 2; как это «продвижение» вверх по иерархии объектов обычно осуществляется?

Довольно легко. В вашей визуальной иерархии элементы управления имеют ссылку на своего родителя / визуальный элемент верхнего уровня или могут получить его где-нибудь. Поэтому, когда они фиксируют событие, они просто уведомляют об этом своего родителя, который уведомляет об этом своего родителя и т. Д.

Псевдокод подобен этому для любого элемента управления UI:

OnEvent(SomeEvent event)
{
   CallHandlersForEvent(event);
   if(HasParent && event.ContinueBubbling == true)
   {
       Parent.OnEvent(event);
   }
}

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

OnEvent(SomeEvent event)
{
    CallHandlersForEvent(event);
    NextControl = VisualTree.GetVisualParent(this);
    if(NextControl != null && event.ContinueBubbling == true)
    {
       NextControl.OnEvent(event);
    }
}
сокол
источник
+1 Псевдокод имеет большое значение для меня, спасибо! (Кстати, как и весь твой ответ.)
Приличный Дабблер,
@fireeyedboy: Добро пожаловать =)
Сокол
1

Первый ответ:

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

Второй ответ:

Нет, пузыри не обязательно связаны с какой-либо иерархией. То, как объекты представляются внутри или где-либо еще, на самом деле не имеет значения для правильной работы алгоритма. В идеале, когда событие всплывает, оно расширяется наружу от самого видимого элемента на экране до самого видимого элемента на экране.

Третий ответ:

Детали реализации могут сильно различаться в зависимости от того, как реализованы внутренние компоненты каждого (браузера). bubblingАлгоритм зависит от видеоряда на экране. Если инкапсулирующий элемент выше в иерархии наследования, чем внутренний элемент, то пузыри могут быть реализованы, например, с использованием стандартных механизмов наследования в языке. Но это не обязательно так: у вас может быть специальный механизм, который может интерпретировать как внутренние структуры, так и их видимость на экране, и распространять события в соответствии с алгоритмом, игнорируя при этом внутреннюю организацию.

blueberryfields
источник
1
Почему вы говорите: «пузыри не обязательно связаны с какой-либо иерархией». По моему это так. Без иерархии нет пузырей. Там должно быть какое-то дерево. Можете ли вы назвать пример пузырения без древовидной структуры? Ваш пример «от самого внутреннего до самого видимого элемента» - это просто визуальная иерархия.
Сокол
1
Конечно, вы можете интерпретировать это как иерархию, если вы действительно этого хотите. Я предпочитаю думать о нем как о слабосвязанном графике, который включает в себя некоторые визуальные и некоторые невизуальные элементы.
черничные
2
Но тогда аналогия с пузырями не удалась. Потому что на графике событие может быть направлено куда угодно, в то время как пузыри явно идут снизу вверх.
Сокол
Я думаю, вы больше не можете называть это пузырями в произвольном графе. Это должно называться «маршрутизацией событий», а затем imho.
Сокол
1
Я считаю, что Сокол делает некоторые справедливые замечания. Разумно думать о пузыре как о чем-то, что движется вверх (иерархия).
Приличный Дабблер