【发布时间】: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