从弹出窗口发送消息到内容脚本?

Ale*_*ila 4 javascript events message google-chrome google-chrome-extension

假设我想在google chrome扩展程序中点击弹出页面中的按钮时运行内容脚本?

我尝试过以下方法:

//popup.js
document.addEventListener('DOMContentLoaded', function () {
  document.querySelector('button').addEventListener('click', clicked);
  main();
});

function clicked(){
    chrome.tabs.getCurrent(
        function(tab){
            console.log(tab);
            chrome.tabs.sendMessage(tab.id, "doSomething");     
        }
    ); 
}
Run Code Online (Sandbox Code Playgroud)

并在内容脚本中:

chrome.extension.onMessage.addListener(
    function(message, sender, sendResponse){
        console.log("hello world");
    }
);
Run Code Online (Sandbox Code Playgroud)

问题是tab回调来自chrome.tabs.getCurrent( )未定义.

Sud*_*han 5

您是否已为manifest.json中的选项卡授予权限,如此处所示.

 "permissions": [
    "tabs"
  ],
Run Code Online (Sandbox Code Playgroud)

此外,以下代码返回的tab.id是弹出视图(NOT A CONTENT SCRIPT TAB.ID)

chrome.tabs.getCurrent(
        function(tab){
            console.log(tab);
            chrome.tabs.sendMessage(tab.id, "doSomething");     
        }
    ); 
Run Code Online (Sandbox Code Playgroud)

如果要将消息发送到正在浏览的选项卡,请使用以下代码的tab.id,它会给出正确的结果

chrome.tabs.query({"status":"complete","windowId":chrome.windows.WINDOW_ID_CURRENT,"active":true}, function(tabs){
     console.log(JSON.stringify(tabs[0]));
     console.log(tabs[0].id); 
});
Run Code Online (Sandbox Code Playgroud)

如果您需要更多信息,请与我们联系