0

据我了解,Page Action 和 Cotent Script 之间无法直接通信,所以我这样做了:

page_action.html 中

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

后台.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 和 Background 之间的通信完美无缺,但 Background 和 Content Script 之间没有任何反应。我在这里想念什么?如何正确沟通?最重要的是,是否有另一种方式可以让通信更直接地从页面操作到内容脚本?

4

1 回答 1

5

幸运的是,有一种方法可以直接在 aPage Action和 a之间进行通信Content Script,那就是通过tabs.sendMessage方法。

您可以idchrome.pageAction.onClicked一个简单的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
  });
});

内容.js

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

在旁注中,sendRequestonRequest已被其Message同行所取代。

于 2013-02-28T03:28:17.617 回答