为每个函数注入一个内容脚本的方式没有任何问题。但是,您可以通过不使用来使其变得更简单tabs.query()
获取活动选项卡。默认选项卡用于tabs.executeScript() https://developer.chrome.com/extensions/tabs#method-executeScript是当前活动的选项卡(即您从中获取的选项卡)tabs.query()
).
为每个功能注入一个脚本还是通过消息来启动所需功能的一个脚本,哪一个更好的选择取决于您的设计和您想要执行的操作。如果它们是相对罕见的函数(特别是由用户操作引发的,就像您的那样),那么为每个函数注入一个脚本通常是更好的选择(这是我在我的扩展之一中所做的事情)。这肯定比将一个很少使用的脚本注入到大量网站上要好,因为该脚本只是在需要时才开始执行某些操作。收到一条消息 https://developer.chrome.com/extensions/messaging来自后台脚本。例如,等待用户与浏览器 UI(而非内容 UI)交互的扩展,然后将消息从后台脚本发送到内容脚本以执行任务。当然在这种情况下,最好等到需要时再注入内容脚本。
显然,如果用户交互要从网页内部开始,而不是从浏览器 UI 开始,则需要将脚本注入到所有相关页面上。当您这样做时,您将需要使用消息传递 https://developer.chrome.com/extensions/messaging如果后台脚本需要执行一些需要后台脚本对扩展 API 具有更广泛访问权限的操作,则在内容脚本和后台脚本之间进行设置。
描述内容脚本注入清单.json
没有更多关于您希望如何将内容脚本添加到您的清单.json(例如方案、域、页面(即 URL)、脚本名称等)我们无法确切地告诉您如何执行此操作,除了阅读文档 https://developer.chrome.com/extensions/content_scripts。我想说的是,使用您的两个脚本注入相同的内容脚本是不寻常的。清单.json and tabs.executeScript()
。这样做本身并没有什么错。如果这是正确的做法将取决于代码和站点。
文档中可能不清楚的一件事是content_scripts
key 是一个对象数组。每个对象描述一组注入。对象中的所有文件都被注入到与该对象匹配的页面中该对象中提供的 URL 模式 https://developer.chrome.com/extensions/content_scripts#match-patterns-globs。您可以在其中拥有任意数量的描述注射组的对象。content_scripts
array.
以下示例既加载多个内容脚本,又将不同的内容脚本加载到不同的页面上,使用清单.json(改编自鳕鱼Chrome 的内容脚本页面 https://developer.chrome.com/extensions/content_scripts).
进入所有页面匹配https://www.google.com/*
,它会注入myGoogleStyles.css, jquery.js, and myGoogleScript.js.
进入所有页面匹配http://www.example.com/*
,它会注入myExampleStyles.css, jquery.js, and myExampleScript.js:
"content_scripts": [
{
"matches": ["https://www.google.com/*"],
"css": ["myGoogleStyles.css"],
"js": ["jquery.js", "myGoogleScript.js"]
},
{
"matches": ["http://www.example.com/*"],
"css": ["myExampleStyles.css"],
"js": ["jquery.js", "myExampleScript.js"]
}
],