Принудительно перезагрузить / обновить при нажатии кнопки назад - PullRequest
18 голосов
/ 31 января 2012

Я постараюсь объяснить это.

У меня есть приложение, которое показывает 50+ проектов на моей странице view. Пользователь может щелкнуть отдельный проект и перейти на страницу update, чтобы обновить информацию о проекте. Все работает отлично, за исключением того, что после того, как пользователь закончит обновление информации о отдельном проекте и нажмет кнопку «назад» в браузере до предыдущей view page. Информация о старом проекте (до обновления) все еще там. Пользователь должен нажать обновить, чтобы увидеть обновленную информацию. Это не так уж плохо, но я хочу обеспечить лучший пользовательский опыт. Есть идеи, чтобы это исправить? Большое спасибо.

Ответы [ 13 ]

18 голосов
/ 24 июля 2014

Я использую эти четыре строки кода PHP:

// any valid date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
// always modified right now
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// HTTP/1.1
header("Cache-Control: private, no-store, max-age=0, no-cache, must-revalidate, post-check=0, pre-check=0");
// HTTP/1.0
header("Pragma: no-cache");

Ключ использует предложение "no-store" заголовка Cache-Control.

17 голосов
/ 17 июля 2013

"fb-cache" может быть очень раздражающим.Вот простой способ обхода JavaScript:

window.onpageshow = function(evt) {
    // If persisted then it is in the page cache, force a reload of the page.
    if (evt.persisted) {
        document.body.style.display = "none";
        location.reload();
    }
};

Протестировано в Safari 6 и IE10.

7 голосов
/ 31 января 2012

Я думаю, что вы должны работать с JS, чтобы это работало, поскольку у PHP нет возможности узнать, к какому браузеру он контролирует доступ пользователя ...

Может быть, это поможет: http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript

2 голосов
/ 14 июля 2015

К счастью, нам не нужно поддерживать браузеры ниже IE10, поэтому, если вы хотите или достаточно привилегированы, чтобы поддерживать только браузеры, поддерживающие HTML5, должно работать следующее:

/*
 * The following is intentional, to force Firefox to run 
 * this JS snippet after a history invoked back/forward navigation.
 */
window.onunload = function(){};    

function formatTime(t) {
    return t.getHours() + ':' + t.getMinutes() + ':' + t.getSeconds();
}

if (window.history.state != null && window.history.state.hasOwnProperty('historic')) {
    if (window.history.state.historic == true) {
        document.body.style.display = 'none';
        console.log('I was here before at ' + formatTime(window.history.state.last_visit));
        window.history.replaceState({historic: false}, '');
        window.location.reload();
    } else {
        console.log('I was forced to reload, but WELCOME BACK!');
        window.history.replaceState({
            historic  : true,
            last_visit: new Date()
        }, '');
    }
} else {
    console.log('This is my first visit to ' + window.location.pathname);
    window.history.replaceState({
        historic  : true,
        last_visit: new Date()
    }, '');
}

Хорошо,Вот код без комментариев и пометок:

window.onunload = function(){};

if (window.history.state != null && window.history.state.hasOwnProperty('historic')) {
    if (window.history.state.historic == true) {
        document.body.style.display = 'none';
        window.history.replaceState({historic: false}, '');
        window.location.reload();
    } else {
        window.history.replaceState({historic  : true}, '');
    }
} else {
    window.history.replaceState({historic  : true}, '');
}

Вставьте его непосредственно перед закрывающим тегом тела, и у вас будет довольно чистое решение.

Это будет работать с любой комбинацией спины/ вперед при нажатии, и в тот момент, когда пользователь попадает на новую страницу, принудительной перезагрузки не происходит.

Подробнее об объекте History в MDN:

MDN - ИсторияОбъект

MDN - Управление историей браузера

2 голосов
/ 20 мая 2015

Ни одно из вышеперечисленных решений не помогло мне.Это простое решение, опубликованное здесь , сработало ...

Я пытался заставить браузер снова загружать страницу, когда пользователь нажимал кнопку назад, но ничего не получалось.Похоже, что современные браузеры имеют отдельный кеш для страниц, в котором хранится полное состояние страницы (включая сгенерированные JavaScript элементы DOM), поэтому, когда пользователь нажимает кнопку «Назад», предыдущая страница отображается мгновенно в том состоянии, в котором пользователь ее покинул.Если вы хотите, чтобы браузер перезагрузил страницу при нажатии кнопки «Назад», добавьте onunload = "" к своему (X) элементу тела HTML:

<body onunload="">

Это отключаетспециальный кеш и принудительная перезагрузка страницы, когда пользователь нажимает кнопку «назад».Подумайте дважды, прежде чем использовать его.Факт необходимости такого решения - намек на то, что ваша концепция навигации по сайту неверна.

2 голосов
/ 28 марта 2014
 if (window.name == "reloader") {
            window.name = "";
            location.reload();
        }

window.onbeforeunload = function() {
                window.name = "reloader"; 
            }

Добавьте эти две функции на каждой странице

1 голос
/ 26 января 2016

после нескольких дней поиска в сети, чтобы найти решение, я наконец-то понял это, добавлю после:

<script>
 window.onbeforeunload = function(){window.location.reload();}
</script>

это будет работать как талисман, вы меня отблагодарите

этокод будет перезагружать страницу всякий раз, когда вы посещаете ее.

1 голос
/ 07 января 2015

Это решение, которое я использовал:

<?php
session_start();
if (!$_SESSION['reloaded']) {$_SESSION['reloaded'] = time();}
else if ($_SESSION['reloaded'] && $_SESSION['reloaded'] == time()) { ?> 
<script> 
location.reload(); 
</script> 
<?php } ?>
1 голос
/ 24 марта 2012

вот решение, которое я использовал на некоторых из моих страниц. добавьте это к страницам, на которых сделаны изменения.

window.onbeforeunload = function() {
     window.name = "reloader"; 
        }

это срабатывает, когда вы покидаете эти страницы. Вы также можете запустить его, если были внесены изменения. так что это не излишне перезагрузит страницу, которая нуждается в перезагрузке. затем на страницах, на которые вы хотите перезагружаться после использования браузера «назад».

if (window.name == "reloader")
      {
        window.name = "no";
        reloadPage(); 
      }

это вызовет перезагрузку на странице, на которую нужно перезагрузить ... надеюсь это поможет :) о, кстати, это в JS.

1 голос
/ 31 января 2012

Что ж, вы можете либо предоставить встроенную кнопку «Назад» на странице обновления, которая будет отправлять их на нее новую (например, ссылку <a href="<?= $_SERVER['HTTP_REFERRER']; ?>">BACK</a>), либо добавить на страницу какой-нибудь скрипт, который будет заставлять его извлекать данные каждый раз, когда страница нажата, является ли это новым показом, или если использовалась кнопка возврата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...