Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 需要帮助切换google chrome扩展webRequest侦听器吗_Javascript_Google Chrome_Google Chrome Extension_Webrequest - Fatal编程技术网

Javascript 需要帮助切换google chrome扩展webRequest侦听器吗

Javascript 需要帮助切换google chrome扩展webRequest侦听器吗,javascript,google-chrome,google-chrome-extension,webrequest,Javascript,Google Chrome,Google Chrome Extension,Webrequest,嘿,伙计们,我对谷歌chrome的扩展真的很陌生。我决定做的第一个扩展是一个简单的网站拦截器。我从某人的回答中找到了一些代码,可以根据tab.id切换webRequest侦听器,如下所示: chrome.browserAction.onClicked.addListener(function(tab) { if (listeners[tab.id]) { //If the ID already exists chrome.webRequest.onBeforeRequest.remove

嘿,伙计们,我对谷歌chrome的扩展真的很陌生。我决定做的第一个扩展是一个简单的网站拦截器。我从某人的回答中找到了一些代码,可以根据tab.id切换webRequest侦听器,如下所示:

chrome.browserAction.onClicked.addListener(function(tab) {
if (listeners[tab.id]) { //If the ID already exists
    chrome.webRequest.onBeforeRequest.removeListener(listeners[tab.id]);
    delete listeners[tab.id];
    chrome.browserAction.setBadgeText({
        text: 'OFF',
        tabId: tab.id
    });
} else {
    listeners[tab.id] = function(details) {
        return {cancel: true};
    };
    chrome.webRequest.onBeforeRequest.addListener(listeners[tab.id], {
        urls: user,
        types: ['main_frame', 'sub_frame'],
        tabId: tab.id
    }, ['blocking']);
    // Show indicator to show that the extension is active.
    chrome.browserAction.setBadgeText({
        text: 'ON',
        tabId: tab.id
    });
}
});
这对每个选项卡都很有效,但是我想切换所有选项卡的侦听器。 我希望它如何工作:

  • 单击扩展图标
  • 阻止“用户”数组中的所有URL,无论是否切换选项卡
  • 无论选项卡是否与我最初启用扩展的选项卡不同,都可以再次单击图标以禁用
我已经多次尝试重新创建此方法,但是一旦启用侦听,我就无法将其删除。因为我的实现总是调用一个匿名函数,而且从我所读到的内容来看,您无法删除回调函数为匿名函数的侦听器

以下是我自己尝试的一些基本实现:

chrome.browserAction.onClicked.addListener(function(tab){
if(toggle===true)
    toggle = false;
else if(toggle===false)
    toggle = true;

if(toggle===true){
    chrome.webRequest.onBeforeRequest.addListener(
    function deny(request) {
        return {cancel: true}; 
    }, { urls: user, types: [] }, ["blocking"]);

    chrome.browserAction.setBadgeText({
        text: 'ON'
    });
}
else{
    chrome.webRequest.onBeforeRequest.removeListener();
    chrome.browserAction.setBadgeText({
        text: 'OFF'
    });
}

});

基本上,我想得到一些帮助,将第一个代码段转换成一个适用于所有选项卡的代码段。谢谢!:)

您已成功识别问题:如果回调函数是匿名的,则无法删除侦听器。伟大的这是因为您需要将完全相同的对象传递给
addListener
removeListener

那么,您所要做的就是,不要使用匿名函数,而是将该函数放在您可以访问它的地方。例如,您可以在单击的
侦听器外部定义函数
deny
,然后将
deny
传递给
onBeforeRequest.addListener
onBeforeRequest.RemovelListener

(关于代码的注意事项:您可以使用
toggle=!toggle
来翻转toggle的值,并使用
if(toggle)
而不是
if(toggle==true)
来测试toggle是否为true。这些只是常见的习惯用法。)