javascript - Chrome 扩展程序未关闭

标签 javascript google-chrome google-chrome-extension

我目前正在创建一个 chrome 扩展,如果有人在 chrome 中输入特定的网址,它会重定向用户并添加参数。

一切都按预期工作,除了扩展程序在关闭后仍在执行重定向(通过图标切换时)。

我的代码有什么问题?

Manifest.json

{
  "name": "Country Switcher",
  "description": "Redirect Google to a different host",
  "version": "1.0",
  "manifest_version": 2,
  "browser_action": {
      "default_icon": "off.png",
      "default_title": "icon"
    },
  "background": {"scripts":["background.js"]},
  "permissions": [
    "webRequest",
    "*://*/*",
    "webRequestBlocking"
  ]
}

背景.js

var host_fr = "https://www.google.fr";
var param_fr = "";
var toggle = false;

chrome.browserAction.onClicked.addListener(function(tab) {
  toggle = !toggle;
  if(toggle){
    chrome.browserAction.setIcon({path: "on.png"});
    chrome.webRequest.onBeforeRequest.addListener(
    function redirect(details) {
         return {redirectUrl: host_fr + details.url.match(/^https?:\/\/[^\/]+([\S\s]*)/)[1] + param_fr};
    },
    {
        urls: [
            "*://www.google.com/*",
        ],
        types: ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]
    },
    ["blocking"]
    );  
}
  else{
    chrome.browserAction.setIcon({path: "off.png"});
  }
});

非常感谢

PS:我是初学者...

最佳答案

您正在添加一个监听器,并且不执行任何操作删除它。

这里有两条可能的路径:

  1. 删除 onClicked 中的监听器处理程序时 toggle === false :

    function handler(details) { // Must be non-anonymous
      return {redirectUrl: host_fr + details.url.match(/^https?:\/\/[^\/]+([\S\s]*)/)[1] + param_fr};
    }
    
    chrome.browserAction.onClicked.addListener(function(tab) {
      toggle = !toggle;
      if(toggle){
        chrome.browserAction.setIcon({path: "on.png"});
        chrome.webRequest.onBeforeRequest.addListener(
          handler, /* your other parameters */
        );
      }
      else{
        chrome.browserAction.setIcon({path: "off.png"});
        chrome.webRequest.onBeforeRequest.removeListener(handler);
      }
    });
    

    我不是 100% 确定如何 removeListenerwebRequest一起工作,考虑复杂addListener ,但这就是理论

  2. 修改监听器(并且仅添加一次!)以获取 toggle考虑到:

    function handler(details) {
      if (toggle) {
        return {redirectUrl: host_fr + details.url.match(/^https?:\/\/[^\/]+([\S\s]*)/)[1] + param_fr};
      } else {
        return {}; // do nothing
      }
    }
    
    // Do this at the top level
    chrome.webRequest.onBeforeRequest.addListener(
      handler, /* your other parameters */
    );     
    
    chrome.browserAction.onClicked.addListener(function(tab) {
      toggle = !toggle;
      if (toggle) {
        chrome.browserAction.setIcon({path: "on.png"});
      } else {
        chrome.browserAction.setIcon({path: "off.png"});
      }
    });           
    

    此方法容易得多

关于javascript - Chrome 扩展程序未关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23844098/

相关文章:

javascript - 将 'new' 构造函数“绑定(bind)”到 Javascript 中的函数

javascript - 如何在 HTML5 Blob 对象上使用 base64 编码

javascript - 添加字母后如何进行替换?

javascript - IE11 window.history.pushState "Object doesn' t 支持属性或方法 'pushState'

list - 单击选项时在 chrome 跳转中选择列表

javascript - XMLHttpRequest 在 6 次后停止发送

javascript - 选项卡未聚焦时的 chrome.tabs.sendMessage

javascript - chrome内存清空?

javascript - 内容脚本在 Chrome 扩展中不起作用

javascript - 将图像 URL 发送到特定文本字段的 Google Chrome 扩展程序