我正在编写一个Firefox扩展,它正在做两件事(对于这个问题的上下文):
DOMContentLoaded
和DOMFrameContentLoaded
。扩展获取第一个事件(DOMContentLoaded
或DOMFrameContentLoaded
),并且回调函数调用一些DOM API。我正在观察,在调用从DOM API调用返回到我的扩展之前,另一个事件触发和我的回调函数被调用(我无法缩小哪个特定的DOM API,因为我的扩展调用了一堆DOM的API)。
这甚至可能吗?顺便说一下,我在Windows上的Firefox 12上。我正在打印threadManager.isMainThread
,并且在两种情况下都在主线程上调用事件回调。
任何指针都将受到高度赞赏。
答案 0 :(得分:0)
JavaScript通常是单线程的。但是,这并不意味着无法重新输入函数(函数调用本身就是最明显的例子)。因此,在执行另一个事件处理程序时仍可以调用事件处理程序。 AFAICT可以在以下条件下发生:
element.setAttribute()
将创建DOMAttrModified
事件,该事件将在element.setAttribute()
返回之前处理,包括运行事件处理程序。alert()
),通常会发生这种情况 - 当前事件处理程序将等待关闭此对话框,同时仍可触发其他事件处理程序。一个不太常见的情况是使用yield
keyword in generators。alert()
将在内部调用nsIThread.processNextEvent()
以确保在调用者被阻止时处理事件。