使用Chrome扩展程序根据标题阻止网站

时间:2019-02-15 06:06:52

标签: google-chrome-extension

我正在尝试使用Chrome扩展程序,试图使扩展程序可以根据其标题阻止和重定向网站。在此示例中,当任何网页标题的值为“ Microsoft-Official Home Page”时,我希望它重定向到https://example.com/。我在下面放置的示例代码几乎可以正常工作,问题是我必须在第一次访问该页面时刷新页面,否则它不会将我重定向到example.com。为什么在我第一次看到具有指定标题的页面时却没有刷新,它为什么不重定向我?我应该怎么做?

background.js:

// Listens for a change to occur.
chrome.tabs.onUpdated.addListener(function() {

  // Gets the URL and title of the webpage in the selected tab.
  chrome.tabs.getSelected(function(tab) {
    var currentUrl = tab.url;
    var currentTitle = tab.title;

    // Tests if the page title is equal to the given string.
    if(currentTitle == "Microsoft - Official Home Page") {

      chrome.webRequest.onBeforeRequest.addListener(
        function() {
          return {redirectUrl: "https://example.com/"};
        },
        {urls: [currentUrl]}, // Blocks the URL of the current tab.
        ["blocking"]
      );

    }
  }
}

manifest.json:

{
  "name": "Test Extension",
  "version": "1.0",
  "description": "An extension to block sites by title.",
  "permissions": [
    "tabs",
    "tabCapture",
    "webRequest",
    "webRequestBlocking",
    "<all_urls>"
  ],
  "background": {
    "scripts": ["background.js"],
    "persistent": true
  },
  "manifest_version": 2
}

1 个答案:

答案 0 :(得分:1)

问题:

  • 每当标题条件为true时,您的代码就会在所有先前的webRequest侦听器之外注册一个新的侦听器。
  • webRequest侦听器可用于后续导航,它本身不会主动运行。
  • chrome.tabs.getSelected已过时,在此不再需要。

解决方案:

当知道标签的标题时,将使用包含新标题的change参数调用onUpdated侦听器。如果标题是已知的-例如重新加载标签页时-标题没有更改通知,而仅是状态(例如,加载/完成)的更改通知,因此我们改用tab.title

这是正确的background.js:

chrome.tabs.onUpdated.addListener((tabId, change, tab) => {
  const title = 'title' in change ? change.title : tab.title;
  if (title === 'Microsoft - Official Home Page') {
    chrome.tabs.update(tabId, {url: 'https://example.com/'});
  }
});

以上各项才能正常运行,唯一的manifest.json权限:

"permissions": [
  "tabs"
],