Firefox addon 从main.js打开页面并将数据传递给它

Firefox addon 从main.js打开页面并将数据传递给它,firefox-addon,firefox-addon-sdk,Firefox Addon,Firefox Addon Sdk,我试图创建一个非常简单的测试插件,它做一件事:从main.js打开一个html页面(位于数据文件夹中),然后将生成的JSON传递给它,它可以显示。我已经想出了一个非常复杂的方法,使用消息传递和克隆unsafeWindow.options来实现这一点,但必须有一个更简单的方法吗 另外,如果这是正确的方法,我很乐意使用“加载项页面”模块…您可以使用端口在其他视图中发送数据,如下所示: main.js // Create a menu panel var menu = panels.Panel({

我试图创建一个非常简单的测试插件,它做一件事:从main.js打开一个html页面(位于数据文件夹中),然后将生成的JSON传递给它,它可以显示。我已经想出了一个非常复杂的方法,使用消息传递和克隆unsafeWindow.options来实现这一点,但必须有一个更简单的方法吗


另外,如果这是正确的方法,我很乐意使用“加载项页面”模块…

您可以使用端口在其他视图中发送数据,如下所示:

main.js

// Create a menu panel
var menu = panels.Panel({
  contentURL: data.url("menu.html"),
  contentScriptFile: data.url("menu.js"),
});

// Your data
var data = {animal: 'panda'};
menu.port.emit('data', JSON.stringify(data));
self.port.on('data', function onReceiveData(data) {
    console.log(data);
});
menu.js

// Create a menu panel
var menu = panels.Panel({
  contentURL: data.url("menu.html"),
  contentScriptFile: data.url("menu.js"),
});

// Your data
var data = {animal: 'panda'};
menu.port.emit('data', JSON.stringify(data));
self.port.on('data', function onReceiveData(data) {
    console.log(data);
});

一个简单的模板,用于打开选项卡,然后在选项卡准备就绪时,附加内容脚本,传递一些参数,并设置消息处理程序:

插件模块中:

var resourceURL=require("sdk/self").data.url;
require("sdk/tabs").open({
    url:resourceURL("index.html"),
    onReady:function(tab){
        var worker=tab.attach({
            contentScriptFile:["support.js","content.js"].map(resourceURL),
            contentScriptOptions:{},    //parameters passed to content script
        });
        worker.port.on("ready",function(msgIn){
            worker.port.emit("acknowledge",msgOut);
        });
    }
});
在内容脚本中;要发送“就绪”消息并接收“确认”消息:


参数
url
和/或
contentScriptFile
的处理可能会发生更改,这样就可以在不需要require(“sdk/self”).data.url的情况下允许相对路径。不确定这是否只是猜测/提议,或者目前是否已实施;我还没查过


另外,我认为自从升级到australis UI后,
加载项页面被贬低了,并且没有起作用(即导航栏不再为诸如:addons之类的特殊URI隐藏)。

@EpokK我不知道你在说什么。你指责我抄袭的地方或对象是谁?我只是看了一下我的一些旧的指导代码(在我这么做之前就已经很旧了)。我很确定最初的提问者想要打开一个新的选项卡,并将内容文件(html、脚本)加载到选项卡中。此外,如果您打算将数据用于console.log以外的其他用途,则在通过
菜单.port.emit
发送之前,您可能应该
JSON.stringify(data)
。是的,我需要在普通选项卡中打开html页面,而不是在面板中。