javascript - 在 Chrome 扩展中,为什么当调用传递给 chrome.tabs.remove() 的回调时,关闭的选项卡仍然存在?

标签 javascript google-chrome google-chrome-extension

如果我将回调传递给 chrome.tabs.remove(),我希望在从 UI 中删除选项卡后调用该回调以及当前的 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 添加事件监听器,以便在选项卡完全删除时能够可靠地通知我?

最佳答案

基于wOxxOm's comment上面,这看起来确实像是 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}`);

(有一种潜在的边缘情况,这无法处理用户在您的扩展程序完全相同的时刻关闭选项卡的情况,但这可能不值得担心。)

关于javascript - 在 Chrome 扩展中,为什么当调用传递给 chrome.tabs.remove() 的回调时,关闭的选项卡仍然存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59539170/

相关文章:

javascript - 如何使用 jQuery 设置 ajax post 的最大执行时间?

jquery - 拖放在 IE 上工作正常,但在 Chrome/Firefox 上不行

javascript - 通过服务器消息单击按钮

javascript - 如何将类从 chrome 扩展应用到事件标签页

javascript - 发送 ajax 请求检索整个页面时未获得完整响应

php - Ajax/jQuery 到 PHP 又回来了?

javascript - 自定义 onbeforeunload 消息

javascript - 自动点击 setTimeout() 不起作用 JS

html - 使用离线 HTML5 应用程序包含数据(将填充 IndexedDB)的最佳方式?

javascript - html5 getUserMedia() 纵向模式