通过postMessage()进行通信

时间:2012-08-07 16:22:20

标签: javascript firefox-addon firefox-addon-sdk

我正在开发Firefox扩展,我需要能够在插件脚本和内容脚本之间进行通信。我有一个工作方向:将脚本的URL从插件脚本传递到内容脚本。但是,我也需要能够朝着相反的方向前进。我的main.js文件如下所示:

var data = require("self").data;
var pageMod = require("page-mod");
pageMod.PageMod({
  include: "https://trello.com/board/*",
  contentScriptWhen: 'end',
  contentScriptFile: data.url("scrumello_beta.user.js"),
  onAttach: function(worker) {
    worker.postMessage(data.url("scrumello_beta.js"));
    worker.on("message", function(addonMessage)
    {
        console.log(addonMessage);
    });
  }
});

在客户端脚本中,我有以下方法:

    function OpenProcess(SCRNumber)
    {
        self.postMessage(SCRNumber); 
    }

但是,调用此方法时,我收到以下错误:

Timestamp: 8/7/2012 12:15:58 PM
Error: NS_ERROR_XPC_NOT_ENOUGH_ARGS: Not enough arguments [nsIDOMWindow.postMessage]
Source File: resource://jid0-3mulsijczmtjeuwkd5npayasqf8-at-jetpack/scogan-3/data/scrumello_beta.js
Line: 1038

这可以防止worker.on(“message”......事件被触发。据我所知,postMessage只接受一个参数,所以任何帮助都会受到赞赏。

编辑: 我已将postMessage调用更改为

self.postMessage(SCRNumber, "*"); 

我把它包装在console.log中,两者都被打印出来,所以我不得不假设这条消息实际上已经发布了。但是,main.js中的事件处理程序从不接收消息,因为我在那里的console.log从未打印过。

1 个答案:

答案 0 :(得分:1)

我是这样做的。 (请注意,我从未使用过self.postmessage

Addon脚本(main.js)到内容脚本通信:

contentPage = pageMod.PageMod({
  onAttach: function(worker) {

    // Post a message directly to the content script
    worker.postMessage("any thing you want to respond");

    // Depending on the message, respond with different data
    worker.port.on('getFact', function() {
      worker.postMessage("any thing you want to respond");
    });
    worker.port.on('getEnabled', function() {
      worker.postMessage("any thing you want to respond");
    });
  }
});

-

这是响应加载项脚本的内容脚本:

// Get data from the addon script
self.on('message', function(msg) {
  // Do something depending on the message passed
});

-

最后,内容脚本可以像这样与附加脚本进行通信:

self.port.emit("message to send to add-on script")

以上代码将触发main.js中的worker.port.on代码。

相关问题