2013-03-07 158 views
10

我想在WinJS中为自定义事件编写事件处理函数。我也不太清楚如何工作的IE浏览器 - 我创建一个自定义事件,并派遣了 -dispatchEvent是同步还是异步函数

var eventObject = document.createEvent("CustomEvent"); 
eventObject.initCustomEvent("dropbomb", true, true, null); 
this._element.dispatchEvent(eventObject); 

我的处理程序是 -

this._element.addEventListener("logtelemetry", function() { 
       console.log("boom"); 
}); 

我可以肯定,该处理器将被调用同步,而不是在以后的时间?如果是这样,那么证明是什么。

+0

@Mathletics,为什么?如果你手动发送事件,为什么它不会立即触发? – gdoron 2013-03-07 17:33:31

+0

@gdoron我想我不知道。在阅读文档时,行为真的不清楚。 – Mathletics 2013-03-07 17:37:15

+0

@Mathletics,我的答案的重点...... :) – gdoron 2013-03-07 17:38:19

回答

1

处理程序将立即被调用,使用WinJS.Utilities.eventMixin的默认实现。 Theres不推迟。

个别处理可以选择使用setTimeout/setImmediate/setInterval/​​,或其他自定义卷执行办延期工作。

请注意,如果你是在谈论DOM事件,要求他们冒泡的DOM元素树 - 我不是100%清楚(也许有人可以在这里补充特定)

+0

期待看到['setImmediate'](https://developer.mozilla.org/en/docs/Web/API/Window/setImmediate)规范作为标准! – 2016-11-23 17:16:19

12

它保证是同步因为:

dispatchEvent的返回值指示处理该事件的任何 侦听器名为preventDefault。

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

以上引用摘自the dispatchEvent specification in DOM Level 2 Events,它于2000年11月实现了“推荐”状态(标准).Internet Explorer已符合此标准since at least IE 9

要验证你自己,你.dispatchEvent调用后立即添加console.log声明,并注意"boom"(从事件处理程序)总是先登录。

+0

+1谢谢你,请让我知道我错了! – gdoron 2014-04-08 17:31:40

+0

很好的答案。仅供参考,createEvent/initCustomEvent不赞成使用CustomEvent()构造函数https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent – Ryan 2017-12-29 16:09:38

相关问题