Новое представление о распространении события

Типичное видение модели распространения события, которое мы привыкли видеть в интернете - это модель всплытия события (bubbling) подобно пузырьку, или погружению (capturing) подобно “камню”.

Когда то я так же изучал тему распространения события, и давалась она мне не просто. Спустя время, набравшись опыта я вернулся к данной теме, «прошерстил» кучу статей, но до истины докопался.

Немного истории.

Когда-то две крупные компании Netscape и Microsoft выдвинули две модели поведения (концепции). Event capturing и Event bubbling.

«Ищите сложное в простом»

Разобравшись с тематикой я выдохнул и сказал «Наконец-то». Вы когда-нибудь задумывались как образуются звуки которые мы произносим? Основное четкое звучание происходит на выдохе. Но так же мы можем "выдавить" слова и на вдохе, что не очень удобно, но тем не менее можно.

Запомнили? Теперь обратно к концепциям.

Предложенная концепция компанией Netscape E.Capturing предполагает «ловить» событие когда оно находится в фазе «Погружения» т.е. событие движется в DOM дереве от корневого к целевому (на котором произошло событие).

MS предложила альтернативную версию E.Bubbling ловить событие на фазе “Всплытия» - при движении от целевого к корневому.

Затем пришёл дядя W3C и сказал: «Девочки не ссорьтесь. Каждый будет услышан» и объединил две концепции в одну.

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

Событие можно представить как некий бегунок-контроллер. Он пробегает по структуре DOM, опрашивая узлы на наличие подписки на событие. Подписка есть - имеешь право «говорить» (выполнить функцию).

Схематично это выглядит так:

Теперь вернёмся к звукам и дыханию.

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

И вся концепция W3C сохранилась - на вдохе мы издаём звук при крайней необходимости. Это будет не удобно, но я могу. Т.е. если я хочу озвучить что-то перед тем как начну основную речь ? например выразить эмоцию озарения, я сделаю это на вдохе, а потом выскажу чем именно меня осенило. Точно так же большинство подписок выполняется на всплытии(выдох), и только если нам нужно что-то выполнить перед тем как будет «озвучена основная речь» мы подписываемся с ключом useCapture, который сообщает, что событие надо ловить в фазе погружения(вдох).

useCapture - это есть само решение выразить эмоцию, которое мы передаём при подписке на событие. Каждое слово это одно из событий.

Из основной концепции утеряно ещё одно понятие target phase. Я готов озвучить свою версию в комментариях, после небольшой дискуссии на данную тему:

Понравилась ли статья? Интересна ли предложенная модель? Ну и ваш вариант что в данном представлении может быть целевой фазой?