Google chrome extension 是否有一种简单的方法将我的内容脚本限制为特定的匹配数组?

Google chrome extension 是否有一种简单的方法将我的内容脚本限制为特定的匹配数组?,google-chrome-extension,Google Chrome Extension,我希望我的Chrome扩展只在新闻网站上工作,所以我有一个很长的URL列表,我想限制它 有没有比在manifest.json的“matches”字段中手动添加长列表更容易限制我的扩展名?谢谢 { "name": "My extension", ... "content_scripts": [ { "matches": ["http://www.newswebsite.com/*", "...long long array with urls..."],

我希望我的Chrome扩展只在新闻网站上工作,所以我有一个很长的URL列表,我想限制它

有没有比在
manifest.json
“matches”
字段中手动添加长列表更容易限制我的扩展名?谢谢

{
  "name": "My extension",
  ...
  "content_scripts": [
    {
      "matches": ["http://www.newswebsite.com/*",
      "...long long array with urls..."],
      ... 
    }
  ],
  ...
}
在扩展的清单中 首先,我要说的是,在列表中的所有站点中插入内容脚本的“最简单”方法是将它们添加到扩展的清单中的
“matches”
数组中

如果您担心必须手动在数组中插入每个站点,那么这没什么大不了的,您可以轻松地将其粘贴到文本编辑器中,并使用“查找和替换”来执行所需操作,例如将
\n
替换为
/*,\n*://
,然后手动编辑第一个和最后一个站点:

site1.com->site1.com/*”,->“*://site1.com/*”,
site2.net->“*://site2.net/*”,->“*://site2.net/*”,
site3.org->“*://site3.org/*”,->“*://site3.org/*”
"*//
一旦你得到了它,你就可以把它复制粘贴到你的
“匹配项”:[…
数组中

通过带有
选项卡的后台脚本
API 如果您真的不想将它们添加到清单中,您可以将它们放入扩展目录中的文本文件中,然后将其加载到后台页面,并将侦听器添加到
chrome.tabs.onUpdated
,以检查URL何时更改,并在新URL与其中一个站点匹配时插入脚本。这比n只需将它们添加到您的清单中

工作示例

您的
list.txt

site1.com
site2.net
网站3.org
您的
background.js
脚本:

//从URL提取主机名的函数。
函数getHostname(url){
返回url.match(/^(.*)\/\/([A-Za-z0-9\-\.]+)/)[2];
} 
//XHR获取list.txt文件
var xhr=new XMLHttpRequest();
xhr.addEventListener('readystatechange',function(){
如果(xhr.readyState==4&&xhr.status==200){
//解析列表并从中创建一个集合:
var list=新集合(xhr.responseText.split('\n'));
//侦听选项卡。未更新:
chrome.tabs.onUpdate.addListener(函数(tabId、changeInfo、tab){
//如果选项卡更改了URL:
if(changeInfo.url)
//如果新URL是列表中的一个站点:
if(list.has(getHostname(changeInfo.url)))
//注入脚本:
executeScript(tabId,{file:'yourScript.js'});
});
}
});
open('GET','list.txt',true);
xhr.send();
不要忘记为


  • 我一直在寻找一个与框架配合使用的答案,但最终还是在
    侦听器和活动选项卡中直接创建了
    Javascript
    。我还想使用一个已定义的函数,而不是加载一个单独的
    Javascript
    文件

    我的最终目标是让扩展响应热键,但只针对特定主机。我就是这样做的:

    manifest.json
    中:

    ...
     "commands": {
      "some-command": {
       "suggested_key": {
        "default": "Ctrl+Shift+L"
       },
       "description": "Tell me something special."
      }
     },
    ...
    
    background.js
    中:

    chrome.commands.onCommand.addListener(function(command) {
     chrome.tabs.getSelected(null, function(tab) {
      var url = new URL(tab.url);
      if (url.hostname != 'somedomain.com') return;
    
      if (command == 'some-command') {
       custom_function();
      }
     });
    });
    
    function custom_function {}
    

    最终的结果是,无论是触发热键命令还是通过地址栏弹出窗口,扩展只在具有特定域名的选项卡上工作。我没有包括地址栏弹出代码,因为这就在“构建Chrome扩展”上指南-我希望我们都已经完成了。

    嗯,这取决于是否有类似的URL。
    executeScript
    方法是否有任何权限含义?@KarlReid,答案假设您已经有了
    权限,所以如果您没有权限,请查看declarativeContent API。顺便说一句你的问题太模糊了:什么更容易?添加网站有什么困难?这不是我的问题,只是对这个特定答案的一个好奇的评论:)我想你需要
    ,谢谢你的确认。@KarlReid@wOxxOm哦,是的,
    ,那是真的,谢谢!哇,非常感谢你给出了这么长的答案!我可能会尝试其他选项,但我可能最终会坚持这个答案简单的方法。谢谢!