【问题标题】:Need help toggling google chrome extension webRequest listener需要帮助切换 google chrome 扩展 webRequest 侦听器
【发布时间】:2015-07-12 13:58:07
【问题描述】:

大家好,我对制作 google 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'
    });
}

});

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

【问题讨论】:

    标签: javascript google-chrome google-chrome-extension webrequest


    【解决方案1】:

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

    那么,您所要做的就是不要使用匿名函数,而是将该函数保存在您可以访问的地方。例如,您可以在onClicked 侦听器之外定义函数deny,然后将deny 传递给onBeforeRequest.addListeneronBeforeRequest.removeListener

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

    【讨论】:

      猜你喜欢
      • 2015-12-07
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      相关资源
      最近更新 更多