如何在Firefox扩展中生成代码在计时器上执行

Mik*_*ike 4 firefox-addon

今天是我使用firefox扩展的第一天.

基本上我正在制作一个扩展,将在内部网络上用于检查Web服务器的新通知.

我使用mozilla页面上的向导进行骨架扩展,然后主要使用一些ajax代码编辑overlay.js.

我正在使用"load"事件监听器将setTimeout调用到我的ajax调用,然后使用setTimeouts循环.

问题似乎是在每个新的浏览器窗口上执行"load"事件侦听器.我只想要一个全局计时器来解决这个问题.

有任何想法吗?

更新:

我发现了这个:https://developer.mozilla.org/en/JavaScript_code_modules/Using ,这看起来像我想要的.问题是我无法弄清楚如何导入jsm文件.什么是目录结构?

更新:

在尝试这个时:

chrome.manifest用于

content   spt                 chrome/content/
skin      spt   classic/1.0   chrome/skin/
locale    spt   en-US         chrome/locale/en-US/


overlay   chrome://browser/content/browser.xul   chrome://spt/content/ff-overlay.xul
style chrome://global/content/customizeToolbar.xul chrome://spt/skin/overlay.css


resource mycontent chrome/content/
Run Code Online (Sandbox Code Playgroud)

前5行chrome/content/overlay.js

try{
    Components.utils.import("resource://spt/mycontent/ajax.jsm");
}catch(err){
    alert(err);
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

[异常... "组件返回失败代码:0x80040111(NS_ERROR_NOT_AVAILABLE)[nsIXPCComponents_Utils.import]" nsresult: "0x80040111(NS_ERROR_NOT_AVAILABLE)" 位置:"JS帧::铬://spt/content/overlay.js ::: :第2行"数据:否]

或者,如果我从chrome.manifest中删除资源别名,并在overlay.js的开头使用它

try{
    Components.utils.import("chrome://spt/content/ajax.jsm");
}catch(err){
    alert(err);
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

[异常... "组件返回失败代码:80070057(NS_ERROR_ILLEGAL_VALUE)[nsIXPCComponents_Utils.import]" nsresult: "80070057(NS_ERROR_ILLEGAL_VALUE)" 位置:"JS帧::铬://spt/content/overlay.js ::: :第3行"数据:否]

Fel*_*ing 5

是的,如果你有代码应该在windows之间共享(并且不应该在加载新窗口时执行)并且不需要访问chrome,请使用JavaScript代码模块.

您可以使用以下命令导入模块:

Components.utils.import("resource://youraddon/your_module.jsm");
Run Code Online (Sandbox Code Playgroud)

只要你resource在你的设置chrome.manifest.例如,如果你添加

resource youraddon modules/
Run Code Online (Sandbox Code Playgroud)

那么你必须存储文件/path/to/your/addon/modules/your_module.jsm.

附加说明:

  • 代码模块不必具有文件扩展名.jsm.你可以离开它.js.有时使用某些编辑器(以及语法突出显示等)可以更好地工作.
  • Afaik你不能setTimeout在模块中使用,因为它无法访问该window对象.我建议用nsITimer.