如果我将回调传递给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
在尝试删除选项卡之前,实际上是否必须添加一个事件侦听器,以便在完全删除选项卡时可以可靠地收到通知?
根据上述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] 删除。
我来说两句