Google chrome extension Chrome扩展中PageAction、后台页面和ContentScript之间的通信

Google chrome extension Chrome扩展中PageAction、后台页面和ContentScript之间的通信,google-chrome-extension,Google Chrome Extension,据我所知,页面操作和Coent脚本之间无法直接通信,因此我这样做: 在page_action.html中: chrome.extension.sendRequest( {to:"background",key:"color",val:"red"}, function(response) { console.log(response) ; } ) ; 在background.js中 chrome.extension.onRequest.addListene

据我所知,页面操作和Coent脚本之间无法直接通信,因此我这样做:

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) ;
            }) ;
        }
    }
) ;
(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'}) ;
            }
        }
    ) ;
}()) ;
chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
  //Do stuff here
  //sendResponse({message:"stuff"});
});
content.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) ;
            }) ;
        }
    }
) ;
(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'}) ;
            }
        }
    ) ;
}()) ;
chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
  //Do stuff here
  //sendResponse({message:"stuff"});
});

页面操作和背景之间的通信工作得很好,但背景和内容脚本之间什么也没有发生。我错过了什么?如何正确地相互沟通?最重要的是,有没有另一种方法可以让交流更直接地从页面动作到内容脚本?

幸运的是,有一种方法可以直接在
页面动作
内容脚本
之间进行交流,这将是通过该方法实现的

您可以从chrome.tabs.query中或从chrome.tabs.query中获取
id

一旦您有了要向其发送消息的选项卡的ID,只需通过
页面操作
发送消息,如下所示:

page\u 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.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) ;
            }) ;
        }
    }
) ;
(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'}) ;
            }
        }
    ) ;
}()) ;
chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
  //Do stuff here
  //sendResponse({message:"stuff"});
});

另一方面,
sendRequest
onRequest
已被它们的对应项所取代。

幸运的是,有一种方法可以在
页面操作
内容脚本
之间直接通信,这将通过该方法实现

您可以从chrome.tabs.query中或从chrome.tabs.query中获取
id

一旦您有了要向其发送消息的选项卡的ID,只需通过
页面操作
发送消息,如下所示:

page\u 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.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) ;
            }) ;
        }
    }
) ;
(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'}) ;
            }
        }
    ) ;
}()) ;
chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
  //Do stuff here
  //sendResponse({message:"stuff"});
});

另一方面,
sendRequest
onRequest
已被替换为它们的对应项。

谢谢!工作起来很有魅力!只是没有“tabId”,只有“id”:@Digerkam这就是我从内存中输入的结果。谢谢你指出这一点,我的荣幸。如果你做过类似的实验,我可以请你看看这个问题吗:再次感谢你!非常感谢。工作起来很有魅力!只是没有“tabId”,只有“id”:@Digerkam这就是我从内存中输入的结果。谢谢你指出这一点,我的荣幸。如果你做过类似的实验,我可以请你看看这个问题吗:再次感谢你!