我正在尝试我的第一个Chrome扩展程序。
我偶然发现了一个无法从内容脚本传达到弹出窗口的问题。

内容:
我的弹出窗口包含一些我想在页面刷新/初始时从内容脚本中检索到的localStorage数据,因此我可以在页面上使用该数据。

如果我正确理解official documentation,则应该可行。
它说:

“从内容脚本发送请求看起来像这样:”

chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
  console.log(response.farewell);
});


因此,我已经尝试过了,并且可以看到上面的代码是由我注入的JS脚本(内容脚本)触发的,但是我猜测我没有在弹出窗口中正确地“监听”它。

这是我的代码:

内容脚本(功能在运行时运行)

function getLocalStorageItems() {
chrome.runtime.sendMessage({task: "retrieve-local"}, function(response)
  {
    console.log(response.farewell);
  });
}


我将示例函数保持完整。

弹出式js

chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>
  {
    if ( request.task == "retrieve-local" ) {
      console.log('retrieve-local');
  }
});


表现

{
  "manifest_version": 2,
  "name": "Maxxton Dev Extension",
  "description": "Extension for Maxxton Developers",
  "version": "1.0",
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "index.html"
  },
  "content_scripts": [
    {
      "matches": ["*://*/*"],
      "js": ["injected.js"],
      "run_at": "document_end"
    }
  ]
}


我从没有看到console.log在弹出窗口中注册。

我认为这可能与我正在尝试chrome.runtime.onMessage的事实有关,因为从弹出窗口发送消息是chrome.tabs.query。因此,我尝试将其更改为chrome.tabs.onMessage,但这也没有执行任何操作。

现在我想这可能甚至不可能,因为弹出窗口处于休眠状态/未激活。但是我不确定。而且我找不到关于此问题的任何信息。

最佳答案

我使用背景脚本进行了这项工作。我不知道“ browser_action”的工作方式,但是当我尝试使用“ page_action”时,我注意到只要单击该按钮,页面就会重新创建(因此,如果当前未弹出,则该页面可能不存在,也不会监听)。

我建议您将数据保留在后台,并使内容和弹出窗口均与后台进行通信。

添加到您的清单:

"background": {
   "scripts": [
     //"you_probably_have_something_here_to_register_browser_action?",
     "background_data_manager.js", //this will be your script to manage data
   ],
   "persistent": false
},


将您的侦听器和所有代码用于处理文件background_data_manater.js中的数据。

要访问后台控制台,请转到Chrome工具并在启用开发人员模式的情况下打开扩展程序页面。在该扩展程序中,您将看到一个有关视图的小链接。该链接打开后台控制台。

您应该在该控制台中看到预期的日志。

关于javascript - 无法在Chrome扩展程序中从内容脚本进行通讯到弹出窗口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50743736/

10-16 09:33