如何使用JavaScript关注从新选项卡打开的弹出窗口

如何使用JavaScript关注从新选项卡打开的弹出窗口,javascript,Javascript,我有一个URL,它使用JavaScript。当我点击该URL时,它将打开一个新的弹出窗口(window.open()),当我从一个新选项卡和同一浏览器点击同一URL时,它将打开一个新的弹出窗口,即使之前的弹出窗口已经打开 那么,有没有办法将焦点放在已经打开的弹出窗口上,而不是从同一浏览器的新选项卡上打开新的弹出窗口?(Un)幸运的是,似乎没有可靠的方法使窗口或选项卡聚焦(请参阅或) 对于您的其他问题(如果新弹出窗口已打开,则不会打开),您有一些基于跨窗口/选项卡通信的选项(假设来源相同): 您

我有一个URL,它使用JavaScript。当我点击该URL时,它将打开一个新的弹出窗口(window.open()),当我从一个新选项卡和同一浏览器点击同一URL时,它将打开一个新的弹出窗口,即使之前的弹出窗口已经打开

那么,有没有办法将焦点放在已经打开的弹出窗口上,而不是从同一浏览器的新选项卡上打开新的弹出窗口?

(Un)幸运的是,似乎没有可靠的方法使窗口或选项卡聚焦(请参阅或)

对于您的其他问题(如果新弹出窗口已打开,则不会打开),您有一些基于跨窗口/选项卡通信的选项(假设来源相同):

  • 您可以在弹出窗口中设置cookie,并在弹出窗口关闭后将其删除(或者更具体地说)。尝试打开新弹出窗口时,请检查cookie是否已设置。这有一些缺陷,比如您无法控制用户打开弹出窗口的次数(手动,无需保护)
  • 您可以实现一种选项卡/窗口通信形式(在中总结)

假设您可以修改弹出窗口,并且它们共享同一来源,则基于的实现可能如下所示(只是为了给您一个想法):

来源:

const bc = new BroadcastChannel('channel_id');
let isPopupOpen = false;

bc.onmessage = (ev) => {
  if (ev.data === 'popup-id-exists') {
    isPopupOpen = true;
  }
};

function openPopup() {
  isPopupOpen = false;
  bc.postMessage('popup-id');
  setTimeout(() => { if (!isPopupOpen) window.open('popup.html') }, 100);
}
从弹出窗口:

const bc = new BroadcastChannel('channel_id');
bc.onmessage = (ev) => {
  if (ev.data === 'popup-id') {
    bc.postMessage('popup-id-exists');
  }
};

假设您可以修改这两个站点,您可以检测弹出窗口何时打开,但我不认为使用JS可以更改选项卡/窗口焦点(至少我希望不可以,这似乎非常有用)