flo*_*flo 5 javascript google-chrome-extension
这是我的问题:我正在为Gmail开发Chrome扩展程序,并且需要在更新扩展程序时应用一些更改.
例如,我想确保在扩展程序更新后,扩展程序会在Gmail中显示警告对话框.这意味着要检查Gmail在更新时是否已在Chrome窗口中打开,如果没有创建侦听器以便等待将来加载Gmail,然后再显示警告对话框.
下面的代码就是这样.但是,当发现新的Gmail选项卡时,我无法删除侦听器(chrome.tabs.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?
}
});
}
});
});
}
// [...]
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
有关信息,由于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;
}
}
Run Code Online (Sandbox Code Playgroud)
[更新]答案
如果有人遇到同样的问题,这里是@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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
为了能够删除侦听器,请不要将其实现为匿名函数.将其实现为"命名"函数,允许您在调用时更改它removeListener()
.
例如:
/* 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);
Run Code Online (Sandbox Code Playgroud)
顺便说一下,(与你的问题无关,但是)你正在做几个超级电话:
您不需要获取当前窗口然后获取其选项卡,如下所示:
chrome.windows.getCurrent(function(win) {
var cwin = win.id;
chrome.tabs.query({windowId: cwin}, function(tabs) {
...
Run Code Online (Sandbox Code Playgroud)
您可以在一个调用中执行此操作,如下所示:(
另请参阅chrome.windows.getCurrent())
chrome.window.getCurrent({ populate: true }, function(win) {
var tabs = win.tabs;
...
Run Code Online (Sandbox Code Playgroud)
或者甚至像这样:(
另见chrome.tabs.query())
chrome.tabs.query({ currentWindow: true }, function(tabs) {
...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3635 次 |
最近记录: |