仅当窗口未打开时才使用window.open函数。

7
我网站上有一个链接,点击它会打开一个新窗口播放非常长的音频文件。我的当前脚本可以很好地打开页面,并且如果多次点击链接不会刷新。然而,当我移动到网站上的另一个页面并再次点击此链接时,它会重新加载。我知道当父元素改变时,我会失去我的变量,因此我需要打开窗口,覆盖现有内容。我正在尝试找到解决方法。我希望不使用cookie来实现这一点,但如果必要,我会使用它。
我的脚本如下:
function OpenWindow(){
    if(typeof(winRef) == 'undefined' || winRef.closed){
    //create new
    winRef = window.open('http://samplesite/page','winPop','sampleListOfOptions');
    } else {
    //give it focus (in case it got burried)
     winRef.focus();
    } 
}

1
需要一个 cookie 或服务器端会话值,否则根据你所述,当你导航离开时,所有变量都将丢失在父页面中。 - Passerby
1
你是否尝试先调用 winRef = window.open("", "winPopup") (如果存在窗口,则应返回该窗口而不重新加载),仅当 winRef 为 null 时,才创建新窗口 window.open("http://url", "winPopup", "params") - Stan
你能否展示一下在我的函数中该怎么写? - Tyler Demerchant
@TylerDemerchant,你在评论中没有提到我,所以我没有收到通知;-)。我现在发布答案... 完成了。 - Stan
3个回答

7

您首先需要调用 winRef = window.open("", "winPopup") 而不带 URL - 这将返回一个窗口,如果存在就不会重新加载。只有当 winRefnull 或空白窗口时,才创建新窗口。

以下是我的测试代码:

var winRef;

function OpenWindow()
{
  if(typeof(winRef) == 'undefined' || winRef.closed)
  {
    //create new
    var url = 'http://someurl';
    winRef = window.open('', 'winPop', 'sampleListOfOptions');
    if(winRef == null || winRef.document.location.href != url)
    {
      winRef = window.open(url, 'winPop');
    }
  }
  else
  {
    //give it focus (in case it got burried)
    winRef.focus();
  } 
}

它有效。


这真的非常棒。非常感谢你! - Georgii Ivankin
1
很不幸,对我来说它只在Chrome和IE(9)中有效,而在Firefox(26)中无效。 - Georgii Ivankin
@GeorgiyIvankin,我认为您可以发布一个新问题并提供问题的详细信息。 - Stan

2

感谢Stan和http://ektaraval.blogspot.ca/2011/05/how-to-set-focus-to-child-window.html

我的解决方案创建了一个突破式的弹出式mp3播放器,它在整个站点上保持活动状态,并且只有在单击链接按钮之前窗口未打开时才刷新。

function OpenWindow(){
    var targetWin = window.open('','winPop', 'sample-options');
    if(targetWin.location == 'about:blank'){
        //create new
        targetWin.location.href = 'http://site/megaplayer';
        targetWin.focus();
    } else {
        //give it focus (in case it got burried)
        targetWin.focus();
    } 
}

@Stan - 在看到你的回复之前,这就是我想到的。我觉得我们两个人同时在发布。有没有什么特别的原因让我使用你的例子而不是我的? - Tyler Demerchant
不,我认为你的没问题。我的只是一个快速的例子,当我看到你的评论缺少@username时就写了出来;它只是为了向你展示主要思想,而你的变体也完美地遵循了它。 - Stan

1

就像你所说的,离开原始页面后,你会失去对你可能打开的窗口的追踪。

据我所知,没有办法“恢复”对特定窗口的引用。你可能(使用cookie、服务器端会话或其他方式)知道该窗口已经打开,但是你永远无法从不同的页面(即使在同一域中)直接访问它。这种已经打开的窗口之间的通信可以通过ajax和服务器端代码的帮助来模拟,这将在两个窗口之间共享某些信息时充当代理。然而,这并不是一个简单或干净的解决方案。


请查看上面的解决方案,它有效,因此此答案无效。 - Shobhit Verma

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