Javascript Chrome扩展-弹出窗口中的onMessage未接收来自注入脚本的消息

Javascript Chrome扩展-弹出窗口中的onMessage未接收来自注入脚本的消息,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我对Chrome扩展开发非常陌生,我想做一些非常简单的事情,但我不确定为什么它不起作用。 本质上,我想: 运行popup.js脚本,该脚本以编程方式注入脚本 让注入的脚本从活动选项卡获取一些数据 使用chrome.runtime.sendMessage将数据发送回popup.js 在popup.js中接收数据时执行某些操作(例如,在扩展弹出窗口中显示活动选项卡的URL) 我的清单中的权限是“活动选项卡”、“存储”、“选项卡” 以下是我尝试用于测试目的的代码 popup.js 注入的.js 问

我对Chrome扩展开发非常陌生,我想做一些非常简单的事情,但我不确定为什么它不起作用。 本质上,我想:

  • 运行popup.js脚本,该脚本以编程方式注入脚本
  • 让注入的脚本从活动选项卡获取一些数据
  • 使用chrome.runtime.sendMessage将数据发送回popup.js
  • 在popup.js中接收数据时执行某些操作(例如,在扩展弹出窗口中显示活动选项卡的URL)
我的清单中的权限是“活动选项卡”、“存储”、“选项卡”

以下是我尝试用于测试目的的代码

popup.js 注入的.js 问题是,当我使用调试器时,“messagereceived!”从不打印到控制台,但是“running”可以很好地打印。我看过一些似乎有类似问题的问题:

所有被接受的答案似乎都不适合我。我尝试添加
返回true
发送到onMessage事件侦听器,但它似乎不起作用。我在调试器的控制台上也没有发现任何错误(单击“检查弹出窗口”)。我觉得我错过了一些琐碎的东西,但我不知道这是什么。onMessage没有收到任何信息有什么原因吗

列出了内容脚本中允许的几个ChromeAPI,而不是
chrome.tabs

解决方案:在特权页面(如弹出窗口)中使用
chrome.tabs

与所有具有回调函数
Chrome.tabs.query
的ChromeAPI一样,在执行当前函数/上下文后调用回调。因此,下一条语句将只看到旧的
url
(空字符串)

解决方案:在回调中正确处理接收到的数据


因此,在您的场景中,完全不需要内容脚本,以及您可以在中看到的
“选项卡”
权限:它会在用户手势(如单击扩展工具栏弹出窗口)后自动设置临时权限。

谢谢!删除后,它现在似乎工作:)我希望它给出了某种错误。为了澄清第二种解决方案,任何异步函数都应该在其回调中处理数据,以确保数据不是空的/未定义的?是的,您可以(实际上应该)更详细地阅读它,例如我链接的答案或任何其他(更好的)教程/解释。这是JavaScript中最重要的基本内容之一。
chrome.tabs.executeScript(null, {file: "injected.js"});                          

chrome.runtime.onMessage.addListener(                                            
    function(request, sender, sendResponse){                                  
            console.log("message received!");                                
});    
var url = "";                                                                    

// get the url of the current tab                                                
chrome.tabs.query({currentWindow: true, active: true},                           
        function(tabs) {                                                         
                url = tabs[0].url;                                               
                console.log("running");                                          
});                                                                              

chrome.runtime.sendMessage({"url": url});