Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   window.opener и перегрузка (https://javascript.ru/forum/events/81587-window-opener-i-peregruzka.html)

romt 20.12.2020 08:33

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), но сохранить функциональность?

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

voraa 20.12.2020 10:08

Событие unload само по себе ненадежно. Оно возникает, но выгрузка страницы продолжается не дожидаясь пока отработает обработчик события. Так, что данные могут уже потеряться.
Лучше попробовать использовать события beforeunload или pagehide

Aetae 20.12.2020 12:17

Глобальные переменные плохо, только если их использовать там где не надо.(т.е. почти везде)
Но в конкретных случаях их вполне можно использовать. Как в вашем. Альтернатива просто не стоит того, чтобы городить огород. Разве что вместо
var subWindowsClose = true;
явно задавайте
window.subWindowsClose = true;

romt 21.12.2020 15:37

Цитата:

Сообщение от Aetae (Сообщение 531943)
вместо
var subWindowsClose = true;
явно задавайте
window.subWindowsClose = true;

Спасибо, идея.
Меня больше не глобальные переменные пугают, а то, что var - deprecated.
Вдруг ещё годик, и код работать перестанет.
Попробую менять на windows.


Часовой пояс GMT +3, время: 16:41.