弹出脚本和内容脚本无法通信?

时间:2014-06-02 10:47:59

标签: javascript jquery google-chrome google-chrome-extension

我的问题是,我似乎无法从我的popup.js传递到我的content.js的消息chrome.extension.sendMessage("on");

popup.js中的代码:

function click(e) {
    if ( e.target.id == "green"){
        chrome.extension.sendMessage("start");
        console.info("oN");
        return;
    }

    if ( e.target.id == "red"){
        chrome.extension.sendMessage("stop");
        console.info("oFF");
        return;
    }
}

当我向代码添加一个监听器时,popup.js会很好地收到消息。但我的content.js似乎无法得到它。

来自content.js的代码:

chrome.extension.onMessage.addListener(
    function(request, sender, sendResponse) {
        console.info("ok");
    }
);

清单:

"content_scripts": [
{
    "matches": ["<all_urls>"],
    "js": ["content.js"],
    "run_at": "document_end"
}
],

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

chrome.extension.sendMessage是一个非规范名称。

旧的,已弃用的API为chrome.extension.sendRequest,新API为chrome.runtime.sendMessage,事件同样为chrome.runtime.onMessage


也就是说,您的问题是尝试向内容脚本发送消息。 chrome.runtime.sendMessage向分机自己的网页发送消息;内容脚本不被认为是这样的。

要向内容脚本发送消息,您必须使用chrome.tabs.sendMessage API call标签tabId

假设您想要当前的可见标签:

function click(e) {
    if ( e.target.id == "green"){
        chrome.tabs.query({active:true, currentWindow: true}, function(tabs){
            chrome.tabs.sendMessage(tabs[0].id, "start");
        });
        console.info("oN");
        return;
    }
    /* ... */
}

如果您想要所有标签,只需将{}传递给query并重复tabs

最后,请注意content scripts inject time quirks