2010-02-12 8 views
3

J'ai une application qui a une fenêtre "parent". Dans la fenêtre parent il y a des éléments de menu, comme les suivantes (en utilisant PHP ici):Données persistantes avec 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>"; 

Chaque lien ouvre la page appropriée dans une autre fenêtre « enfant ». Lorsque le parent ferme toutes les fenêtres enfants doivent se fermer. Je l'ai mis en œuvre cette fonctionnalité avec Javascript, voici la fonction:

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'; 
    } 
} 

Voici mon problème, lorsqu'un utilisateur la fenêtre recharge parent et clique puis déconnectez, les fenêtres enfants restent ouvertes. Cela est logique lorsque le tableau childWindow est perdu lorsque le parent est rechargé.

Comment puis-je rendre le tableau childWindow persistant via un rechargement?

Merci!

Répondre

1

Je ne pense pas que vous pouvez rendre un objet JavaScript persistant via un chargement de fenêtre. Au lieu de cela, pourriez-vous créer un gestionnaire d'événements Unload qui ferme vos pages?

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(); 
     } 
    } 
} 

Une autre option pourrait être d'avoir les fenêtres enfants sondage de l'existence du parent.

Dans la fenêtre de l'enfant:

// 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

Jonathon, Merci pour la réponse rapide. Les deux solutions ont leurs mérites. Le premier est sympa car il nécessite une modification en un seul endroit. Le seul problème que je puisse prévoir avec la première solution est qu'un utilisateur peut vouloir conserver ses données sur les fenêtres enfants et simplement recharger la fenêtre parent. La deuxième solution ne fonctionnera probablement pas en raison du comportement de l'utilisateur. Les utilisateurs de mon application sont connus pour simplement cliquer sur les boutons, et, par conséquent, pourraient accidentellement fermer le parent et m'appeler avec un rapport de bug :-). S'il n'y a aucun moyen de faire persister les données, j'irai avec l'option 1. Merci! –

0

Si tout ce que vous voulez faire est de conserver un tableau, utilisez 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]); 
} 
Questions connexes