当前不能查询标签页(用户可能正在拖动标签页)。

9

我有一个Chrome扩展程序,通过下面的代码访问活动选项卡:

    chrome.tabs.query({ active: true }, (result) => { ... })

这一直非常有效,直到最近更新,现在我无法查询该选项卡,并且控制台打印出以下错误:

Tabs cannot be queried right now (user may be dragging a tab).

我尝试了这个方法,但它没有起作用。有什么建议吗?


你链接的解决方案是唯一可行的,它可以工作,但你可能需要增加超时时间。 - wOxxOm
1
我也遇到了同样的问题。之前几个月一切都正常,现在突然出现了这个奇怪且无用的错误信息。我猜测是API发生了变化。 - I0_ol
1
好的,Google刚刚更新了API并发布了清单版本3。这不应该对当前扩展程序造成任何问题,但显然它确实造成了影响。 - I0_ol
4个回答

2
我正在开发一个相当复杂的扩展程序,其涉及到大量标签查询。添加任意延时并不能帮助解决问题,特别是当用户实际上在拖动标签时。在遇到browser.runtime.lastError错误时,在短暂延迟后重新运行该函数似乎是有效的。
function doStuffWithTabs() {
  browser.tabs.query({ active: true, currentWindow: true }, (tab) => {
    if (browser.runtime.lastError) {
      console.log('fail');
      window.setTimeout(() => doStuffWithTabs(), 100);
    } else {
      console.log('win');
    }
  });
}

1

我相信你已经使用了manifest v2构建了你的扩展程序。 尝试通过chrome.runtime.lastError避免这个错误。如果你在代码中使用了chrome.tabs.onUpdated.addListener(...)或其他监听器方法,那么请按照以下方式更新它,以便不会抛出此错误。

chrome.tabs.onUpdated.addListener( (tabId, statusInfo, tabInfo) => {
   //this will prevent it from throwing the error
   if (chrome.runtime.lastError) {}
   //rest of your code 
})

在您的代码的任何其他地方或在chrome.tabs.onUpdated.addListener(...)侦听器内,如果您正在使用chrome.tabs.query({ active: true }, (result) => { ... }),则还需要像下面这样更新它:
chrome.tabs.query({active: true}, result => {
   //this will prevent it from throwing the error
   if (chrome.runtime.lastError) {}
   //rest of your code 
})

1
这将抑制错误,但不会使查询API执行操作,因此代码路径仍然存在问题。 - marcodb

1
我发现真正的原因是:当你点击鼠标切换标签时,执行 chrome.tabs.query 时,左键还没有被释放,可能会有非常小的位移,导致 Chrome 认为你正在拖动标签而不是点击它们。
你可以尝试这样做:先放开鼠标,然后快速点击一个标签进行切换,这时一切都正常。
使用网友提供的 setTimeout 方法确实可以解决这个问题,因为过了 200 毫秒后,你的鼠标很可能已经完成了点击,从而消除了拖拽的怀疑。
无论如何,我认为这个 Chrome 的更新是一个失败的尝试。

我很惊讶,但我认为这个鼠标交互概念可能有些道理。如果我使用Ctrl+Tab和Ctrl+Shift+Tab在测试我的扩展程序的选项卡之间切换,并返回到我的扩展程序的错误日志,它似乎不会记录任何扩展程序错误。 - patridge

0
这段代码对我有效:
chrome.tabs.query({ url: 'YOUR_URL_HERE' }, function (tabs) {
    // This one prevents the "Tabs cannot be queried right now (user may be dragging a tab)."
    if (!chrome.runtime.lastError) {}
    if (tabs) {
        tabs.forEach(tab => {
            chrome.tabs.sendMessage(tab.id, { command, data }, function (response) {
                // This one prevents the Tabs undefined errors...
                if (!chrome.runtime.lastError) {}
            });
        });
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接