如果我将回调传递给 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/