为什么“chrome.tabs.onUpdated.addListener()”回调中的tab.url返回未定义?

R. *_* B. 3 javascript google-chrome google-chrome-extension

对于我的 Chrome 扩展程序,我需要pageAction仅在某个网站上显示该扩展程序。我曾经使用 来执行此操作declarativeContent,但 Firefox 不支持它,所以我必须手动执行此操作。这个问题的答案表明你可以简单地使用这样的东西:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
  if (changeInfo.status === "complete" && tab.url) {
    if (tab.url.match(/google.com/)) {
      chrome.pageAction.show(tabId);
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

这对我来说不起作用,所以我修改了后台脚本中的代码,如下所示:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
  console.log("Tab updated! Tab URL: " + tab.url);
});
Run Code Online (Sandbox Code Playgroud)

每次更新选项卡时,控制台只会打印Tab updated! Tab URL: undefined几次。我还尝试像这个问题的答案一样查询选项卡,这会产生相同的输出。

扩展的其他文件是:

清单.json:

{
  "name": "Test",
  "version": "1.0",
  "description": "Test for StackOverflow",

  "permissions": ["activeTab"],

  "background": {
    "scripts": ["background.js"]
  },
  "page_action": {
    "default_popup": "popup.html"
  },
  "manifest_version": 2
}
Run Code Online (Sandbox Code Playgroud)

弹出.html:

<!DOCTYPE html>
<html>
  <body>
    This is a popup!
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

lej*_*lun 5

您缺少tabsmanifest.json 文件中的权限。有了此权限,选项卡的 URL 也应记录到控制台。

"permissions": ["activeTab", "tabs"] // <-- This
Run Code Online (Sandbox Code Playgroud)

清单.json:

{
  "name": "Test",
  "version": "1.0",
  "description": "Test for StackOverflow",

  "permissions": ["activeTab", "tabs"],

  "background": {
    "scripts": ["background.js"]
  },
  "page_action": {
    "default_popup": "popup.html"
  },
  "manifest_version": 2
}
Run Code Online (Sandbox Code Playgroud)