ブラウザの戻るボタンを使用しているときにページを強制的に再読み込みするにはどうすればよいですか?


84

ユーザーがブラウザーの戻るボタンを押したことを何らかの方法で検出し、jqueryを使用してページを更新(コンテンツとCSSの再読み込み)で再読み込みする必要があります。

jqueryを介してそのようなアクションを検出する方法は?

ブラウザで戻るボタンを使用すると、現在一部の要素が再読み込みされないためです。しかし、ウェブサイトでリンクを使用すると、すべてが更新され、正しく表示されます。

重要!

おそらく私が欲しいものを誤解している人もいます。現在のページを更新したくありません。戻るボタンを押した後に読み込まれたページを更新したい。これが私がより詳細に意味することです:

  1. ユーザーがpage1にアクセスしています。
  2. ページ1にいる間-彼はページ2へのリンクをクリックします。
  3. 彼はpage2にリダイレクトされます
  4. 今(重要な部分です!)彼はページ1に戻りたいので、ブラウザの戻るボタンをクリックします
  5. 彼はpage1に戻っています-そして今page1がリロードされており、「You areback!」のような警告が表示されます。

通常のユーザーの動作をハッキングする代わりに、コードがページの読み込みで機能せず、ページを再読み込みする必要がある理由を理解してみませんか?
Lelio Faieta 2017年

2
@LelioFaieta変更を表示するためにクラスを変更します。ユーザーが何かをクリックすると、データベース内の値がajaxを介して変更されます。ajaxが実行されると、たとえばfromonからoff。へのcssクラスcahngeが実行されます。そしてそれは大丈夫です、それはdbに保存されます、ユーザーはすべてを正しく見ます。今、彼は他のリンクをクリックします。たとえば、私たちのページについてですよね?今、彼は私たちについてのページにいます。前のページに戻ることにし、ブラウザの戻るボタンをクリックします。そして、彼が戻ってきたとき、彼はajax(オン/オフクラス)をトリガーする前にブラウザーがページを表示したときにページの変更を確認します(おそらくブラウザーのキャッシング)
John Doeherskij 2017年

1
Ajax通話にgetまたはpostを使用していますか?
Lelio Faieta 2017年

1
@LelioFaieta part2 ..データ属性も使用していますが、効果がありません。ページがリロードされれば、すべてが素晴らしいでしょう。そのページでF5キーを押すと、彼がajaxを介して変更した値が表示されます。これは、css / htmlパーツが完全にリロードされていない場合の、ブラウザのチャッシングに関連する問題だと思います。f5を押した後にのみリロードします
John Doeherskij 2017年

@LelioFaieta$.ajax({ url: url, method: 'post', processData: false, contentType: false, cache: false, dataType: 'json', data: formData, })これはajaxによるものだと思いますか?もしそうなら、それは素晴らしいことです。
John Doeherskij 2017年

回答:


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ヘッダーを設定する必要があります。HTTPキャッシュを無視するために、Instuctブラウザに強制的にリロードすることもできますwindow.location.reload( true )。しかし、私はそれが最善の解決策だとは思いません。

詳細については、以下を確認してください。


ユーザーDhirajが正しい方向に進んでいるのに、2回リロードしているのを手伝ってくれませんか。ちなみに、私は試しましたwindow.addEventListener( "unload", function() {} );が、何もしていません。戻るボタンは以前と同じように機能し、何も変更されていません;(
John Doeherskij 2017年

BFCacheをアンロードする方法は?より具体的な情報でコードを更新できますか?この行window.addEventListener( "unload", function() {} );は機能しません。完了しましたか?
John Doeherskij 2017年

Chromeの履歴トラバーサルはやや混乱します。pageshow解決策を試してください。
Leonid Vasilev 2017年

1
まだ二重の読み込みが表示されます;(デフォルトのFirefox(古いページが表示されます。ブラウザのキャッシュからですか?)と、スクリプトが再度起動します。スクリプトは実際のステージに再読み込みしますが、古い状態が表示されます$(document).ready( function() { /* code here */ });
一瞬

3
window.performance.navigationは非推奨です。私が使用したナビゲーションタイプを確認するにはwindow.performance.getEntriesByType("navigation")[0].type === "back_forward"
zero01alpha

49

これが投稿されてからしばらく経ちましたが、古いブラウザをサポートする必要がない場合は、よりエレガントな解決策を見つけました。

あなたはでチェックをすることができます

performance.navigation.type

ブラウザのサポートを含むドキュメントはこちらです:https//developer.mozilla.org/en-US/docs/Web/API/Performance/navigation

したがって、ページが履歴からロードされたかどうかを確認するには、

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は非推奨になり、'navigate' / 'reload' / 'back_forward' / 'prerender'を返すPerformanceNavigationTiming.typeが優先されます:https://developer.mozilla.org/en-US/docs/Web / API / PerformanceNavigationTiming / type


2
このチェックは私のために働いた。2は正確にはどういう意味ですか?
RitchieD

これは魅力のように機能しました..私はそれを一番上の領域に配置しました..そしてページは他のスクリプトをロードせずにリロードしていました。
NMathur

これは魅力のように機能しました。素晴らしい発見...これに比べて遅い他の回答とは異なり、非常に高速で信頼性があります。TY
weBBer 2018

これは
Chrome

7
これは非推奨です(w3c.github.io/navigation-timing/#obsoleteを参照)。
David Vielhuber 2018年

22

jqueryを使用するだけです:

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

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

});

上記は、ajaxを使用して戻るまたは進むボタンがクリックされた場合にも100%機能します。

そうでない場合は、スクリプトの別の部分に設定ミスがあるはずです。

たとえば、前の投稿の例のようなものが使用されている場合、リロードされない可能性があります window.history.pushState('', null, './');

したがって、使用history.pushState(); するときは、適切に使用するようにしてください。

ほとんどの場合、必要な提案は次のとおりです。

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

いいえwindow.history ...とは確認していないURLが定義されています。

お役に立てば幸いです。



@ RitchieD-今日の時点で、これはWindows 10のIE11でうまく機能します。注:私はEDGEを使用していません。
ダン

「jQueryを使用する」という回答のファンではありません。申し訳ありません。
スティーブン

HTTPキャッシュを使用するには、リロードから「true」を削除します。ほとんどの場合、アセットをリロードする意味はありません。
konyak

14

以来performance.navigation廃止され、あなたはこれを試すことができます。

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

if (perfEntries[0].type === "back_forward") {
    location.reload(true);
}

これが最新の回答です
Java_Man

このコードは、上記のLeonidの回答のコードと組み合わせる必要があります。
gornvix

これは私にとってはうまく機能しています。最新のChrome、Firefox、IE、Edgeでテストしました。MacのSafariをチェックしませんでした。
タサワルフセイン

6

値が「no」の非表示の入力を更新インジケーターとして使用する必要があります。

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

jQueryを使用して、その値を確認できます。

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

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

戻るボタンをクリックすると、非表示フィールドの値は、最初にページを離れたときと同じ値を保持します。

したがって、ページを初めてロードするとき、入力の値は「no」になります。ページに戻ると、「はい」になり、JavaScriptコードが更新をトリガーします。


1
動作しません。FirefoxとChromeを試しましたが、機能しません。
John Doeherskij 2017年

私の更新された質問をチェックしてください、おそらくあなたと他の人は私を誤解しました。私が達成したいことは、今でははるかに明確になっています。ありがとうございました。
John Doeherskij 2017年

はい、誤解し​​ました。質問を詳細に更新していただきありがとうございます。
Dhiraj 2017年

今では動作します。ただし、2回リロードされており、少し奇妙に見えます。初めてリロードします。何もありません-これはおそらくデフォルトのブラウザの動作です。2回目のリロード(スクリプトを介して)では、値は本来のように更新されますが、2回リロードされるため、見栄えが悪くなります。それを少し改善して、リロードの見栄えを良くするか、一度だけリロードする方法はありますか?ChromeではFirefoxよりも見栄えが良く、リロードは高速ですが、元のバック状態(1秒または0.5秒)が表示され、スクリプトのリロードはその後のみです。
John Doeherskij 2017年

「二重負荷」を修正する方法についての新しいアイデアはありますか?
John Doeherskij 2017年

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コードを試した場合は機能します。私のページにjQueryのコードの多くを持っているし、それが動作します。
ジョンDoeherskij

回答を編集しました。新しいソリューションを試してください。前に状態をプッシュする必要があります。そうしないと、popstateイベントが発生しません。
アントンステパネンコフ2017年

あなたはおそらく私が欲しいものを誤解しているでしょう。質問をより詳細な説明で更新しました。時間があればもう一度チェックしてください、ありがとうございます。
John Doeherskij 2017年

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」は何を表していますか?
ヴィンセント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.