仅执行一次Chrome扩展程序脚本

时间:2017-03-23 23:01:53

标签: javascript google-chrome-extension

我制作了一个修改特定登录页面的Chrome脚本。它按预期工作,但我可以在控制台中看到它始终处于活动状态,但它只应在登录站点上应用。

我的清单文件:

{
  "manifest_version": 2,
  "name": "Login Enhancer",
  "description": "Login without a hassle",
  "version": "1.0",
  "icons": {
    "16": "icon16.png",
    "48": "icon48.png",
    "128": "icon128.png"
  },
  "permissions": [
    "https://*.examplesite.io/subdomain/portal/#/login"
  ],
  "background": {
    "scripts": [
      "background.js"
    ]
  }
}

background.js:

chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
  if (changeInfo.status == 'complete' && tab.active) {

    chrome.tabs.executeScript(null, {file: 'script.js'});

  }
});

的script.js

// delete useless Remember Me Function
document.querySelector('.remember-me').remove();

当我在浏览examplesite.io/subdomain时登录后,控制台会在每个新页面上显示:

Uncaught TypeError: Cannot read property 'remove' of null
    at script.js:2

显然,不再需要删除remember-me按钮。这可能与我的background.js文件中的监听器有关。什么是正确的监听器,因此script.js仅在https://*.examplesite.io/subdomain/portal/#/login上执行一次,而不是https://*.examplesite.io上的任何地方执行?

1 个答案:

答案 0 :(得分:2)

对于您在问题中显示的内容,最好的方法是在content_scripts中使用manifest.json条目来加载内容脚本,而不是使用chrome.tabs.executeScript()来执行此操作所以。将其作为content_scripts条目执行将在加载指定页面时注入脚本一次。当URL与某个页面匹配时,为了加载脚本,使用chrome.tabs.executeScript()要简单得多。通常,当用户点击browserActionpageAction按钮(您未使用)时,与用户的互动时,应使用chrome.tabs.executeScript() ,或者当您希望更详细地控制何时注入脚本而不是总是一次用于页面matching a specific URL, or URL pattern(您不需要执行的操作)。

在您的情况下,每次加载特定URL时,您都希望注入一次脚本。这正是 manifest.json content_scripts键存在的用例。

鉴于您的后台脚本除了加载内容脚本之外什么也没做,使用content_scripts条目意味着您不需要后台脚本。此外,您无需为该特定URL明确指定permissions。您的扩展程序会隐式授予与content_scripts matches密钥匹配的网址的权限。

您可以将 manifest.json 更改为:

{
  "manifest_version": 2,
  "name": "Login Enhancer",
  "description": "Login without a hassle",
  "version": "1.0",
  "icons": {
    "16": "icon16.png",
    "48": "icon48.png",
    "128": "icon128.png"
  },

  "content_scripts": [
    {
      "matches": ["https://*.examplesite.io/subdomain/portal/#/login"],
      "js": ["script.js"]
    }
  ]
}