Chrome扩展中的PageAction,背景页面和ContentScript之间的通信

时间:2013-02-27 17:22:16

标签: google-chrome-extension

据我所知,没有办法直接在Page Action和Cotent Script之间进行通信,所以我这样做:

page_action.html

chrome.extension.sendRequest(
    {to:"background",key:"color",val:"red"},
    function(response) {
        console.log(response) ;
    }
) ;

background.js

chrome.extension.onRequest.addListener(
    function(request,sender,sendResponse) {
        if (request.to == "background") {
            console.log("Request recieved to Background") ;
            request.to = "content" ;
            chrome.extension.sendRequest(request,function(response) {
                sendResponse(response) ;
            }) ;
        }
    }
) ;

content.js

(function(){
    // ...
    // Do something initial
    // ...
    // Now start to listen
    chrome.extension.onRequest.addListener(
        function(request,sender,sendResponse) {
            if (request.to == "content") {
                // Do something with request.key and request.val
                console.log("Request recieved to Content Script") ;
                sendResponse({status:'from content'}) ;
            }
        }
    ) ;
}()) ;

页面操作和背景之间的通信工作完美,但背景和内容脚本之间没有任何关系。我在这里错过了什么?如何正确沟通?最重要的是,还有另一种方式可以让您更直接地从Page Action到Content Script进行沟通吗?

1 个答案:

答案 0 :(得分:5)

幸运的是,有一种方法可以直接在Page ActionContent Script之间进行通信,这可能是tabs.sendMessage方法。

您可以从chrome.pageAction.onClicked或从简单id获取chrome.tabs.query

获得要发送消息的标签的ID后,只需从Page Action发送消息,如下所示:

<强> page_action.html

chrome.tabs.query({active:true,currentWindow:true},function(tabs){
  chrome.tabs.sendMessage(tabs[0].id,{message:"text"}, function(response){
    //If you need a response, do stuff with it here
  });
});

<强> content.js

chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
  //Do stuff here
  //sendResponse({message:"stuff"});
});

在旁注中,sendRequestonRequest已替换为Message对应方。