【问题标题】:How to send message from panel to page-mod's content script directly?如何将消息从面板直接发送到 page-mod 的内容脚本?
【发布时间】:2013-08-01 08:41:40
【问题描述】:

如果 Firefox 插件中有如下代码 sn-p:

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”发送消息?

【问题讨论】:

    标签: javascript firefox-addon-sdk


    【解决方案1】:

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

    1. 维护每个选项卡的消息端口列表。
    2. 只要您想发送消息,就向所有列出的端口发送消息。

    以下代码用于维护端口列表:

    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
    });
    

    【讨论】:

    • 是的,我已经尝试过这种将消息发送到活动选项卡的解决方案。但它不起作用。所以我想寻求一个可以像 chrome 版本一样直接向内容脚本发送消息的解决方案在问题中。
    • @penkzhou 答案适用于您提供的示例。我在您的问题中没有看到任何特定于 Chrome 的内容,如果您想在内容脚本中使用 postMessage,请使用 document.defaultView.postMessage('some data', '*')document.defaultView.addEventListener('message', function(event) { /* do something with event.data */ });
    • 我发现了一些有用的东西here。谢谢。
    • 不应该是var index = ports.indexOf(worker.port);,还是有一个我不知道的全局port
    • @RobW 如何使用上述方法从内容脚本向 main.js 发送消息?
    猜你喜欢
    • 2013-07-27
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    相关资源
    最近更新 更多