Как принудительно перезагрузить страницу при использовании кнопки возврата в браузере?

93

Мне нужно каким-то образом определить, что пользователь нажал кнопку возврата в браузере, и перезагрузить страницу с обновлением (перезагрузка содержимого и CSS) с помощью jquery.

Как обнаружить такое действие через jquery?

Потому что сейчас некоторые элементы не перезагружаются, если я использую кнопку «Назад» в браузере. Но если я использую ссылки на сайте, все обновляется и отображается правильно.

ВАЖНЫЙ!

Некоторые люди, вероятно, неправильно поняли, чего я хочу. Я не хочу обновлять текущую страницу. Я хочу обновить страницу, загружаемую после нажатия кнопки «Назад». вот что я имею в виду более подробно:

  1. пользователь посещает страницу 1.
  2. а на странице 1 - он переходит по ссылке на страницу 2.
  3. он перенаправлен на страницу2
  4. сейчас (важная часть!) он нажимает кнопку "Назад" в браузере, потому что хочет вернуться на страницу 1
  5. он вернулся на страницу 1 - а теперь страница 1 перезагружается, и появляется предупреждение вроде «Вы вернулись!»
Джон Дохерский
источник
Вместо того, чтобы взламывать нормальное поведение пользователя, почему бы вам не попытаться понять, почему ваш код не работает при загрузке страницы и вам нужно перезагрузить страницу?
Lelio Faieta
2
@LelioFaieta Я меняю классы, чтобы показать изменения. Если пользователь нажимает на что-то, значение изменяется в базе данных через ajax. Когда ajax завершен, css class cahnge, например, с onна off. И все нормально, в db сохраняется, пользователи все правильно видят. Теперь он нажимает на другую ссылку. Например, страница о нас, правда? Теперь он на странице о нас. Бе решает вернуться на предыдущую страницу и нажимает кнопку «Назад» в браузере. И когда он вернулся, он видит изменения на странице, поскольку браузер показывал страницу (вероятно, некоторое отключение браузера) до того, как он запустил ajax (включение / выключение классов)
Джон Дохерский
1
Вы используете get или post для вызова Ajax?
Lelio Faieta,
1
@LelioFaieta part2 .. Я также использую атрибут данных, и это не имеет никакого эффекта. Все было бы здорово, если бы страницу перезагрузили. Если я нажму F5 на этой странице, будут показаны значения, которые он изменил с помощью ajax. Я думаю, что это проблема, связанная с браузером, когда часть css / html не перезагружается полностью. Он перезагружается только после нажатия f5
John Doeherskij
@LelioFaieta $.ajax({ url: url, method: 'post', processData: false, contentType: false, cache: false, dataType: 'json', data: formData, })Как вы думаете, это может быть с помощью ajax? было бы здорово, если бы это было так.
John Doeherskij

Ответы:

96

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

window.addEventListener( "pageshow", function ( event ) {
  var historyTraversal = event.persisted || 
                         ( typeof window.performance != "undefined" && 
                              window.performance.navigation.type === 2 );
  if ( historyTraversal ) {
    // Handle page restore.
    window.location.reload();
  }
});

Обратите внимание, что также может быть задействован HTTP-кеш. Вам необходимо установить правильные HTTP-заголовки, связанные с кешем, на сервере, чтобы кэшировать только те ресурсы, которые необходимо кэшировать. Вы можете также сделать принудительную перезагрузку в instuct браузер игнорировать HTTP кэш: window.location.reload( true ). Но не думаю, что это лучшее решение.

Для получения дополнительной информации проверьте:

Леонид Васильев
источник
Не могли бы вы помочь пользователю Дхираджу, он на правильном пути, но он перезагружается два раза. Кстати, я пробовал, window.addEventListener( "unload", function() {} );но ничего не делает, кнопка назад работает, как и раньше, никаких изменений; (
Джон Дохерский,
Как выгрузить BFCache? Не могли бы вы обновить свой код более конкретной информацией? Эта линия window.addEventListener( "unload", function() {} );не работает. Это полная?
John Doeherskij
Обход истории Chrome несколько сбивает с толку. Пожалуйста, попробуйте pageshowрешение.
Леонид Васильев
1
Я все еще вижу двойную загрузку; (Как только Firefox по умолчанию (показывает старую страницу; возможно, из кеша браузера?), А затем скрипт запускается снова. Сценарий перезагружает его до актуального этапа, но я все еще вижу старое состояние на секунду или около того; (У меня код внутри$(document).ready( function() { /* code here */ });
Джон Дохерский,
3
window.performance.navigationустарел. Чтобы проверить тип навигации, который я использовалwindow.performance.getEntriesByType("navigation")[0].type === "back_forward"
zero01alpha
53

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

Вы можете сделать проверку с помощью

performance.navigation.type

Документация, включая поддержку браузера, находится здесь: https://developer.mozilla.org/en-US/docs/Web/API/Performance/navigation

Итак, чтобы узнать, была ли страница загружена из истории, используя back, вы можете сделать

if(performance.navigation.type == 2){
   location.reload(true);
}

Значок 2указывает на то, что доступ к странице был осуществлен путем перехода в историю. Другие возможности:

0:Доступ к странице осуществлялся путем перехода по ссылке, закладке, отправке формы или сценария, либо путем ввода URL-адреса в адресной строке.

1:Доступ к странице осуществляется нажатием кнопки «Обновить» или методом Location.reload ().

255: Любым другим путем

Они подробно описаны здесь: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigation.


Примечание. Performance.navigation.type теперь устарел и заменен на PerformanceNavigationTiming.type, который возвращает 'navigate' / 'reload' / 'back_forward' / 'prerender': https://developer.mozilla.org/en-US/docs/Web / API / PerformanceNavigationTiming / тип

Лоток
источник
2
У меня эта проверка сработала. Что именно означает цифра 2?
RitchieD 02
Это сработало как шарм ... Я поместил его в самом верху области ... и страница перезагружалась без загрузки какого-либо другого скрипта.
NMathur
Это сработало как шарм. Отличная находка ... Это очень быстро и надежно, в отличие от других ответов, которые были медленными по сравнению с этим. TY
Jithin Raj PR
этот работал с браузером Chrome и не работал с firefox
praaveen VR
8
Это устарело (см. W3c.github.io/navigation-timing/#obsolete ).
Дэвид Вильхубер
23

Просто используйте jquery:

jQuery( document ).ready(function( $ ) {

   //Use this inside your document ready jQuery 
   $(window).on('popstate', function() {
      location.reload(true);
   });

});

Вышеупомянутое будет работать на 100% при нажатии кнопки «Назад» или «Вперед» с помощью ajax.

если это не так, значит, в другой части скрипта есть неправильная конфигурация.

Например, он может не перезагрузиться, если используется что-то вроде одного из примеров в предыдущем посте. window.history.pushState('', null, './');

поэтому, когда вы все же используете, history.pushState(); убедитесь, что используете его правильно.

Предложение в большинстве случаев вам просто понадобится:

history.pushState(url, '', url); 

Нет window.history ... и убедитесь, что URL-адрес определен.

Надеюсь, это поможет..

Франческо
источник
Это НЕ работает в IE. developer.microsoft.com/en-us/microsoft-edge/platform/issues/…
RitchieD 02
@RitchieD - На сегодняшний день это хорошо работает в IE11 в Windows 10. Примечание. Я не использую EDGE.
Дэн Джи
Просто не фанат ответов «просто используйте jQuery», извините
Стивен
Я бы удалил «true» из перезагрузки, чтобы использовать кеш HTTP. В большинстве случаев нет смысла перезагружать активы.
konyak
19

Поскольку performance.navigationтеперь не рекомендуется, вы можете попробовать следующее:

var perfEntries = performance.getEntriesByType("navigation");

if (perfEntries[0].type === "back_forward") {
    location.reload(true);
}
мастер
источник
Это самый последний ответ
Java_Man
Этот код необходимо объединить с кодом из ответа Леонида выше.
gornvix
У меня это работает нормально. Я тестировал последние версии Chrome, Firefox, IE и Edge. Не проверял Safari на Mac.
Tasawar Hussain
Это работает как шарм
Сайрус Зей
7

В качестве индикатора обновления следует использовать скрытый ввод со значением «нет»:

<input type="hidden" id="refresh" value="no">

Теперь, используя jQuery, вы можете проверить его значение:

$(document).ready(function(e) {
    var $input = $('#refresh');

    $input.val() == 'yes' ? location.reload(true) : $input.val('yes');
});

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

Таким образом, при первой загрузке страницы значение ввода будет «нет». Когда вы вернетесь на страницу, вы получите ответ «да», и ваш код JavaScript запустит обновление.

Дхирадж
источник
1
Не работает. Я пробовал Firefox и Chrome, но он не работает.
John Doeherskij
Пожалуйста, проверьте мой обновленный вопрос, возможно, вы и другие меня неправильно поняли. Теперь гораздо яснее, чего я хочу достичь. Спасибо.
John Doeherskij
Да, я неправильно понял, спасибо за подробное обновление вопроса.
Dhiraj
теперь это работает. Однако он перезаряжается 2 раза и выглядит немного странно. Первый раз перезагружается. ничего - вероятно, это поведение браузера по умолчанию. Во второй раз, когда он перезагружается - через ваш скрипт - значения обновляются, как и должно быть, но это выглядит плохо, потому что он перезагружается два раза. Есть идеи, как его немного улучшить, чтобы перезагрузка выглядела лучше или перезагружалась только один раз? В Chrome это выглядит лучше, чем в Firefox, перезагрузка происходит быстрее, но я все еще вижу исходное состояние возврата (на секунду или полсекунды), и перезагрузка скрипта происходит только после этого.
John Doeherskij
Есть новые идеи, как исправить "двойную нагрузку"?
John Doeherskij
6

Альтернативой, которая решила проблему для меня, является отключение кеша для страницы. Это заставляет браузер получать страницу с сервера вместо использования кешированной версии:

Response.AppendHeader("Cache-Control","no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");
Марлон
источник
Лучшее решение, но вот версия, которую я использовал. Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetMaxAge(TimeSpan.Zero); Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); Response.Cache.SetNoStore();
рвение
3

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

const [entry] = performance.getEntriesByType("navigation");

// Show it in a nice table in the developer console
console.table(entry.toJSON());

if (entry["type"] === "back_forward")
    location.reload();

См. Здесь источник

Java_Man
источник
1

Перезагрузить легко. Вам следует использовать:

location.reload(true);

И поиск назад - это:

window.history.pushState('', null, './');
  $(window).on('popstate', function() {
   location.reload(true);
});
Антон Степаненков
источник
Не работает; (Я пробовал alert('test');вместо этого, location.reload(true);но все еще ничего. Я пробовал firefox и chrome, но ничего. Я пробовал готов внутри документа, снаружи, но ничего не работает. Если я попробую простое предупреждение () или любой код jquery, который работает. Я у меня на странице много jquery-кода, и он работает
John Doeherskij,
Я отредактировал ответ, попробуйте новое решение. Дело в том, что вам нужно нажать состояние раньше, иначе вы не получите событие popstate.
Антон Степаненков
Вы, наверное, неправильно поняли, что я хочу. Я обновил свой вопрос более подробным описанием. Пожалуйста, проверьте еще раз, если у вас есть время, спасибо.
John Doeherskij
0

Используйте следующий метатег в вашем файле заголовка html, это работает для меня.

<meta http-equiv="Pragma" content="no-cache">
Раджеш Харатмол
источник
Это не перезагружать страницу , когда назад, который просил OP
Timberman
-1

Я нашел лучший ответ, и он отлично работает для меня

просто используйте этот простой скрипт в своей ссылке

<A HREF="javascript:history.go(0)">next page</A>

или событие нажатия кнопки

<INPUT TYPE="button" onClick="history.go(0)" VALUE="next page">

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

Я использовал его для входа в систему CAS и дает мне то, что я хочу. Надеюсь, поможет .......

подробности можно найти здесь

Мухаммед Аслам
источник
У меня это не работает. Что означает «0»?
Винсент