如何直接从面板发送消息到page-mod的内容脚本?

时间:2013-08-01 08:41:40

标签: javascript firefox-addon-sdk

如果Firefox插件中有一个代码段,如下所示:

var pagemod = PageMod({
    include: ['*'],
    contentScriptFile: [data.url('content.js')]
});

panel = require("sdk/panel").Panel({
  width: 322,
  height: 427,
  contentURL: data.url("main.html"),
  include:["http://*/*","https://*/*"],
  contentScriptFile: [data.url('panel.js')]  
});

我在Chrome扩展程序中找到了一些示例代码。他们使用window.parent.postMessage(message, "*")发送消息并使用window.addEventListener("message",function (e) {//do something}来接收消息。 如何直接在Firefox插件中将“panel.js”的消息发送到“content.js”?

1 个答案:

答案 0 :(得分:1)

解决方案的概念与this answer非常相似:

  1. 维护每个标签的消息端口列表。
  2. 每当您想发送消息时,请向所有列出的端口发送消息。
  3. 以下代码用于维护端口列表:

    var ports = [];
    var pagemod = PageMod({
        include: ['*'],
        contentScriptFile: [data.url('content.js')],
        onAttach: function(worker) {
            ports.push(worker.port);
            worker.on('detach', function() {
                var index = ports.indexOf(worker.port);
                if (index !== -1) ports.splice(index, 1);
            });
        }
    });
    

    现在,只要您想从panel.js发送消息,只需使用:

    // panel.js
    self.port.emit('message-to-tabs', 'example of message');
    

    创建面板后,必须在主脚本中处理消息:

    panel = require('sdk/panel').Panel({
        width: 322,
        height: 427,
        contentURL: data.url('main.html'),
        include: ['http://*/*', 'https://*/*'],
        contentScriptFile: [data.url('panel.js')]  
    });
    panel.port.on('message-to-tabs', function(message) {
        for (var i=0; i<ports.length; i++) {
            ports[i].emit('message-to-tab', message);
        }
    });
    

    在标签的内容脚本(content.js)中,您可以收听此事件并按如下方式处理:

    self.port.on('message-to-tab', function(message) {
        // Do something with message
    });