在Chrome扩展程序中,调用回调传递给chrome.tabs.remove()时,为什么关闭的标签仍然存在?

jdunning

如果我将回调传递给chrome.tabs.remove(),我希望一旦从用户界面当前Chrome状态中删除了选项卡,就会调用该回调换句话说,如果我在具有该tabs权限的扩展程序的后台页面中运行以下代码,则我希望它会生成错误,因为试图获取不存在的选项卡会导致runtime.lastError

var tabs = [];
for (var i = 0; i < 3; i++) {
    chrome.tabs.create({ url: "chrome://newtab" }, tab => tabs.push(tab));
}

setTimeout(() => {
    var {id} = tabs[1];
    chrome.tabs.remove(id, () => chrome.tabs.get(id, 
        tab => console.log(id, tab)));
}, 2000);

但是,事实并非如此。将打开三个新的空白标签,两秒钟后关闭第二个空白标签,但是在调用chrome.tabs.get()传递给的回调时仍返回已关闭的标签chrome.tabs.remove()您将在回调中看到已删除选项卡的完整详细信息记录到控制台。

这似乎是Chrome中的错误。会有哪些可能的用途可以在回调chrome.tabs.remove()被调用之前的标签被删除?chrome.tabs.onRemoved在尝试删除选项卡之前,实际上是否必须添加一个事件侦听器,以便在完全删除选项卡时可以可靠地收到通知?

jdunning

根据上述wOxxOm的 评论,这看起来像是Chrome中的错误或延迟实现,我唯一看到的解决方法是为添加事件监听器onRemoved

我最终在扩展程序的弹出窗口打开时添加了一个事件处理程序,但是如果您只想在扩展程序关闭选项卡时收到通知,则可以在完全删除选项卡后使用类似的方法来回叫:

function closeTab(tabID, callback)
{
    function handleTabRemoved(tabID, removeInfo)
    {
        chrome.tabs.onRemoved.removeListener(handleTabRemoved);
        callback(tabID, removeInfo);
    }

    chrome.tabs.onRemoved.addListener(handleTabRemoved);
    chrome.tabs.remove(tabID);
}

closeTab(123, tabID => console.log(`Closed ${tabID}`);

(在可能的情况下,这可能无法处理用户在扩展程序同时关闭选项卡的位置,但这可能不值得担心。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档