Вы должны быть в состоянии сделать это, если поэкспериментируете со своей оконной структурой.
Всякий раз, когда я сталкивался с этой проблемой, у меня было главное окно, которое всегда существует. Затем при вызове window.open я беру обработчик, который возвращает эта функция, и затем назначаю его главному окну, которое, как я знаю, будет существовать всегда.
Затем, когда я вызываю window.open, я выхожу и проверяю главное окно, чтобы увидеть, есть ли у него обработчик открытого окна для всплывающего окна.
Итак, при условии, что у вас есть это главное окно, которое всегда существует (вы всегда можете использовать окно, в котором используется рамка для отображения вашего реального контента, поэтому для ваших пользователей оно будет выглядеть одинаково), вы можете сделать что-то вроде :
var mainWindow = window;
while(mainWindow != mainWindow.parent){
mainWindow = mainWindow.parent;
}
if(mainWindow.PopupWindow === undefined || mainWindow.PopupWindow.closed){
var handler = window.open('url', 'popup');
mainWindow.PopupWindow = handler;
}
У меня всегда было несколько проблем с использованием свойства closed объекта window, поэтому вам может потребоваться сопоставить функцию с событием onunload во всплывающем окне, которое просто очищает переменную PopupWindow в mainWindow, а затем добавить эта проверка тоже в вашем операторе if.