在使用chrome.tabs.onUpdated.addListener后访问给定URL时删除侦听器
Remove listener when given URL is visited after using chrome.tabs.onUpdated.addListener
我的问题是:我正在为Gmail开发Chrome扩展,需要在更新扩展时应用一些更改。
例如,我想确保扩展在更新后会在Gmail中显示一个警报对话框。这意味着在更新时检查Gmail是否已经在Chrome窗口中打开,如果没有,则创建一个侦听器以等待将来加载Gmail,然后显示警报对话框。
下面的代码就是这样做的。但是,当发现新的Gmail选项卡时,我无法删除侦听器(chrome.tables.onUpdated.removeListener?)。
background.js
// [...] code before
// Reload Tabs where Gmail is active
function reloadTab(order) {
chrome.windows.getCurrent(function(win) {
var cwin = win.id;
chrome.tabs.query({windowId: cwin}, function(tabs) {
var countGmailTabs = 0;
for (var i = 0; i < tabs.length; i++) {
var t = tabs[i].url;
if (t.match('mail.google.com')) {
countGmailTabs += 1;
if (order === 'set') {
chrome.tabs.reload(tabs[i].id);
} else if (order !== 'set') {
var GmailTab = tabs[i];
NewGmailURL(order, GmailTab);
return;
}
}
}
// Gmail not found !
if (countGmailTabs < 1 && order !== 'set') {
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if ( tab.url.match('mail.google.com') && changeInfo.status === 'loading' ) {
NewGmailURL('update', tab);
return;
// Everything OK, now remove listener. How?
}
});
}
});
});
}
// [...]
谢谢你的帮助!
有关信息,由于URL参数,将显示警报对话框。
// Modify Gmail URL
var updated = false;
function NewGmailURL(param, ztab) {
if (param === 'updated') {
urlMyExtension = ztab.url.replace(urlGmail + '?query=update&', urlGmail +'?query=' + param + '&');
} else {
urlMyExtension = ztab.url.replace(urlGmail, urlGmail + '?query=' + param + '&');
}
if (!done && param !== 'updated') {
chrome.tabs.update(ztab.id, {
url: urlMyExtension,
highlighted: ztab.highlighted
}, null);
updated = true;
}
}
[更新]答案
如果有人遇到同样的问题,以下是感谢@ExpertSystem:的答案
// Listen to Tabs URL
function myListener(tabId, info, tab) {
if (tab.url.match("mail.google.com") && (info.status === "loading")) {
NewGmailURL("update", tab);
/* Now, let's relieve ourselves from our listener duties */
chrome.tabs.onUpdated.removeListener(myListener);
return;
}
}
// Reload Tabs where Gmail is active
function reloadTab(order) {
chrome.tabs.query({ currentWindow: true }, function(tabs) {
var countGmailTabs = 0;
for (var i = 0; i < tabs.length; i++) {
var t = tabs[i].url;
if (t.match('mail.google.com')) {
countGmailTabs += 1;
if (order === 'set') {
chrome.tabs.reload(tabs[i].id);
} else if (order !== 'set') {
var GmailTab = tabs[i];
NewGmailURL(order, GmailTab);
return;
}
}
}
// Gmail not found !
if (countGmailTabs < 1 && order !== 'set') {
chrome.tabs.onUpdated.addListener(GmailListener);
}
});
}
为了能够删除侦听器,请不要将其实现为匿名函数。将其实现为"命名"函数,允许您在调用removeListener()
时引用它alter
例如:
/* Change this: */
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {...});
/* To this: */
function myListener(tabId, info, tab) {
if (tab.url.match("mail.google.com") && (info.status === "loading")) {
NewGmailURL("update", tab);
/* Now, let's relieve ourselves from our listener duties */
chrome.tabs.onUpdated.removeListener(myListener);
return;
}
});
chrome.tabs.onUpdated.addListener(myListener);
顺便说一句,(与你的问题无关,但)你打了几个超级糟糕的电话:
您不需要获取当前窗口,然后获取其选项卡,如下所示:
chrome.windows.getCurrent(function(win) {
var cwin = win.id;
chrome.tabs.query({windowId: cwin}, function(tabs) {
...
您可以在一个电话中完成,如下所示:
(另请参阅chrome.windows.getCurrent())
chrome.window.getCurrent({ populate: true }, function(win) {
var tabs = win.tabs;
...
甚至是这样:
(另请参阅chrome.tables.query())
chrome.tabs.query({ currentWindow: true }, function(tabs) {
...
相关文章:
- Highslide(iframe的侦听器)
- 如何在for循环中添加事件侦听器
- 选项卡侦听器未被来自后台脚本的消息激活
- 未命中服务器发送的事件侦听器
- 如何覆盖原型中的事件侦听器
- 加载侦听器上的函数触发得太早
- 无法将事件侦听器附加到画布
- 如何在d3.js中自定义事件侦听器
- 在es6中,将带有回调的事件侦听器设置为可迭代的
- 事件侦听器未在chrome扩展中的options.js中启动
- IE8更改文本区域上的事件侦听器不工作
- 将事件侦听器添加到文档,而不是签入元素存在,然后添加事件侦听器
- jQuery将侦听器的大小调整为只触发宽度的变化
- javascript删除事件侦听器
- 我应该/如何清除mousemove JQuery事件侦听器
- 在JQuery中使用谷歌地图Api事件/侦听器
- 如何在侦听器之后添加可拖动功能
- 谷歌地图v3侦听器(单击)-更改URL
- 在使用chrome.tabs.onUpdated.addListener后访问给定URL时删除侦听器
- 将事件侦听器添加到带有Class+Popup URL的锚点