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

时间:2016-08-24 19:47:17

标签: javascript google-chrome google-chrome-extension

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

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

我的清单中的权限是" activeTab","存储","标签"。

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

popup.js

chrome.tabs.executeScript(null, {file: "injected.js"});                          

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

injected.js

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});    

问题是"收到了消息!"我使用调试器时从不打印到控制台,但是"运行"打印就好了。我看过似乎有类似问题的问题:

所接受的答案似乎都不适合我。我尝试将return true;添加到onMessage事件监听器中,但它似乎无法正常工作。我也没有在调试器中的控制台上出现任何错误(点击" Inspect Popup")。我觉得自己错过了一些微不足道的东西,但我不知道该怎么做才能猜到它。有没有理由说onMessage没有收到任何东西?

1 个答案:

答案 0 :(得分:1)

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

  

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

与所有具有回调函数chrome.tabs.query的Chrome API一样,asynchronous并在执行当前函数/上下文后调用回调。所以下一个语句只会看到旧的url(空字符串)。

  

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

因此,在您的方案中,根本不需要内容脚本,以及"activeTab" documentation中的"tabs"权限:它会在用户手势之后自动设置临时权限单击扩展工具栏弹出窗口。