我正在编写一个Firefox扩展,它从命令行进行自定义切换,并在cmdline.js
目录中的components
内设置变量,我们将调用变量switchDetected
这是一个布尔值。现在基于此变量,我希望在overlay.js
目录中的chrome/content
文件中执行操作。
我遇到的问题是我似乎无法访问switchDetected
中components/cmdline.js
中声明的变量chrome/contents/overlay.js
。
我尝试了很多方法,但似乎没什么用。所以我只是想知道是否有人知道如何实现这一目标。
答案 0 :(得分:4)
在叠加层中加载的脚本在浏览器窗口的上下文中运行 - 其全局变量存储为与浏览器对应的window
对象的属性。如果您打开第二个浏览器窗口,则相同的脚本将再次加载并在新浏览器窗口的上下文中运行 - 它将具有不同的全局变量。另一方面,包含XPCOM组件的脚本只加载一次,并且它们具有未绑定到窗口的独立上下文。因此,无法直接从浏览器窗口访问它们的全局变量,就像两个浏览器窗口无法直接访问其他全局变量一样。
相反,浏览器窗口应该使用通常的方法与XPCOM组件通信:获取组件实例并调用其方法。如果您不想为此定义自己的界面(您可能没有),您可以use a trick,如下所示:
CommandLineHandler.prototype = {
handle: function(commandLine) {...},
get helpInfo() {...},
isSwitchDetected: function()
{
return switchDetected;
},
get wrappedJSObject()
{
return this;
},
QueryInterface: XPCOMUtils.generateQI(["nsICommandLineHandler"]);
};
wrappedJSObject
属性确保您的组件可以解包 - 其所有方法和属性都可以访问,而不仅仅是界面中定义的方法和属性。因此,您的叠加脚本需要执行以下操作:
var cmdLineHandler = Components.classes["@myself.com/my-command-line-handler;1"]
.getService()
.wrappedJSObject;
var switchDetected = cmdLineHandler.isSwitchDetected();