Як змусити перезавантажити сторінку при використанні кнопки повернення браузера?


85

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

Як виявити таку дію за допомогою jquery?

Тому що зараз деякі елементи не перезавантажуються, якщо я використовую кнопку назад у браузері. Але якщо я використовую посилання на веб-сайті, все оновлено та показано правильно.

ВАЖЛИВО!

Деякі люди, напевно, неправильно зрозуміли, що я хочу. Я не хочу оновлювати поточну сторінку. Я хочу оновити завантажену сторінку після натискання кнопки "Назад". ось що я маю на увазі більш докладно:

  1. користувач відвідує сторінку1.
  2. перебуваючи на сторінці1 - він натискає посилання на сторінку2.
  3. він перенаправляється на сторінку2
  4. тепер (Важлива частина!) він натискає кнопку назад у браузері, оскільки хоче повернутися на сторінку1
  5. він повернувся на сторінку1 - і зараз сторінка1 перезавантажується, і щось сповіщається на кшталт "Ти повернувся!"

Замість того, щоб зламати нормальну поведінку користувача, чому б вам не спробувати зрозуміти, чому ваш код не працює при завантаженні сторінки, і вам потрібно, щоб сторінка перезавантажилася?
Леліо Фаєта,

2
@LelioFaieta Я міняю класи, щоб показувати зміни. Якщо користувач щось натискає, значення змінюється в базі даних через ajax. Коли ajax завершено, клас css cahnge, наприклад, від onдо off. І це нормально, це збережено в db, користувачі все бачать правильно. Тепер він натискає якесь інше посилання. Наприклад про сторінку про нас, так? Зараз він знаходиться на сторінці про нас. Буде вирішено повернутися на попередню сторінку та натиснути кнопку назад у браузері. І коли він повертається, він бачить зміни на сторінці, коли браузер показував сторінку (можливо, якесь кешування браузера), перш ніж він активував ajax (класи ввімкнення / вимкнення)
John Doeherskij,

1
Ви використовуєте отримати або опублікувати для дзвінка Ajax?
Леліо Фаєта,

1
@LelioFaieta part2 .. Я також використовую атрибут data, і це ніяк не впливає. Все було б чудово, якби сторінку перезавантажили. Якщо я натисну F5 на цій сторінці, відображаються значення, які він змінив через ajax. Я думаю, це якась проблема, пов’язана з кешуванням браузера, коли частина css / html не перезавантажується повністю. Він перезавантажується лише після натискання клавіші f5
Джон Догерський,

@LelioFaieta $.ajax({ url: url, method: 'post', processData: false, contentType: false, cache: false, dataType: 'json', data: formData, })Ви думаєте, що це може бути від ajax? було б чудово, якби це було так.
John Doeherskij,

Відповіді:


86

Ви можете використовувати 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() {} );але він нічого не робить, кнопка "Назад" працює як і раніше, ніяких змін ніяких; (
John Doeherskij,

Як розвантажити 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

50

Минув деякий час з того часу, як це було опубліковано, але я знайшов більш елегантне рішення, якщо вам не потрібно підтримувати старі браузери.

Ви можете зробити перевірку з

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 / type


2
Ця перевірка спрацювала для мене. Що саме означає 2?
RitchieD

Це спрацювало як шарм .. Я розмістив його в самому верхньому куточку .. і сторінка перезавантажувалася, не завантажуючи жодного іншого сценарію.
NMathur

Це спрацювало як шарм. Чудова знахідка ... Це дуже швидко і надійно, не так, як інші відповіді, які були повільними порівняно з цим. TY
weBBer

цей працював з браузером chrome, а ні з firefox
praaveen VR

7
Це застаріло (див. W3c.github.io/navigation-timing/#obsolete ).
David Vielhuber

22

Просто використовуйте 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-адреса визначена.

Сподіваюся, це допомагає ..



@RitchieD - На сьогодні це добре працює в IE11 у Windows 10. Примітка. Я не використовую EDGE.
Dan G

Тільки не шанувальник відповідей "просто використовуй jQuery", вибачте
Стівен

Я б видалив "true" із перезавантаження, щоб використовувати кеш HTTP. У більшості випадків немає сенсу перезавантажувати активи.
коняк

15

Оскільки 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.
Тасавар Хуссейн,

6

Ви повинні використовувати прихований вхід як індикатор оновлення зі значенням "ні":

<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

Так, я неправильно зрозумів, дякую за детальне оновлення запитання.
Дхірадж

зараз це працює. Однак це перезавантаження 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();
завзяття

2

На даний момент це найсвіжіший спосіб перезавантаження сторінки, якщо користувач натискає кнопку "Назад".

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();

Дивіться тут джерело


1

Перезавантажити легко. Ви повинні використовувати:

location.reload(true);

І виявлення назад:

window.history.pushState('', null, './');
  $(window).on('popstate', function() {
   location.reload(true);
});

Не працює; (я намагався alert('test');замість, location.reload(true);але все ще нічого. Я спробував firefox і chrome, але нічого. Я спробував всередині документа готовий, зовні, але нічого не працює. Якщо я спробую простий сигнал alert () або будь-який код jquery, який працює. I на моїй сторінці є багато коду jquery, і це працює.
John Doeherskij

Я відредагував відповідь, спробуйте нове рішення. Справа в тому, що вам потрібно натиснути на стан раніше, інакше ви не отримаєте подію popstate.
Антон Степаненков

Ви, мабуть, неправильно зрозуміли, що я хочу. Я оновив своє запитання більш докладним описом. Перевірте ще раз, якщо є час, дякую.
John Doeherskij,

0

Використовуйте наступний мета-тег у своєму HTML-файлі заголовка, це працює для мене.

<meta http-equiv="Pragma" content="no-cache">

Це не перезавантажує сторінку при поверненні, про що вимагав ОП
Тімберман

-1

Я знайшов найкращу відповідь, і вона мені ідеально підходить

просто використовуйте цей простий сценарій у своєму посиланні

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

або подія натискання кнопки

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

коли ви використовуєте це, ви спочатку оновлюєте свою сторінку, а потім переходите до наступної сторінки, коли повернетесь назад, вона матиме останній оновлений стан.

Я використав його під час входу в систему CAS і дає мені те, що я хочу. Сподіваюся, це допоможе .......

деталі знайдено звідси


Це не працює для мене. Що означає "0"?
Вінсент
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.