Показать сообщение отдельно
  #1 (permalink)  
Старый 20.12.2020, 08:33
Новичок на форуме
Отправить личное сообщение для romt Посмотреть профиль Найти все сообщения от romt
 
Регистрация: 20.12.2020
Сообщений: 2

window.opener и перегрузка
При перезагрузке материнского окна теряется ссылка на дочернее окно. Как сохранить?

Подробнее.
Есть страница с данными. Если надо что-то изменить, по кнопке вызывается дочернее окно. Дочернее окно посылает данные на сервер, и после подтверждения сервера перезагружает себя и материнскую страницу.
Но при этом, если закрывают/перезагружают материнскую страницу саму по себе, она должна за собой все дочерние окна закрыть.

Реализовано было так (довольно давно):

На материнской странице:
<script>
 
// переменная дочернего окна
var subWin;
 
// флаг, закрывать ли дочернее окно
var subWindowsClose = true;
 
// функция открытия дочернего окна
function openSubWindow()
{
    subWin = window.open('editingdata.html');
}
 
// функция закрытия дочернего окна при закрытии/перезагрузке
// при условии установки флага
window.onunload = function() {
    if(subWinClose == true) {
        if(typeof subWin !== 'undefined') { subWin.close(); };
    };
};
 
</script>


На дочерней странице
<script>
function windowsReload() {
    window.opener.subWinClose = false;
    window.opener.location.reload();
    window.location.reload();
};
</script>


При корректном внесении данных на дочерней странице вызывается функция windowsReload, которая устанавливает на материнской странице флаг "не закрывать дочернее окно", и перезагружает всё.

Ныне все мануалы рекомендуют глобальные переменные не юзать. Как в этом случае обойтись без них - придумать не могу. Ну ладно, хотя бы спрятал их в объект по образцу https://learn.javascript.ru/global-object

Проблема в том, что если переменную дочернего окна объявлять по современному, через let, при перезагрузке значение теряется (даже в глобальном объекте). Я проверял. undefined.
То есть после первой перезагрузке материнского окна, дочерние уже не закрываются сами.

Что можно придумать, что бы осовременить (убрать устаревший var), но сохранить функциональность?

Можно, конечно, вместо создания отдельных дочерних окон перенести всё в материнскую страницу, сделать там области для редактирования и т.д. Но это много работы, пока сложно с этим.

Последний раз редактировалось romt, 20.12.2020 в 08:38.
Ответить с цитированием