程序不使用标准的 “popup”,而是在用户点击浏览器图标后打开一个新窗口(类型为 “popup”)。但是,当用户多次点击图标而不关闭其他新创建的窗口时,会出现一种类似指数增长的窗口创建数量。例如,第一次点击时,我们得到一个窗口创建(如预期)。第二次点击,我们得到两个窗口创建(总共 3 个),以此类推。
背景.js(Service Worker)代码:
chrome.action.onClicked.addListener((tab) => {
chrome.windows.create({
url: chrome.runtime.getURL(`index.html?currentTabId=${tab.id}`),
type: 'popup'
})
})
App.js 代码:
const port = chrome.runtime.connect(chrome.runtime.id)
port.onMessage.addListener(onMessageListener) // 等等
已尝试的解决方案:
在 Background.js 中尝试将原始的 chrome.action.onClicked 侦听器删除并重新添加侦听器。
在添加侦听器之前检查是否已经有窗口打开。
上述方法都不起作用,似乎每次单击图标时都会添加一个新的侦听器,从而导致窗口数量指数增长。但是,如何防止这种情况发生呢?我们希望每次单击图标时只打开一个窗口。
建议解决方案:
可以尝试修改 Background.js 中的代码,只添加一个侦听器,并在创建新窗口之前检查是否已经有弹出窗口打开。
代码示例如下:
let popupWindowId = null;
chrome.action.onClicked.addListener((tab) => {
if (!popupWindowId) {
chrome.windows.create({
url: chrome.runtime.getURL(`index.html?currentTabId=${tab.id}`),
type: 'popup'
}, (window) => {
popupWindowId = window.id;
});
} else {
chrome.windows.update(popupWindowId, { focused: true });
}
});
chrome.windows.onRemoved.addListener((windowId) => {
if (windowId === popupWindowId) {
popupWindowId = null;
}
});
这段代码添加了一个名为 popupWindowId 的变量,用于跟踪当前打开的弹出窗口的 ID。当单击图标时,它会检查
popupWindowId 是否为 null,如果是,则表示没有打开的弹出窗口。此时,它会创建一个新的弹出窗口并将
popupWindowId 设置为新窗口的 ID。如果 popupWindowId 不为
null,则表示已经有弹出窗口打开,所以它只会将该窗口聚焦,而不是创建新的弹出窗口。正在升级他们的Chrome扩展程序到清单v3,并遇到一些不必要的行为,这可能是由于使用了服务工作者所致。他们希望得到一些帮助。
扩展程序在单击浏览器图标时不使用标准的“弹出窗口”。相反,它会打开一个新窗口(类型为“弹出”),这很棒,但是当没有关闭其他新创建的窗口时多次单击图标时,就会出现一种类似指数级的窗口创建。例如,第一次单击时,会创建一个窗口(预期的行为)。第二次单击时,会创建两个窗口(总共3个窗口),以此类推。
提供了一些代码,他们已经尝试了一些解决方案,但仍然无法解决问题。他们认为问题可能是由于重复添加了chrome.action.onClicked监听器而导致的,但他们不确定如何解决。
寻求任何建议以防止多个窗口创建。