我制作了一个修改特定登录页面的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
上的任何地方执行?
答案 0 :(得分:2)
对于您在问题中显示的内容,最好的方法是在content_scripts
中使用manifest.json条目来加载内容脚本,而不是使用chrome.tabs.executeScript()
来执行此操作所以。将其作为content_scripts
条目执行将在加载指定页面时注入脚本一次。当URL与某个页面匹配时,为了加载脚本,使用chrome.tabs.executeScript()
要简单得多。通常,当用户点击browserAction或pageAction按钮(您未使用)时,与用户的互动时,应使用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"]
}
]
}