【Chrome扩展V3】如何在Chrome扩展中避免重复创建窗口?

程序不使用标准的 “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监听器而导致的,但他们不确定如何解决。

寻求任何建议以防止多个窗口创建。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值