有一个“大脑”在一个Firefox附加组件?
-
19-09-2019 - |
题
我有每5个小步舞或检查是否有一个新的职位RSS提要的插件,并且如果有一个,它显示一个警报()。问题是,我怕的是,如果用户打开多个窗口,当有一个新的职位的数以百万计的警报会弹出说同样的事情。反正是有只有一个“大脑”同时运行?
提前感谢!
解决方案
查找所谓的 “共享的Javascript代码模块” 或JSMs。
主文档是在这里:
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比较容易,年纪大的文件会抛出大量的样板代码对你实现它。