1

我需要关闭已由父窗口加载的子窗口。
通过 usingwindow.open()方法打开子窗口。
我需要通过单击父窗口中的注销按钮或关闭按钮来关闭此子窗口。
我的代码:

    var childWin = [];
    //child window open event
    function child_open(url)
    {
        childWin[childWin.length] = window.open(url);
    }

    //a logout button or close button event
    function parent_close() 
    {
        for (i=0; i<childWin.length; i++) 
        {
            if (childWin[i] == null) return false;
            childWin[i].close();
        }
        window.close();
    }

如果父窗口不回发到服务器,则此代码是可以的。当父窗口中发生回发时,变量(childWin)的值消失了,我无法通过此代码关闭子窗口。
问题是 -想要关闭子窗口,即使是回发的父窗口。 有解决方案吗?
感谢您的所有兴趣和回复。

4

1 回答 1

1

每次加载页面时,您的数组 childWin 都会被清除。因此,在回发后,数组中将没有任何内容。这就是为什么子窗口没有关闭的原因。

这里提到了一种解决方法

尝试这样的事情[未经测试,不确定它会起作用,试一试:)]

父窗口(所有页面)

var childStatus = {};

子窗口

var timerHandler,
    windowName = window.name,
    popupHandle = "";

funciton ChildCallBack()
{
  try
  {
    if(popupHandle == "" || popupHandle == null)
    {
       popupHandle = window.opener.childStatus[windowName];
       //ChildCallBack(); // no need of ChilCallBack here, since we already have timer
    }
    else
    {
       window.opener.childStatus[windowName] = popupHandle;        
    }
  }
  catch(e)
  {
  }
}

timerHandler = window.setInterval(ChildCallBack, 500);

function window_onclose()
{
  try
  { 
    window.clearInterval(timerHandler);
    window.opener.childStatus[windowName] = null;
  }
  catch(e)
  {
  }
}

window.onclose = window_onclose;

Your Child 开窗功能

//child window open event
    function child_open(url)
    {
        var winHandle = window.open(url, "GIVE SOME UNIQUE NAME FOR EACH WINDOW HERE");
        winHandle.popupHandle = winHandle;
    }

你的关闭按钮事件

//a logout button or close button event
    function parent_close() 
    {
        for (var key in childStatus)
        {
            if (childStatus[key] != null) 
            {
              childStatus[key].close();
            }
        }
        window.close();
    }

查询的可能修复>> 但是,在回发 child 后,在 parent_close() 中发生错误(childStatus[key] 中的值不是对象,它不能执行 childStatus[key].close())

代替

timerHandler = window.setInterval(ChildCallBack, 100);

if(popupHandle == "" || popupHandle == null)
{
   // get the popupHandle from parent window
   popupHandle = window.opener.childStatus[windowName];
   timerHandler = window.setInterval(ChildCallBack, 100);
}
于 2012-07-10T05:19:43.540 回答