1

我正在写一个 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 之外的所有 Wikipedia 页面。

它确实显示了 Main_Page,但它显示了一个没有 CSS 的简化版本。

我已经在其他网站上尝试过这个(即阻止“ https://www.reddit.com/ *”,除了“ https://www.reddit.com/ ”),在这些其他情况下,一些页面元素无法加载。

为什么会这样?我可以使用chrome.webRequest.onBeforeRequest并正确显示网页吗?

4

2 回答 2

0

如果站点对其资源使用子路径,而不是单独的子域,则您的 URL 模式将破坏所有此类资源,例如 Wikipedia 的 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']
);
于 2019-03-29T04:40:00.107 回答
-1

以下示例说明了如何阻止对 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"]);

更多细节:https ://developer.chrome.com/extensions/webRequest

于 2019-03-29T04:29:19.653 回答