查找之前由window.open打开的窗口

24
我们现在面临的情况是来自单个域名的运行:
页面A使用window.open()打开一个命名窗口(弹出式播放器)。window.open()提供页面A对该窗口的引用。
用户现在重新加载页面A。对该命名窗口的引用丢失了。使用window.open()“查找”窗口会不幸地重新加载它(不希望发生)。是否有其他方法可以获得对此窗口的引用?

哇,今天早上就开了一个几乎和这个问题完全相同的问题。 - Pointy
2
你能在这里发帖吗?我找不到它。 - spender
6个回答

28

试一下这个:

var playerUrl = 'http://my.player...';
var popupPlayer= window.open('', 'popupPlayer', 'width=150,height=100') ;
if(popupPlayer.location.href == 'about:blank' ){
    popupPlayer.location = playerUrl ;
}
popupPlayer.focus();

它将打开一个唯一命名的空白窗口。由于URL为空,窗口的内容将不会重新加载。


这看起来很不错。我有机会的时候会试一下。 - spender
2
我建议使用popupPlayer.location.href而不是popupPlayer.location。这样可以避免在使用===时出现问题(例如,CoffeeScript会自动执行此操作)。 - Philipp
如果弹出窗口的URL不在当前窗口所在的域内,可能会出现问题。使用try/catch包装IF语句以避免出现问题。 - Derek Wade

1

据我所知,是没有的。

一种有点“肮脏”,但我想它可以工作的方法是,使用 window.opener 在弹出窗口中定期重置父窗口的引用,例如以下代码:

    setInterval(function() {
        if(window.opener) {
            window.opener.document.myPopupWindow = window
        }
    }, 100)

在父窗口中,您将能够访问 document.myPopupWindow,即使在重新加载后(好吧,在重新加载后的100毫秒后)。这应该可以跨浏览器工作。


是的,我已经检查过了。然而,当打开的窗口关闭时,使用上述代码每秒会出现10个空指针。已经修改代码以检查空指针 :) - Alexander Malfait
一旦找到窗口,你不能停止间隔吗?! - Josh Stodola
Josh: 不行,那样在父窗口重新加载一次以上后就不能起作用了。 - Alexander Malfait

0

如果您打开了一个子选项卡,并在刷新父选项卡后,仍然希望集中注意力放在该子选项卡上而不是打开新的子选项卡,这可能会对某些人有所帮助:

const chatPopup = window.open('', 'chatPopup');
if (chatPopup.location.href === 'about:blank' || !chatPopup.location.href.includes('/chat')) {
  this.openNewWindow = window.open('/chat', 'chatPopup');}

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0

这应该可以工作。在弹出窗口中添加此代码:

function updateOpener() {
    if (window.opener)
        window.opener.document.myPopupWindow = window;
    else
        setTimeout(updateOpener, 100);
}

updateOpener(); 

这是在父窗口的onload事件中。为了确保myPopupWindow已经设置好,请等待100毫秒再访问它。

setTimeout(function() {
    if (document.myPopupWindow) 
        document.myPopupWindow.focus();
}, 100);

0

0

实际上你所做的是销毁了创建窗口(弹出窗口)的父级页面A,因此它没有指向原始父级的引用,因此您无法获得直接引用。

我能想到的唯一解决方法是使用一个提供了额外javascript能力以遍历活动窗口(标签页)并找到具有特殊属性(例如:重新加载的页面A)的窗口的浏览器,以便被弹出窗口识别。

不幸的是,我猜只有火狐浏览器有一些增加功能或扩展可以提供这种灵活性。(但这也是一种安全风险)


不行,需要兼容多个浏览器。 - spender

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接