代码之家  ›  专栏  ›  技术社区  ›  Feyyaz Phill Pafford

父页更改后的窗口引用

  •  4
  • Feyyaz Phill Pafford  · 技术社区  · 14 年前

    我正在使用window.open函数打开一个命名窗口:

    win = window.open("xxx.html", "mywin");
    

    之后,我从父窗口移到另一个页面,我想确定名为“mywin”的窗口是否仍然打开。

    如果我在父页面中,我会使用win.closed,但是由于我更改了页面,我丢失了引用。我怎样才能把它拿回来?:)

    谢谢。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Lee Hesselden    14 年前

    我能想到两种可能值得尝试的方法。。。

    首先,可以让子窗口与父窗口对话,而不是让父窗口与子窗口对话。当页面转换时,父窗口将丢失对子窗口的引用,子窗口应该仍然能够通过window.opener返回到新页面(只要它仍然在同一域中)。孩子可以使用“设置间隔”来访问打开的窗口并设置“仍然打开”状态。您必须以这样的方式对其进行编码,以便能够处理在转换加载期间没有文档的情况,但它可以工作。代码大致如下所示,但您可以通过处理子级的父级加载和卸载事件并仅在转换之间运行计时器来优化此代码。

    父窗口(所有页)

    var childStatus = "unknown";
    

    子窗口

    var timerHandler;
    
    funciton ChildCallBack()
    {
      try
      {
        window.opener.childStatus = "open";
      }
      catch(e)
      {
      }
    }
    
    timerHandler = window.setInterval(ChildCallBack, 100);
    
    function window_onclose()
    {
      try
      { 
        window.clearInterval(timerHandler);
        window.opener.childStatus = "closed";
      }
      catch(e)
      {
      }
    }
    
    window.onclose = window_onclose;
    

    其次,理想情况下,作为最后的手段,另一个非常可怕的替代方法是使用iframe。将正在转换的页面放在iframe中,这样实际的主页就不会更改,从而可以维护对子级的引用。iframe可以足够大,看起来像一个完整的页面。这是一个讨厌的黑客式解决方案,但也应该工作。

        2
  •  0
  •   bjornd    14 年前

    尝试使用window.open方法的第二个参数window name作为变量名:

    win = window.open("xxx.html", "mywin");
    

    mywin.close();