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

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

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

Мое первое предположение: (B), как еще могли бы работать stopPropagation() и preventDefault()? Но, если подумать, это не является веским доказательством.

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

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

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

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

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

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

10
задан Community 23 May 2017 в 10:32
поделиться