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

30

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

我能确定处理程序会同步调用而不是以后调用吗?如果是,那么有什么证据。


@Mathletics,为什么?如果您手动分派事件,为什么它不会立即触发? - gdoron
@gdoron 我想我不知道。阅读文档后,这个行为真的不是很清楚。 - Evan Davis
@Mathletics,我的回答的重点是... :) - gdoron
1
@gdoron 是的,我的评论是在你的回答之前发表的。通过犯错误并得到纠正,我学到了东西,现在更明智了。万岁! :) - Evan Davis
2个回答

44

这是同步的保证,因为:

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

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

上述引文摘自DOM Level 2 Events中的dispatchEvent规范,该规范已于2000年11月获得“推荐”状态(标准)。Internet Explorer自至少IE 9以来一直遵守此标准。

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


+1 非常感谢你友善地让我知道我错了! - gdoron
好的回答。仅供参考,createEvent/initCustomEvent已被弃用,建议使用CustomEvent()构造函数 https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent - Drenai
这正是我发现它是同步的方式,只需在调用后立即放置 console.log 并期望立即得到结果,太神奇了!! - windmaomao

2
处理程序将立即被调用,使用默认实现的WinJS.Utilities.eventMixin。没有延迟。
您的个人处理程序可以选择使用setTimeout/setImmediate/setInterval/requestAnimationFrame或其他自定义实现来执行延迟工作。
请注意,如果您正在谈论DOM事件,请要求它们冒泡到DOM元素树上 - 我不是100%清楚(也许有人可以在此处添加具体内容)。

期待看到 setImmediate 规范成为标准! - Augustin Riedinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接