Chrome 扩展 - 重新加载匹配的标签
Chrome extensions - reload matching tabs
我想知道,有没有办法从后台页面重新加载与 manifest.json 的 content_scripts.matches
匹配的所有页面?或者我是否必须在我的代码中的其他地方定义它,并循环遍历选项卡以检查是否匹配?
先谢谢了。
使用 chrome.runtime.getManifest() 获取所有内容脚本声明,手动将 matches
和其他类型的模式转换为正则表达式并检查所有浏览器选项卡 url。
这是一个简化版本,不考虑排除的网址。
var matches = [];
chrome.runtime.getManifest().content_scripts.forEach(function(cs) {
Array.prototype.push.apply(matches, (cs.matches || []).map(matchToRegexp));
Array.prototype.push.apply(matches, (cs.include_globs || []).map(globToRegexp));
function matchToRegexp(match) {
return match.replace(/[{}()\[\]\.+?^$|]/g, "\$&")
.replace(/\*/g, '.*?');
}
function globToRegexp(glob) {
return glob.replace(/[{}()\[\]\.+^$|]/g, "\$&")
.replace(/\?/g, '.')
.replace(/\*/g, '.*?');
}
});
var hasAllUrls = matches.indexOf('<all_urls>') >= 0 || matches.indexOf('*://*/*/') >= 0;
var rxMatches = hasAllUrls ? /^(https?|file|ftp):\/\/.+/
: new RegExp('^' + matches.join('$|^') + '$');
chrome.windows.getAll({
populate: true,
windowTypes: ['normal', 'panel', 'popup'],
}, function(windows) {
windows.forEach(function(window) {
window.tabs.forEach(function(tab) {
if (rxMatches.test(tab.url)) {
chrome.tabs.reload(tab.id);
}
});
});
});
未经测试。如果出现问题,请调试、修复、编辑此答案。
请参阅 了解更合适的 glob-to-regexp 转换函数。
我想知道,有没有办法从后台页面重新加载与 manifest.json 的 content_scripts.matches
匹配的所有页面?或者我是否必须在我的代码中的其他地方定义它,并循环遍历选项卡以检查是否匹配?
先谢谢了。
使用 chrome.runtime.getManifest() 获取所有内容脚本声明,手动将 matches
和其他类型的模式转换为正则表达式并检查所有浏览器选项卡 url。
这是一个简化版本,不考虑排除的网址。
var matches = [];
chrome.runtime.getManifest().content_scripts.forEach(function(cs) {
Array.prototype.push.apply(matches, (cs.matches || []).map(matchToRegexp));
Array.prototype.push.apply(matches, (cs.include_globs || []).map(globToRegexp));
function matchToRegexp(match) {
return match.replace(/[{}()\[\]\.+?^$|]/g, "\$&")
.replace(/\*/g, '.*?');
}
function globToRegexp(glob) {
return glob.replace(/[{}()\[\]\.+^$|]/g, "\$&")
.replace(/\?/g, '.')
.replace(/\*/g, '.*?');
}
});
var hasAllUrls = matches.indexOf('<all_urls>') >= 0 || matches.indexOf('*://*/*/') >= 0;
var rxMatches = hasAllUrls ? /^(https?|file|ftp):\/\/.+/
: new RegExp('^' + matches.join('$|^') + '$');
chrome.windows.getAll({
populate: true,
windowTypes: ['normal', 'panel', 'popup'],
}, function(windows) {
windows.forEach(function(window) {
window.tabs.forEach(function(tab) {
if (rxMatches.test(tab.url)) {
chrome.tabs.reload(tab.id);
}
});
});
});
未经测试。如果出现问题,请调试、修复、编辑此答案。
请参阅