如何从用户选项url匹配在Content_Script
How should Urls from User Options be matched in Content_Script?
我正在写一个扩展,有选项,让用户决定他们想要的扩展运行在哪些网站上。
假设用户在选项
中有这个站点site action
stackoverflow.com/* change background css to blue
google.com/* change background css to green
我将这些字符串存储在选项中。当content_script运行时,我应该从选项中检索这些字符串,通过每个循环,用urlParser解析成部分,将每个部分转换为正则表达式(转义除*外的所有内容),并将其与document.URL进行比较吗?我最近读到,这种类型的用户选项验证的url应该通过后台脚本来完成,所以我不知道该走哪条路,或者如果有一个更明显的方法来做到这一点。
我认为扩展像Adblocker和viimium似乎有这个功能,但决定哪些网站不是上运行。我想弄清楚如何决定在哪些网站上运行
更新问题:由于我的content_script需要在document_start运行(在页面加载之前,因为它处理编辑页面外观)作为content_script,背景页面是否能够在网页加载之前执行content_script ?
验证了一个网页的url应该通过一个后台页面进行"验证",因为用户的选项将被托管在本地存储的背景页面的上下文中。这是我要做的……(虽然这更像是一个建议,而不是一个答案)。
对不起,我不确定你列表中右栏的动作是如何影响你的问题的。
(还需要注意,您需要合并一个库(外部或自编写),可以将globs解析为regex。)
manifest.json
permissions: ["tabs", "storage", "webRequest", "<all_urls>"]
background.js
//allow the webrequest to run on all urls
var filter = { urls: "<all_urls>" };
//receives url information from webrequest listener
function listen(details) {
getUserOpts()
.then(function(arrayOfWhitelistUrls) {
//you can't use globs here, need to use more powerful filtering mechanisms
if (arrayOfWhitelistUrls.indexOf(details.url) > -1) {
message();
}
});
}
//returns a promise containing user defined whitelist urls from background local storage
function getUserOpts() {
return new Promise(function(res, rej) {
chrome.storage.get("whitelist", function(data) {
//you are saving all localhost data as a string, so you need to parse it first
res(JSON.parse(data));
});
});
}
//messages content script and allows execution
function message() {
chrome.tabs.query({active: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {permission: true});
});
}
chrome.webRequest.onBeforeRequest.addListener(listen, filter)
contentscript.js
function listen(message) {
if (message.permission) {
if (message.permission === true) {
init();
}
}
}
//listen for message
chrome.runtime.onMessage.addEventListener(listen);
所以运行的顺序是:
- 后台页面监听每个web请求
- 在每个web请求中,后台页面异步地从本地存储中获取用户选项
- 如果当前选项卡的url通过了您的过滤器,则通知您的内容脚本
- 内容脚本接收消息,然后运行
可能有更简单的方法;这种方法的缺点是您需要在您拥有的每个内容脚本中包含权限网关。
相关文章:
- html文件中的script标记根本不起作用
- 用javascript将script元素附加到头部;铬不能工作
- script标记如何解析node_modules的路径
- @Url.Content(“~”)不适用于localhost
- 节点,express应用程序返回text/javascript响应头(Content-Type),尽管设置了applic
- 在<script src=“"></脚本>标签
- Google Script HtmlService,通过多个选项卡复制URL变量
- 为什么firefox开发人员控制台引用script.js
- 等效于<script src=“;something1.json”></脚本>
- If Else Java Script HTML
- strongloop script.js run find in before delete方法:如何同步运行异步方法
- 是否在Script Src标记中包含Script<脚本>(JavaScript等)
- Java Script将对象方法映射到数组中的对象
- 如何在Java Script中比较二维数组和一维数组,并将常见数据存储在另一个数组中
- Content Script 无法访问 Chrome.tabs.*,即使在添加外部 JS 文件后也是如此
- Google Apps Script 的 Content Service 返回 HTML 而不是 JSON
- How can I get json content in <script src="url.json&
- 调用chrome.browserAction.onClicked上的Content Script函数
- 仅当设置了首选项时才在content-script中加载jQuery
- background.js和content-script之间的通信?响应是UNDEFINED