Javascript 如何同时使用onUpdated和onActivated?
在我的扩展中,background.js中有一个未更新的侦听器,它将一些带有XHR和XPath的数据拉入文本 但是,如果我激活了一个旧选项卡,而不在其中执行任何操作,只需单击选项卡栏中的选项卡,就不会触发onUpdated,并且我已经从以前打开的选项卡中获取了徽章数据 同样的情况也发生在旧标签上,它们被丢弃了。如果我再次在选项卡栏中单击他们的选项卡,不执行任何更新的操作都不会被触发 看起来,onUpdated不包括选项卡的激活 我如何同时使用OnUpdate和onActivated来报道我描述的事件?或者是否有其他方法捕获选项卡事件,我只需单击选项卡栏中的选项卡 我想将我的XHR和setBadgeText操作绑定到onUpdate和onActivated,因此简单地单击选项卡栏中的选项卡也会成为触发器。在其他情况下,我应该强制扩展的用户手动刷新页面以获取新数据 PS:这是background.jsJavascript 如何同时使用onUpdated和onActivated?,javascript,google-chrome-extension,Javascript,Google Chrome Extension,在我的扩展中,background.js中有一个未更新的侦听器,它将一些带有XHR和XPath的数据拉入文本 但是,如果我激活了一个旧选项卡,而不在其中执行任何操作,只需单击选项卡栏中的选项卡,就不会触发onUpdated,并且我已经从以前打开的选项卡中获取了徽章数据 同样的情况也发生在旧标签上,它们被丢弃了。如果我再次在选项卡栏中单击他们的选项卡,不执行任何更新的操作都不会被触发 看起来,onUpdated不包括选项卡的激活 我如何同时使用OnUpdate和onActivated来报道我描述的
同时使用侦听器和一个执行此任务的公共函数。为了避免在全局对象中重复调用set tabId的处理状态,请在完成时清除它
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
if (changeInfo.url) run(tab);
});
chrome.tabs.onActivated.addListener(info => {
chrome.tabs.get(info.tabId, run);
});
const processingTabId = {};
function run(tab) {
if (processingTabId[tab.id]) return;
processingTabId[tab.id] = true;
let newUrl = new URL(tab.url);
currentHost = newUrl.host;
currentUrl = tab.url;
doSomeAsyncStuff(() => {
//................................
// when all done:
delete processingTabId[tab.id];
});
}
注意,不需要chrome.tabs.query,因为onUpdate已经为您提供了选项卡对象。此外,不仅活动选项卡获得更新,非活动选项卡也获得更新。不仅报告URL,还报告favicon、title、mute state和许多其他内容。啊,这是同时使用它们的方法!好的,我去测试一下。非常感谢。顺便说一句,为什么要删除ProcessingTaid?请您解释一下,doSomeAsyncStuff=>{?我试图将整个XHR部分放在其中,但这导致我发现doSomeAsyncStuff没有定义……没有doSomeAsyncStuff这样的东西,它是您可能拥有的任何代码的一个虚构的替代名称。我添加它只是为了让它在执行删除操作时更加明显。这是否意味着删除应该在XHR.send之后进行;还是在XHR.onre之后进行adystatechange?它应该在回调中,因为它会稍后运行,异步代码就是这样工作的。例如,在设置图标之后。
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
if (changeInfo.url) run(tab);
});
chrome.tabs.onActivated.addListener(info => {
chrome.tabs.get(info.tabId, run);
});
const processingTabId = {};
function run(tab) {
if (processingTabId[tab.id]) return;
processingTabId[tab.id] = true;
let newUrl = new URL(tab.url);
currentHost = newUrl.host;
currentUrl = tab.url;
doSomeAsyncStuff(() => {
//................................
// when all done:
delete processingTabId[tab.id];
});
}