Выполняется ли обработка событий javascript внутри или вне потока программы?

Этот вопрос связан с обработкой событий Javascript и управлением потоком, но это на один шаг дальше. Вопрос, который остается без ответа, заключается в следующем: когда событие запускается и управление возвращается браузеру, браузер может решить сначала обработать другие события (уволен другими скриптами или действием пользователя) (A), или он будет всегда обрабатывать мое событие напрямую (В)?

Does javascript event handling occur outside (A) or inside (B) the program flow? Вопрос важен, потому что в случае (B) вы можете положиться на то, что ничего не изменилось между запуском события и обработчиком события, тогда как (A) не дает никаких гарантий.

Мое первое предположение - (B), как еще можно остановить функции Propagation() и preventDefault()? Но, размышляя, это не является серьезным доказательством.

Реальный пример этой проблемы. Я изменяю богатый текстовый редактор (hallo), и я хочу, чтобы у него были эти спецификации:

  • щелчок по редактируемому тексту (#txt) активирует редактор, а нажатие вне #txt отключит его. Hallo использует размытие и фокус на #txt для достижения этого.
  • Активация редактора открывает панель инструментов, mousedown на панели инструментов (но не на кнопке) устанавливает флаг, который предотвращает деактивацию редактора размытия на #txt. Панель инструментов вернет фокус на #text.
  • mousedown на кнопке на панели инструментов также должен предотвратить дезактивацию редактора, но он должен сначала дождаться события клика, выполнить его действие, а затем вернуть фокус на #txt. Некоторые действия являются немедленными (жирным или курсивом), в то время как другим нужен дополнительный пользовательский ввод (выбор из выпадающего списка).
  • Некоторые из этих кнопок открывают диалог.
  • ... И я хочу, чтобы все эти элементы (редактор, панель инструментов, диалог) были модульными и легко расширяемый.

В большинстве случаев, когда вы закрываете диалог, вы хотите, чтобы фокус возвращался в #txt. Но в том случае, когда открывается диалоговое окно и вы нажимаете на другое место на странице, редактор закрывается и вызывает панель инструментов, в том числе и диалоговое окно для закрытия. Если в этом случае диалог вернет фокус в редактор, он снова активирует редактор.

Насколько я понимаю, порядок обработки событий по крайней мере детерминирован. Невозможно, чтобы какое-то событие получало задержку, а другие обрабатывались ранее. Это то, что подразумевается под "синхронным". Исключение составляют, конечно, такие события, как загрузка файла.

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

Итак, мой вывод: 1) да, это предсказуемо, но 2) для реализации этого требуется сложная архитектура.

Ответ 1

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

Кажется, это то, что вы пытаетесь описать, и в этом случае (B) гарантируется.

Соответствующий источник: http://www.w3.org/TR/DOM-Level-3-Events/#event-flow