2010-02-12 4 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'; 
    } 
} 

Вот моя проблема, когда пользователь перезагружает родительское окно, а затем нажимает выход из системы, дочерние окна остаются открытыми. Это имеет смысл, поскольку массив childWindow теряется при перезагрузке родителя.

Как я могу сделать массив childWindow постоянным через перезагрузку?

Спасибо!

ответ

1

Я не думаю, что вы можете сделать объект JavaScript сохраненным через нагрузку на окно. Вместо этого вы могли бы сделать обработчик события unload, который закрывает ваши страницы?

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. Спасибо! –

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]); 
} 
Смежные вопросы