Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何同时使用onUpdated和onActivated?_Javascript_Google Chrome Extension - Fatal编程技术网

Javascript 如何同时使用onUpdated和onActivated?

Javascript 如何同时使用onUpdated和onActivated?,javascript,google-chrome-extension,Javascript,Google Chrome Extension,在我的扩展中,background.js中有一个未更新的侦听器,它将一些带有XHR和XPath的数据拉入文本 但是,如果我激活了一个旧选项卡,而不在其中执行任何操作,只需单击选项卡栏中的选项卡,就不会触发onUpdated,并且我已经从以前打开的选项卡中获取了徽章数据 同样的情况也发生在旧标签上,它们被丢弃了。如果我再次在选项卡栏中单击他们的选项卡,不执行任何更新的操作都不会被触发 看起来,onUpdated不包括选项卡的激活 我如何同时使用OnUpdate和onActivated来报道我描述的

在我的扩展中,background.js中有一个未更新的侦听器,它将一些带有XHR和XPath的数据拉入文本

但是,如果我激活了一个旧选项卡,而不在其中执行任何操作,只需单击选项卡栏中的选项卡,就不会触发onUpdated,并且我已经从以前打开的选项卡中获取了徽章数据

同样的情况也发生在旧标签上,它们被丢弃了。如果我再次在选项卡栏中单击他们的选项卡,不执行任何更新的操作都不会被触发

看起来,onUpdated不包括选项卡的激活

我如何同时使用OnUpdate和onActivated来报道我描述的事件?或者是否有其他方法捕获选项卡事件,我只需单击选项卡栏中的选项卡

我想将我的XHR和setBadgeText操作绑定到onUpdate和onActivated,因此简单地单击选项卡栏中的选项卡也会成为触发器。在其他情况下,我应该强制扩展的用户手动刷新页面以获取新数据

PS:这是background.js


同时使用侦听器和一个执行此任务的公共函数。为了避免在全局对象中重复调用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];
  });
}