0

我正在编写一个 Firefox 扩展,它正在做两件事(对于这个问题的上下文):

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

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

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

任何指针将不胜感激。

4

1 回答 1

0

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

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