在Firefox扩展中访问全局变量

4
我正在编写一个Firefox扩展程序,该程序从命令行中获取自定义开关,并在我的cmdline.js文件中设置一个变量,我们称之为switchDetected,它是一个布尔类型的变量。现在,基于这个变量,我希望在我的chrome/content目录下的overlay.js文件中执行一些操作。但是我的问题在于,我无法从chrome/contents/overlay.js文件中访问在components/cmdline.js文件中声明的switchDetected变量。我已经尝试了多种方法,但似乎都无法实现。请问是否有人知道如何实现这个功能?

通常情况下,我在发布问题后10分钟内就找到了解决方案。解决方案是使用Javascript代码模块。以下是链接:https://developer.mozilla.org/en/JavaScript_code_modules/Using我使用getter和setter而不是将要更改的变量公开,因为似乎公开变量本身无法工作,但函数可以,这很好。我希望这个方法能够帮助其他人节省无尽的搜索时间。 - Kraken18
使用JavaScript模块也是另一种可能性 - 但如果您已经有了XPCOM组件,您可以直接与其通信。请参阅我的答案。 - Wladimir Palant
1个回答

4
一个在浮层中加载的脚本运行在浏览器窗口的上下文中,它的全局变量被存储为与浏览器相应的window对象的属性。如果打开第二个浏览器窗口,同样的脚本将再次加载并在新浏览器窗口的上下文中运行,它将有不同的全局变量。另一方面,包含XPCOM组件的脚本仅加载一次,并且它们具有独立的上下文,不绑定到窗口。因此,它们的全局变量不能直接从浏览器窗口访问,就像两个浏览器窗口不能直接访问彼此的全局变量一样。
相反,浏览器窗口应该使用通常的方法与XPCOM组件通信:获取组件实例并调用其方法。如果你不想为此定义自己的接口(你可能不想这样做),你可以使用一个技巧,类似于以下内容:使用一个技巧
CommandLineHandler.prototype = {
  handle: function(commandLine) {...},
  get helpInfo() {...},
  isSwitchDetected: function()
  {
    return switchDetected;
  },
  get wrappedJSObject()
  {
    return this;
  },
  QueryInterface: XPCOMUtils.generateQI(["nsICommandLineHandler"]);
};
< p > wrappedJSObject 属性确保您的组件可以被解包 - 然后所有其方法和属性都将变得可访问,而不仅仅是在接口中定义的那些。因此,您的覆盖脚本需要执行以下操作:

var cmdLineHandler = Components.classes["@myself.com/my-command-line-handler;1"]
                               .getService()
                               .wrappedJSObject;
var switchDetected = cmdLineHandler.isSwitchDetected();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接