内容脚本(页面mod)和弹出窗口(面板)之间的通信

时间:2013-06-04 09:23:58

标签: javascript firefox firefox-addon-sdk

我目前正在使用Firefox添加sdk进行Firefox扩展,我尝试在内容脚本(页面模式)和弹出窗口(面板)之间进行通信,但无济于事。

我正在使用Erik Vold的toolbar button。这是我的代码:

var tbb = require('toolbarbutton').ToolbarButton({
    id: 'from-us_button',
    label: 'from-us',
    image: data.url('img/on.png'),
    panel: panel

});

var pageMod = require('page-mod').PageMod({
  include: "*",
  contentScriptFile: [
    data.url('recuperation.js')
    ],
  contentScriptWhen : "end",
  attachTo: ["existing", "top"]

});


var panel = require('panel').Panel({
    width: 200,
    height: 500,
    contentURL: data.url('popup.html')

});

我的popup.html包含:

<script type="text/javascript" src="popup.js"></script>

我想将recuperation.js中的变量传递给popup.js,我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

在你的popup.js中你应该有一个'addon'全局对象,它允许你将消息发送回main.js.这在此处记录:

https://addons.mozilla.org/en-US/developers/docs/sdk/latest/modules/sdk/panel.html#Styling%20Trusted%20Panel%20Content

答案 1 :(得分:1)

您需要将 popup.js 附加到您的面板:

var panel = require('panel').Panel({
    ...
    contentURL: data.url('popup.html'),
    contentScriptFile:  require("self").data.url("popup.js")  //or data.url() if you already have it set
});

通过<script>标记加载的脚本缺少使用self.port的必要权限。

然后为你的page-mod worker添加一个监听器,并将消息转发给你的面板,如下所示:

var panel = ...
...
require('page-mod').PageMod({
  include: "*",
  contentScriptFile: [
    data.url('recuperation.js')
  ],
  contentScriptWhen : "end",
  attachTo: ["existing", "top"],
  onAttach: function(worker){
    worker.port.on("recuperation-to-panel",function(msg){
        panel.port.emit("recuperation-to-panel",msg);
    });    
  }
});

然后从 recuperation.js

self.port.emit("recuperation-to-panel",msg);

*编辑:应为worker.port.on;不是pageMod.port.on。遗憾。