2010-02-12 71 views
3

我有一个具有“父”窗口的应用程序。在父窗口中有菜单项,如下所示(使用PHP这里):使用Javascript的持久数据

// sample link 
echo "<li><a href=\"#\" onclick=openurl('covershift.php');>Shift Coverage</a></\ 
li>"; 

// logout link 
echo "<li><a href=\"#\" onclick=openurl('logout');>Logout</a></li>"; 

每个链接打开相应的页面在不同的“孩子”窗口。父母关闭所有子窗口时必须关闭。我已经实现用javascript这个功能,这里是功能:

var childWindow = new Array(); 
var windowCount = 0; 
function openurl(url) 
{ 
    if(url != 'logout') { 
    childWindow[windowCount]=window.open(url,'_blank','height=600,width=800,scr\ 
ollbars=1'); 
    windowCount++; 
    if (window.focus) { 
     childWindow.focus(); 
    } 
    } else { 
    var iCount; 
    for (iCount=0; iCount < windowCount; iCount++) { 
     if ((childWindow[iCount] != null) && !(childWindow[iCount].closed)) { 
     childWindow[iCount].close(); 
     } 
    } 
    window.location='logout.php'; 
    } 
} 

这里是我的问题,当用户重新加载父窗口,然后点击退出,子窗口继续开放。这是有道理的,因为child重新加载时,childWindow数组会丢失。

如何使childWindow数组通过重新加载持久化?

谢谢!

回答

1

我不认为你可以通过窗口加载使JavaScript对象持久化。相反,你可以创建一个关闭页面的卸载事件处理程序吗?

window.onunload = myCloseFunction; 
function myCloseFunction() 
{ 
    // Just copying your code... 
    var iCount; 
    for (iCount=0; iCount < windowCount; iCount++) { 
     if ((childWindow[iCount] != null) && !(childWindow[iCount].closed)) { 
     childWindow[iCount].close(); 
     } 
    } 
} 

另一种选择可能是有父存在的子窗口调查。

在子窗口:

// Checks every 1 second for valid window.opener 
var parentChecker = setInterval(function(){ 
    if(!opener){ 
     // Is this good practice? I don't know! 
     clearInterval(parentChecker); 
     window.close(); 
    } 
}, 1000); 
+0

乔纳森, 感谢您的及时答复。两种解决方案都有其优点。第一个很好,因为它只需要在一个地方进行修改。我可以预见的第一个解决方案唯一的问题是,用户可能想要保留他们的数据在子窗口上,并重新加载父窗口。由于用户行为,第二种解决方案可能不起作用。我的应用程序的用户因为单击按钮而臭名昭着,因此可能会意外关闭父母并用错误报告给我打电话:-)。如果没有办法使数据持续存在,我会选择1.谢谢! – 2010-02-12 23:42:16

0

如果你想要做的就是坚持一个数组,使用http://rhaboo.org

var store = Rhaboo.persistent("My store"); 

window.onunload = function() { 
    store.write('windows', [ ... your array ...]); 
} 

function onLogout() { 
    for (var i=0; i<store.windows.length; i++) 
    closeWindowYourWay(store.windows[i]); 
}