2012-05-04 62 views
0

我写一个Firefox扩展,这是做两件事情(对这个问题的上下文中)访问的DOM API:在Firefox扩展

  1. 注册为某些DOM事件,即DOMContentLoadedDOMFrameContentLoaded
  2. 在回调事件时,访问DOM API并执行某些操作。

扩展名获取第一个事件(DOMContentLoadedDOMFrameContentLoaded),并且回调函数调用一些DOM API。我在观察,在调用从DOM API调用返回到我的扩展之前,另一个事件触发和我的回调函数被调用(我还没有能够缩小哪个特定的DOM API,因为我的扩展调用了一堆DOM蜜蜂)。

这甚至可能吗?顺便说一句,我在Windows上的Firefox 12上。我正在打印threadManager.isMainThread,并且在这两种情况下,都会在主线程上调用事件回调。

任何指针将不胜感激。

回答

0

JavaScript通常是单线程的。但是,这并不意味着函数不能重新进入(一个函数本身就是最明显的例子)。所以当另一个事件处理程序正在执行时,仍然可以调用事件处理程序AFAICT这可能发生在以下情况下:

  • 事件处理程序导致(直接或间接)生成和分派另一个事件。特别是,DOM操作会导致突变事件 - 这些事件的处理是同步发生的。例如。调用element.setAttribute()将创建DOMAttrModified事件,并且该事件将在element.setAttribute()返回之前处理,包括正在运行的事件处理程序。
  • 事件处理程序处于“已暂停”状态。如果打开一个模式对话框(如alert()),通常会发生这种情况 - 当前事件处理程序将等待此对话框关闭,而其他事件处理程序仍可被触发。不常见的情况是使用yield keyword in generators
  • 事件处理程序调用nsIThread.processNextEvent()。这个调用可能会执行与队列中下一个事件关联的事件处理程序。从技术上讲,这一点与之前的相同 - alert()将在内部调用nsIThread.processNextEvent()以确保在呼叫者被阻止时处理事件。
+0

感谢弗拉基米尔答案。我没有直接做任何你提到的事情。在我的扩展中,我正在注册DOMContentLoaded和DOMFrameContentLoaded。在我的测试案例中,我看到DOMContentLoaded被解雇,并且在我的处理程序中,我调用了一些DOM API来读取数据,并在返回之前调用DOMFrameContentloaded。我并不直接导致(至少是直接)导致这些事件在我处理过程中被调用。你知道在返回之前是否有任何DOM API在内部调用processNextEvent()吗?如果是的话,无论如何要压制这种行为? –

+0

不,AFAIK内部调用'processNextEvent()'的唯一东西是模态对话框和同步'XMLHttpRequest'。 –

+0

再次感谢。顺便说一句,我正在使用的测试页有内嵌的Java小程序,可以作为Firefox内部processNextEvent()的代码路径吗?我可以在Firefox代码库中验证这一点吗? –