Javascript 使用chrome.webRequest进行白名单/阻止

Javascript 使用chrome.webRequest进行白名单/阻止,javascript,google-chrome-extension,Javascript,Google Chrome Extension,所以我一直在尝试将白名单功能添加到chrome扩展中,在该扩展中,白名单可以通过更新,也可以完全禁用 在检查了文档和这里所有可能的答案之后,我仍然面临一个奇怪的问题,如果有任何关于它的说明,我将不胜感激 下面是代码片段 //this list can be updated by user or other trigger var allowed = ["example.com", "cnn.com", "domain.com"]; //this is main callback, so it

所以我一直在尝试将白名单功能添加到chrome扩展中,在该扩展中,白名单可以通过更新,也可以完全禁用

在检查了文档和这里所有可能的答案之后,我仍然面临一个奇怪的问题,如果有任何关于它的说明,我将不胜感激

下面是代码片段

//this list can be updated by user or other trigger
var allowed = ["example.com", "cnn.com", "domain.com"]; 

//this is main callback, so it can be removed from listener when needed

whiteMode = function (details) {

    //checking url to array
    var even = function(element) {
      return details.url.indexOf(element) == -1;
    }

    if (allowed.some(even) == true) {
        return {cancel: true }
    } else {
        return {cancel: false}
    }
}

//setup listener
chrome.webRequest.onBeforeRequest.addListener(
   whiteMode,
   {urls: ["<all_urls>"]}, 
   ["blocking"]
);
然后,如果我想更新允许的列表,我首先使用removeListener,然后用新值重新启动它,它确实会启动,但是“whiteMode”函数现在一直触发两次。通过检查console.log,我发现我的新url在第一次尝试时在数组中丢失,然后立即侦听器再次工作,并且有正确的允许的新数组,但是由于它已经被第一个触发器阻止,所以它什么也不做

问题是,为什么监听器总是重复两次或更多次(比如说,如果我添加了更多的项目),即使在添加回之前删除了它

有没有办法让所有的听众听清?(文档中没有这方面的内容),已经为此挣扎了很长一段时间


另外,尝试使用onHandlerBehaviorChanged,但没有帮助。

将函数提取为全局
函数whiteMode
,以便其对象引用不会更改。你现在似乎每次都在重新创建whiteMode。哦,没错,它成功了!你救了我一天,在宣布func为其他范围之外的全局之后,真是个魅力!
chrome.webRequest.onBeforeRequest.removeListener(whiteMode);