我有一个插件,每隔 5 分钟左右就会检查一个 rss 提要是否有新帖子,如果有,它会显示一个 alert()。问题是,我担心如果用户打开多个窗口,当有一个新帖子时,会弹出数百万条警报说同样的事情。无论如何,一次只有一个“大脑”在运行吗?
提前致谢!
我有一个插件,每隔 5 分钟左右就会检查一个 rss 提要是否有新帖子,如果有,它会显示一个 alert()。问题是,我担心如果用户打开多个窗口,当有一个新帖子时,会弹出数百万条警报说同样的事情。无论如何,一次只有一个“大脑”在运行吗?
提前致谢!
查找称为“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"
]
[已编辑]模块不是解决此问题的正确方法,因为代码仍将导入每个窗口,并且您设置的任何侦听器/计时器将在每个窗口中运行。 你应该小心使用模块——所有的定时器/回调必须在模块代码中设置(不仅仅是使用模块中定义的观察者对象)并且你不应该在模块中使用对窗口的任何引用.
这样做的正确方法是 我更喜欢编写一个 XPCOM 组件(在 JS 中)。这有点复杂,是的,我没有方便的链接来解释如何做到这一点。一件事:使用 XPCOMUtils 实现它更容易,较旧的文档会向您抛出大量样板代码。