我有每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比较容易,年纪大的文件会抛出大量的样板代码对你实现它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top