【问题标题】:Is dispatchEvent a sync or an async functiondispatchEvent 是同步函数还是异步函数
【发布时间】:2013-03-07 17:27:32
【问题描述】:

我正在尝试为 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 我想我不知道。阅读文档后,行为确实不清楚。
  • @Mathletics,我回答的重点...... :)
  • @gdoron 是的,我的评论在您的回答之前。通过犯错和被纠正,我学到了,现在更聪明了。嘘! :)

标签: javascript dom-events windows-store-apps winjs


【解决方案1】:

保证是同步的,因为:

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

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

以上引文摘自the dispatchEvent specification in DOM Level 2 Events,早在2000年11月就获得了“推荐”状态(一种标准)。Internet Explorer 已遵守此标准since at least IE 9

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

【讨论】:

  • +1 感谢您让我知道我错了!
  • 好答案。仅供参考,不推荐使用 createEvent/initCustomEvent 以支持 CustomEvent() 构造函数developer.mozilla.org/en-US/docs/Web/API/CustomEvent/…
  • 这正是我发现它是同步的,在调用后立即输入console.log 并立即期待结果,太棒了!!
【解决方案2】:

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2017-06-22
  • 1970-01-01
相关资源
最近更新 更多