使用chrome扩展,如何使用长期连接(端口)将消息从后台脚本传递到内容脚本?

时间:2016-04-13 20:38:29

标签: javascript google-chrome-extension

这是我的后台脚本。我可以通过弹出脚本向它发送消息。换句话说,控制台记录"你好"在后台页面。

// background.js

chrome.runtime.onConnect.addListener(function(port){

    port.onMessage.addListener(function(msg) {

        if (msg.greeting == "hello") {

            var port = chrome.tabs.connect(0, {name: "mycontentscript"});

            port.postMessage({greeting:"hello"});

            console.log('hello');
        }
    });
});

但是,我无法从后台脚本获取消息到我的内容脚本。这是我的内容脚本。警报未显示。

// content.js

var port = chrome.runtime.connect({name:"mycontentscript"});

port.onMessage.addListener(function(message,sender){

    if (message.greeting == "hello") {

        alert('hello');
    }
});

我做错了什么?感谢。

3 个答案:

答案 0 :(得分:2)

在创建端口后,您似乎忘记了在内容脚本中建立连接,只是postMessage,并在后台页面的runtime.onConnect.addListener()中重用该端口。

background.js

chrome.runtime.onConnect.addListener(function(port) {
    port.onMessage.addListener(function(msg) {
        if (msg.greeting == "hello") {
            port.postMessage({ greeting: "hello" });
            console.log('hello');
        }
    });
});

content.js

var port = chrome.runtime.connect({ name: "mycontentscript" });
port.postMessage({greeting: "hello"});
port.onMessage.addListener(function(message) {
    if (message.greeting == "hello") {
        alert('hello');
    }
});

答案 1 :(得分:0)

我不知道我的情况是否与您的情况完全一样,但我还写了一个Chrome扩展程序,其中后台页面向客户端发送消息。

在我的content script中,我执行以下操作:

chrome.runtime.sendMessage('requestData', this.updateData.bind(this));

在我的background script中,我有:

chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) {
    sendResponse({
        messages : inboxMessages,
        userId   : user_id
    });
});

然后我的内容脚本收到消息:

this.updateData = function(data) {
    //...
}

希望对你有帮助!

答案 2 :(得分:0)

在background.js中:

chrome.runtime.onConnect.addListener(function(port){//here you've got the port

    port.onMessage.addListener(function(msg) {

        if (msg.greeting == "hello") {
//and here you're making a new, unneeded port, for which nobody is listening. 
//Use the one you've got.
            var port = chrome.tabs.connect(0, {name: "mycontentscript"});

            port.postMessage({greeting:"hello"});

            console.log('hello');
        }
    });
});

使用chrome.tabs.connect从后台启动连接,并将chrome.runtime.onConnect侦听器放在选项卡的content.js中,或者像使用的那样从选项卡启动连接,并使用在background的onConnect侦听器。只需删除

即可

var port=chrome.tabs.connect(0, {name: "mycontentscript});

线。