Javascript - перезагрузить страницу после отправки формы с target=_blank

Я пытаюсь добиться следующего:
На странице А у нас есть ссылка с ограниченным доступом к странице Б. Ограничение доступа обрабатывается на стороне сервера в PHP.
Когда пользователь нажимает на эту ссылку, открывается страница Б. мы отображаем модальный диалог на странице A (через javascript) с формой, имеющей ссылку href (B) в качестве действия. (Чтобы дать пользователю немедленную обратную связь. Запасным вариантом является перенаправление его на форму входа, которая перенаправляет его на сайт, к которому он хочет получить доступ.) Эта система работает достаточно хорошо.

Но теперь возникает мой вопрос:
У нас есть ссылки с ограниченным доступом, которые следует открывать в новом окне.
Теперь, если я использую target="_blank" в форме, пользователь остается вне системы на странице, с которой он пришел ( A), которая все еще открыта в фоновом режиме.
Есть ли способ перезагрузить страницу (A, в фоновом режиме) сразу после отправки формы в новое окно (B)?

Моей первой идеей было использовать window.location.reload(); в обработчике отправки на странице A.
Это не работало в chrome и, насколько я понимаю, могло создать состояние гонки.

Другой идеей было бы войти в систему через вызов ajax и открыть новое окно через javascript. Есть ли способ сделать это, не имея дело с блокировщиками всплывающих окон?


Я реализовал идею LostSource (см. ниже) с одним небольшим дополнением.
Поскольку мне нужно перезагрузить только один раз, таймер setInterval можно остановить, если cookie изменился.

var ri=setInterval(function() {  
    if(oldCookie != document.cookie) {  
        // assuming a login happened, reload page  
        clearInterval(ri);  
        window.location.reload();  
    }  
},1000); // check every second

Мне все еще нравится эта идея. stackoverflow - это круто!


person baru    schedule 15.11.2012    source источник


Ответы (3)


Предполагая, что вы храните информацию о сеансе PHP внутри файла cookie, вы можете отслеживать изменения в вашем document.cookie.

Перед отправкой формы сохраните значение текущего файла cookie и отслеживайте его изменения с помощью таймера:

form.onsubmit = function() {
     var oldCookie = document.cookie;

     var cookiePoll = setInterval(function() {
         if(oldCookie != document.cookie) {
             // stop polling
             clearInterval(cookiePoll);

             // assuming a login happened, reload page
             window.location.reload();
         }
     },1000); // check every second
}
person lostsource    schedule 15.11.2012
comment
Большое тебе спасибо! Мне нравится концепция. Только одно небольшое дополнение: если вы не остановите интервал для такого быстрого интервала, он будет повторяться еще до того, как страница сможет перезагрузиться, что приведет к ее эффективному зависанию. Поэтому я добавил четкий интервал: var ri=setInterval(function() { if(oldCookie != document.cookie) { // assuming a login happened, reload page clearInterval(ri); window.location.reload(); } },1000); // check every second - person baru; 15.11.2012

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

Если есть изменения или дополнительные функции, вы можете вызвать функцию javascript в родительском элементе, скажем, reloadMe, используя window.opener.reloadMe()

person Nivas    schedule 15.11.2012
comment
Да, извините, что сделал это недостаточно ясно. Поскольку модальный диалог можно открыть с любой страницы (из навигации), изменения на родительской странице (странице А) могут быть весьма существенными. Работает ли window.opener из окна, открытого формой target=_blank? - person baru; 15.11.2012
comment
Я думаю, что да. Сталкиваетесь ли вы с какими-либо проблемами? - person Nivas; 15.11.2012
comment
Большое тебе спасибо! Я принял предложение о потерянном источнике, потому что он немного более гибкий, так как мне не нужно манипулировать целевой страницей. Ваш ответ по-прежнему очень ценен. Извините, я не могу проголосовать за это, потому что я только что создал учетную запись. - person baru; 15.11.2012

Почему бы не просто setTimeout

setTimeout(function(){ location.reload(); }, 1000);

Это немного взломано, но кажется подходящим для вашей ситуации.

person Douglas.Sesar    schedule 10.06.2015