如何恢复Chrome扩展已打开窗口焦点而非新建窗口?(Manifest 3)
解决方案
要实现点击扩展图标时复用已有窗口而非新建,核心逻辑是先查询是否存在本扩展的目标窗口,存在则激活,不存在再创建。以下是适配Manifest V3的完整代码:
chrome.action.onClicked.addListener(async () => { const popupUrl = chrome.runtime.getURL("popup.html"); // 查询所有窗口,包含未聚焦的窗口 const windows = await chrome.windows.getAll({ includeUnfocused: true }); // 筛选出包含目标popup页面的窗口 const existingPopupWindow = windows.find(window => window.tabs.some(tab => tab.url === popupUrl) ); if (existingPopupWindow) { // 激活已有窗口 await chrome.windows.update(existingPopupWindow.id, { focused: true }); } else { // 创建新窗口 await chrome.windows.create({ url: popupUrl, type: "popup", width: 250, height: 250, }); } });
关键细节说明
- 使用
chrome.windows.getAll({ includeUnfocused: true }):确保能获取到所有状态的窗口,包括未被聚焦的扩展窗口,避免漏判。 - 通过
window.tabs.some(tab => tab.url === popupUrl)精准匹配本扩展的popup页面:防止误激活其他域名或扩展的窗口。 - 改用
async/await语法:相比回调函数,让异步逻辑更清晰易读,符合Manifest V3的现代代码风格。
内容的提问来源于stack exchange,提问作者Mostafa Nobaqi
相关产品推荐
相关产品推荐

