chrome.webRequest.onBeforeRequest导致网页部分功能加载失败
chrome.webRequest.onBeforeRequest causes some features of web pages to fail to load
我正在写一个 chrome 扩展。我希望它阻止 en.wikipedia.org 上的所有页面,除了 Main_Page。我用 chrome.webRequest.onBeforeRequest
来做到这一点。
这是我用于 chrome 扩展程序后台脚本的代码:
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
if (details.url=="https://en.wikipedia.org/wiki/Main_Page") {
return {cancel: false};
} else {
return {cancel: true};
}
},
{urls: ["https://en.wikipedia.org/*"]},
["blocking"]);
此代码正确地阻止了除 Main_Page 之外的所有维基百科页面。
它确实显示 Main_Page,但它显示的是没有 CSS 的简化版本。
我已经在其他网站上尝试过(即阻止“https://www.reddit.com/*" except for exactly "https://www.reddit.com/”),在这些其他情况下,某些页面元素无法加载。
为什么会这样?我可以使用 chrome.webRequest.onBeforeRequest
并让网页正确显示吗?
以下示例说明如何阻止对 www.abc.com 的所有请求:
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
return {cancel: details.url.indexOf("://www.abc.com/") != -1};
},
{urls: ["<all_urls>"]},
["blocking"]);
由于此函数使用阻塞事件处理程序,因此需要清单文件中的 "webRequest" 和 "webRequestBlocking" 权限。
以下示例以更有效的方式实现了相同的目标,因为不需要将不针对 www.abc.com 的请求传递给扩展程序:
chrome.webRequest.onBeforeRequest.addListener(
function(details) { return {cancel: true}; },
{urls: ["*://www.abc.com/*"]},
["blocking"]);
如果站点为其资源使用子路径,而不是单独的子域,您的 URL 模式将破坏所有此类资源,例如维基百科的 CSS.
通过指定 types
过滤器简单地阻止顶部 URL:
chrome.webRequest.onBeforeRequest.addListener(
info => ({
cancel: !info.url.startsWith('https://en.wikipedia.org/wiki/Main_Page'),
}),
{
urls: ['https://en.wikipedia.org/*'],
types: ['main_frame', 'sub_frame'],
},
['blocking']
);
我正在写一个 chrome 扩展。我希望它阻止 en.wikipedia.org 上的所有页面,除了 Main_Page。我用 chrome.webRequest.onBeforeRequest
来做到这一点。
这是我用于 chrome 扩展程序后台脚本的代码:
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
if (details.url=="https://en.wikipedia.org/wiki/Main_Page") {
return {cancel: false};
} else {
return {cancel: true};
}
},
{urls: ["https://en.wikipedia.org/*"]},
["blocking"]);
此代码正确地阻止了除 Main_Page 之外的所有维基百科页面。
它确实显示 Main_Page,但它显示的是没有 CSS 的简化版本。
我已经在其他网站上尝试过(即阻止“https://www.reddit.com/*" except for exactly "https://www.reddit.com/”),在这些其他情况下,某些页面元素无法加载。
为什么会这样?我可以使用 chrome.webRequest.onBeforeRequest
并让网页正确显示吗?
以下示例说明如何阻止对 www.abc.com 的所有请求:
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
return {cancel: details.url.indexOf("://www.abc.com/") != -1};
},
{urls: ["<all_urls>"]},
["blocking"]);
由于此函数使用阻塞事件处理程序,因此需要清单文件中的 "webRequest" 和 "webRequestBlocking" 权限。
以下示例以更有效的方式实现了相同的目标,因为不需要将不针对 www.abc.com 的请求传递给扩展程序:
chrome.webRequest.onBeforeRequest.addListener(
function(details) { return {cancel: true}; },
{urls: ["*://www.abc.com/*"]},
["blocking"]);
如果站点为其资源使用子路径,而不是单独的子域,您的 URL 模式将破坏所有此类资源,例如维基百科的 CSS.
通过指定 types
过滤器简单地阻止顶部 URL:
chrome.webRequest.onBeforeRequest.addListener(
info => ({
cancel: !info.url.startsWith('https://en.wikipedia.org/wiki/Main_Page'),
}),
{
urls: ['https://en.wikipedia.org/*'],
types: ['main_frame', 'sub_frame'],
},
['blocking']
);