23

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

我可以确定处理程序将被同步调用,而不是稍后调用吗?如果是这样,那么证据是什么。

4

2 回答 2

38

它保证是同步的,因为:

dispatchEvent 的返回值指示是否有任何侦听器处理了称为 preventDefault 的事件。

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

以上引用摘自DOM Level 2 Events 中的 dispatchEvent 规范,该规范早在 2000 年 11 月就获得了“推荐”状态(一种标准)。Internet Explorer至少从 IE 9 开始就符合该标准。

要自己验证,请在调用console.log后立即添加一条语句,.dispatchEvent并注意"boom"(来自您的事件处理程序)始终首先记录。

于 2014-04-07T23:20:40.283 回答
1

处理程序将立即被调用,使用WinJS.Utilities.eventMixin. 没有延期。

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

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

于 2013-03-08T03:26:59.220 回答