Принудительная перезагрузка/обновление при нажатии кнопки "Назад"

Я попытаюсь изо всех сил объяснить это.

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

Ответы

Ответ 1

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

Возможно, это поможет: http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript

Ответ 2

"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.

Ответ 3

Я использую эти четыре строки кода 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.

Ответ 4

К счастью, нам не нужно поддерживать браузеры ниже 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()
    }, '');
}

Ну, вот код без комментариев и flab:

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 - создание истории браузера

Ответ 5

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

Ответ 6

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

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

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

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

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

Ответ 7

 if (window.name == "reloader") {
            window.name = "";
            location.reload();
        }

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

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

Ответ 8

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

<?php
session_start();
if (!$_SESSION['reloaded']) {$_SESSION['reloaded'] = time();}
else if ($_SESSION['reloaded'] && $_SESSION['reloaded'] == time()) { ?> 
<script> 
location.reload(); 
</script> 
<?php } ?>

Ответ 9

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

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

<body onunload="">

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

Ответ 10

сделайте скрытый флажок и используйте ниже код (coffeescript)

window.location.reload()  if $("#refreshCheck")[0].checked
  $("#refreshCheck")[0].checked = true

Ответ 11

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

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

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

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

Ответ 12

Я использую jquery и php script для принудительной перезагрузки на подкладке. Часть window.unload нужна только в firefox. Выделенный тайм-аут 1 секунда и часть добавления тела предназначены только для иллюстрации функциональности. window.location.reload(true) даст тот же результат, что и window.location.href= window.location.href;

JQuery

<script>
    $(window).unload(function() {});


        $.get('h.php',function(data){
            if($.trim(data)=='first'){
               // $('body').append(data)
               // setTimeout(function(){
               window.location.href = window.location.href;
               // },1000)
            }
            else {
                // $('body').append(data)
            }
        });

</script>

h.php:

<?php session_start(); ?>
<?php 
if(!$_SESSION['reloaded']){
    echo 'first';   

    $_SESSION['reloaded']=1;
}
else {
    echo 'second';
    unset($_SESSION['reloaded']);   
}
?>

Ответ 13

Вы можете отправлять заголовки HTTP на странице просмотра, которые сообщают браузеру, что страница не может быть кэширована. Это означает, что браузеру необходимо будет запрашивать страницу с сервера каждый раз, когда к ней обращаются, что означает, что она всегда отображает актуальную информацию.

Заголовки должны быть отправлены перед любым другим контентом, поэтому поставьте следующее справа вверху страницы просмотра.

header("Cache-Control: no-cache, must-revalidate");