Javascript chrome.tabs.onUpdate是否返回不存在的选项卡id?

Javascript chrome.tabs.onUpdate是否返回不存在的选项卡id?,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,所以我会在标签更新时跟踪它们,并将每个标签存储在一个数组中。然而,有时候,也只是有时候,一个不存在的id会被传递出去,而我无法用我的一生来理解它。这是一个已知的chrome bug还是我只是遗漏了什么?非常感谢 chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,currentTab){ //Find the containing window in the array of windows var contai

所以我会在标签更新时跟踪它们,并将每个标签存储在一个数组中。然而,有时候,也只是有时候,一个不存在的id会被传递出去,而我无法用我的一生来理解它。这是一个已知的chrome bug还是我只是遗漏了什么?非常感谢

chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,currentTab){
    //Find the containing window in the array of windows
    var containingWindow = windows.filter(function(currentWindow){
        return currentWindow.id===currentTab.windowId;
    });
    if (containingWindow.length===1){
        containingWindow = containingWindow[0];
        //Find the containing tab (by id) in our list of tabs.
        var containingTab = containingWindow.tabs.filter(function(currentTab){
            return currentTab.id===tabId;
        });
        if (containingTab.length===1){
            console.log("It worked!");
        }
        else{
            //At this point, there's no reason for it NOT to work, but sometimes an id gets thrown that doesn't exist.
            debugger;
            throw "Argh the bug is still there matey! "+containingTab.length+" "+containingTab+" "+tabId;;
        }
    }

});

那么,您的代码将无法工作,因为您在创建时存储在数组中的窗口对象不是这些窗口的实时版本,而是快照。它们的选项卡列表不会更新

如果出于任何原因需要有关包含选项卡的窗口的更新信息,请调用chrome.windows.get:


你从哪里获得窗口?这是我创建的一个称为“窗口”的数组,窗口通过chrome.windows.onCreate添加到所述数组中,选项卡通过chrome.tabs.onCreate添加到对象中包含的“选项卡”数组中。我知道这一点。这就是为什么我要利用onUpdate事件来更新这些选项卡。但是,onUpdate返回以前不存在的选项卡。举个例子,比如说,我有tab 1860,它会告诉我tab 1862被更新了,而实际上它是tab 1860。它为该选项卡返回了错误的id。我正在解释您提供的代码中的错误。您提到的问题可能是因为您不收听onReplaced事件-Chrome有时会制作预渲染的选项卡,并替换现有的选项卡。我想预渲染的选项卡不会得到一次创建的事件。事实上可能就是这样。我来看看你的照片。非常感谢。问题是,为什么你们甚至需要用这种方式跟踪所有打开标签的列表?一个标签管理器。存储和调用它们比等待Chrome的功能要好得多,这可能需要一些时间:
chrome.windows.get(
  currentTab.windowId,
  {populate: true},
  function(window) {
    /* ... */
  }
);