Is dispatchEvent синхронизация или асинхронная функция
Я пытаюсь написать обработчик событий для пользовательского события в WinJS. Я не слишком уверен, как это работает в IE -
Я создаю настраиваемое событие и отправляю его -
var eventObject = document.createEvent("CustomEvent");
eventObject.initCustomEvent("dropbomb", true, true, null);
this._element.dispatchEvent(eventObject);
Мой обработчик -
this._element.addEventListener("logtelemetry", function () {
console.log("boom");
});
Можно ли быть уверенным, что обработчик будет вызываться синхронно, а не позже? Если да, то что является доказательством.
Ответы
Ответ 1
Гарантируется синхронность, потому что:
Возвращаемое значение dispatchEvent указывает, будет ли какой-либо из слушателей, которые обрабатывали событие с именем preventDefault.
Поскольку возвращаемое значение указывает, был ли какой-либо из слушателей, которые обрабатывали событие с именем preventDefault, метод должен блокировать (не возвращать), пока все слушатели не будут выполнены, что является определением синхронного вызова.
Вышеприведенная цитата представляет собой выдержку из спецификации dispatchEvent в событиях уровня 2 DOM, в результате чего статус "Рекомендация" (стандарт) возвращается в Ноябрь 2000. Internet Explorer выполнил этот стандарт с по крайней мере IE 9.
Чтобы убедиться в этом, добавьте оператор console.log
сразу после вашего вызова .dispatchEvent
и обратите внимание, что "boom"
(из вашего обработчика событий) всегда регистрируется в первую очередь.
Ответ 2
Обработчик будет вызван немедленно, используя стандартную реализацию WinJS.Utilities.eventMixin
. Нет отсрочки.
Ваши индивидуальные обработчики могут выбрать отложенную работу с помощью setTimeout
/setImmediate
/setInterval
/requestAnimationFrame
или какой-либо другой выполненной по заказу реализации.
Обратите внимание, что если вы говорите о событиях DOM, прося их пузыриться по дереву элементов DOM - что я не на 100% понятен (может быть, кто-то может добавить это конкретное здесь)