dispatchEvent是一个同步函数还是一个异步函数?

Is dispatchEvent a sync or an async function

本文关键字:一个 函数 异步 同步 dispatchEvent      更新时间:2023-09-26

我正在尝试为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");
});

我能确定处理程序将被同步调用,而不是在稍后的时间调用吗?

保证是同步的,因为:

dispatchEvent的返回值指示是否有处理preventDefault事件的监听器

由于返回值指示处理事件的任何侦听器是否调用了preventDefault,因此该方法必须阻塞(而不是返回),直到所有侦听器完成执行,这就是同步调用的定义。

以上引用摘自DOM Level 2 Events中的dispatchEvent规范,该规范早在2000年11月就达到了"推荐"状态(一种标准)。Internet Explorer至少从ie9开始就遵循此标准。

为了自己验证,在.dispatchEvent调用之后立即添加console.log语句,并注意"boom"(来自您的事件处理程序)总是首先记录。

处理程序将立即调用,使用WinJS.Utilities.eventMixin的默认实现。没有延期。

您的单个处理程序可以选择通过使用setTimeout/setImmediate/setInterval/requestAnimationFrame或其他自定义滚动实现来执行延迟工作。

请注意,如果您谈论的是DOM事件,请它们冒泡DOM元素树—我不是100%清楚(也许有人可以在这里添加具体内容)