我有一个插件,每5分钟左右检查一个新帖子的RSS源,如果有,它会显示一个警告()。问题是,我担心如果用户打开多个窗口,那么当有新帖子时,会弹出数百万个警告说同样的事情。无论如何,一次只有一个“大脑”在运行吗?
提前致谢!
答案 0 :(得分: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的goons正在阻止批准不添加的插件Respect the Global Namespace
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"
]
答案 1 :(得分:2)
[编辑] 模块不是解决此问题的正确方法,因为代码仍会导入到每个窗口中,并且您设置的任何侦听器/定时器都将在每个窗口中运行。 您应该小心使用模块 - 所有定时器/回调必须在模块代码中设置(不仅仅使用模块中定义的观察者对象),您不应该使用任何对窗口的引用。模块。
正确的方法是 我希望编写一个XPCOM组件(在JS中)。它有点复杂,是的,我没有方便的链接解释如何做到这一点。一件事:使用XPCOMUtils实现它更容易,旧的文档将为您抛出大量的样板代码。