4

我有一个插件,每隔 5 分钟左右就会检查一个 rss 提要是否有新帖子,如果有,它会显示一个 alert()。问题是,我担心如果用户打开多个窗口,当有一个新帖子时,会弹出数百万条警报说同样的事情。无论如何,一次只有一个“大脑”在运行吗?

提前致谢!

4

2 回答 2

4

查找称为“Javascript 共享代码模块”或 JSM 的东西。

主要文档在这里:

https://developer.mozilla.org/En/Using_JavaScript_code_modules

插件中需要共享内存的每个 .js 文件都将使用以下行打开:

Components.utils.import("resource://xxxxxxxx/modules/[yourFilenameHere].jsm", com.myFirefoxAddon.shared);

上面的行打开 [yourFilenameHere].jsm 并将其导出的(见下文)函数和变量加载到 com.myFirefoxAddon.shared 对象中。加载的该对象的每个实例都将指向内存中的同一个实例。

请注意,如果您希望插件通过审核,您需要将所有代码写入 com.myFirefoxAddon.* 类型对象,因为 AMO 的暴徒正在阻止批准不尊重全球的插件命名空间

JSM 最大的警告是,您需要手动导出您希望对其余代码可用的每个函数......因为 JS 不支持公共/私有类型的东西,这让我觉得有点像穷人“公共”支持...在任何情况下,您都需要在 JSM 文件的某处创建一个 EXPORTED_SYMBOLS 数组,并命名您要导出的每个函数或对象,如下所示:

var EXPORTED_SYMBOLS = [
    /* CONSTANTS */
    "SERVER_DEBUG",
    "SERVER_RELEASE",

    "LIST_COUNTRIES",
    "LIST_TERRITORIES_NOEX",

    /* GLOBAL VARIABLES */
    /* note: primitive type variables need to be stored in the globals object */
    "urlTable",
    "globals",

    /* INTERFACES */
    "iStrSet",

    /* FUNCTIONS */
    "globalStartup",

    /* OBJECTS */
    "thinger",
    "myObject"

]
于 2010-01-08T21:12:42.773 回答
2

[已编辑]模块不是解决此问题的正确方法,因为代码仍将导入每个窗口,并且您设置的任何侦听器/计时器将在每个窗口中运行。 你应该小心使用模块——所有的定时器/回调必须在模块代码中设置(不仅仅是使用模块中定义的观察者对象)并且你不应该在模块中使用对窗口的任何引用.

这样做的正确方法是 我更喜欢编写一个 XPCOM 组件(在 JS 中)。这有点复杂,是的,我没有方便的链接来解释如何做到这一点。一件事:使用 XPCOMUtils 实现它更容易,较旧的文档会向您抛出大量样板代码。

于 2010-01-08T23:54:41.687 回答