如何仅在特定链接上运行background.js?

时间:2019-10-31 19:19:45

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

我正在尝试编写一个Chrome扩展程序,以便在标签页的链接包含特定单词/字符串的情况下关闭它们。我的意图是使用matches中的manifest.json语句解决此问题。不幸的是,这不起作用。我的manifest.json看起来像这样:

{
  "manifest_version": 2,
  "name": "Chrome Extension",
  "version": "0.1",
   "permissions": [
    "tabs"
  ],
  "content_scripts": [
    {
      "matches": [
       "<all_urls>"
      ],
      "js": ["content.js"]
    }
  ],
  "background": {
          "matches": [
               "https://www.google.de/",
                "https://sghm.eu/iserv/login"
          ],
          "scripts": ["background.js"],
          "persistent": true
  }
}

我的background.js像这样:

chrome.tabs.onUpdated.addListener( function (tabId, changeInfo, tab) {
  if (changeInfo.status == 'complete') {
      console.log('background running');
      chrome.tabs.remove(tabId, function() { });
  }
})

我认为我已经明确表示该脚本仅在googlesghm.eu上运行,那么为什么它在每个加载的页面上运行?

1 个答案:

答案 0 :(得分:2)

问题:

  • “背景”部分不能包含“匹配项”,就像您在documentation中看到的那样。后台脚本在与标签无关的单独的隐藏后台页面中运行。

  • 在manifest.json中声明的内容脚本可在所有URL上运行。对于您要完成的任务,您根本不需要内容脚本。

解决方案包括几个步骤:

  1. 删除“ content_scripts”部分
  2. 从“背景”部分删除“匹配项”
  3. 通过指定"persistent": false
  4. 切换到事件页面脚本
  5. 在manifest.json中添加"webNavigation"权限,并使用它来检测URL导航。

background.js:

chrome.webNavigation.onCompleted.addListener(closeTab, {
  url: [
    {urlPrefix: 'https://www.google.de/'},
    {urlPrefix: 'https://sghm.eu/iserv/login'},
  ]
});

function closeTab(e) {
  if (!e.frameId) {
    chrome.tabs.remove(e.tabId);
  }
}