Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 20.12.2020, 10:08
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Событие unload само по себе ненадежно. Оно возникает, но выгрузка страницы продолжается не дожидаясь пока отработает обработчик события. Так, что данные могут уже потеряться.
Лучше попробовать использовать события beforeunload или pagehide
Ответить с цитированием
  #3 (permalink)  
Старый 20.12.2020, 12:17
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Глобальные переменные плохо, только если их использовать там где не надо.(т.е. почти везде)
Но в конкретных случаях их вполне можно использовать. Как в вашем. Альтернатива просто не стоит того, чтобы городить огород. Разве что вместо
var subWindowsClose = true;
явно задавайте
window.subWindowsClose = true;
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 21.12.2020, 15:37
Новичок на форуме
Отправить личное сообщение для romt Посмотреть профиль Найти все сообщения от romt
 
Регистрация: 20.12.2020
Сообщений: 2

Сообщение от Aetae Посмотреть сообщение
вместо
var subWindowsClose = true;
явно задавайте
window.subWindowsClose = true;
Спасибо, идея.
Меня больше не глобальные переменные пугают, а то, что var - deprecated.
Вдруг ещё годик, и код работать перестанет.
Попробую менять на windows.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Onchange и Window.opener DarknesS Элементы интерфейса 7 26.05.2016 21:47
Правильная перегрузка метода-обработчика события Novascriptum Общие вопросы Javascript 3 13.07.2014 22:39
перегрузка функций jquery challenger jQuery 4 07.05.2013 18:44
огнелис и window.opener LRCenter Firefox/Mozilla 2 13.05.2011 19:01
перегрузка попапов magistr_bender Общие вопросы Javascript 4 02.07.2009 00:10