在Firefox扩展中访问DOM API

时间:2012-05-04 20:17:10

标签: firefox-addon

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

  1. 注册某些DOM事件,即DOMContentLoadedDOMFrameContentLoaded
  2. 在回调事件时,访问DOM API并执行某些操作。
  3. 扩展获取第一个事件(DOMContentLoadedDOMFrameContentLoaded),并且回调函数调用一些DOM API。我正在观察,在调用从DOM API调用返回到我的扩展之前,另一个事件触发和我的回调函数被调用(我无法缩小哪个特定的DOM API,因为我的扩展调用了一堆DOM的API)。

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

    任何指针都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

JavaScript通常是单线程的。但是,这并不意味着无法重新输入函数(函数调用本身就是最明显的例子)。因此,在执行另一个事件处理程序时仍可以调用事件处理程序。 AFAICT可以在以下条件下发生:

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