需要帮助切换 google chrome 扩展 webRequest 侦听器
Need help toggling google chrome extension webRequest listener
大家好,我是制作 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
});
}
});
这对每个选项卡都适用,但我想切换所有选项卡的侦听器。
我希望它如何工作:
- 单击扩展程序图标
- 阻止我的 'user' 数组中的所有 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
。
那么,您所要做的就是不要使用匿名函数,而是将该函数保存在您可以访问的地方。例如,您可以在 onClicked
侦听器外部定义函数 deny
,然后将 deny
传递给 onBeforeRequest.addListener
和 onBeforeRequest.removeListener
。
(关于您的代码的注释:您可以使用 toggle = !toggle
翻转切换的值,并使用 if (toggle)
而不是 if (toggle === true)
测试切换是否为真。这些只是常用成语。)
大家好,我是制作 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
});
}
});
这对每个选项卡都适用,但我想切换所有选项卡的侦听器。 我希望它如何工作:
- 单击扩展程序图标
- 阻止我的 'user' 数组中的所有 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
。
那么,您所要做的就是不要使用匿名函数,而是将该函数保存在您可以访问的地方。例如,您可以在 onClicked
侦听器外部定义函数 deny
,然后将 deny
传递给 onBeforeRequest.addListener
和 onBeforeRequest.removeListener
。
(关于您的代码的注释:您可以使用 toggle = !toggle
翻转切换的值,并使用 if (toggle)
而不是 if (toggle === true)
测试切换是否为真。这些只是常用成语。)