この質問についてWebで検索しましたが、何も見つかりませんでした。
戻るボタンのロジックは何ですか? Webブラウザで戻るボタンを押すとどうなりますか?
私は本当にそれについてもっと理解したいと思います。
ありがとうございました。
Webブラウザは、そのウィンドウでアクセスしたWebページのスタック(または、必要に応じてリスト)を保持します。ホームページがgoogle.comであり、そこから他のいくつかのウェブサイトにアクセスするとします:youtube.com、yahoo.com、cnn.com。最後のものにアクセスすると、リストは次のようになります。
google.com -> youtube.com -> yahoo.com -> cnn.com
^
|
current page
[戻る]ボタンを押すと、ブラウザは次のようにリストの前のページに戻ります。
google.com -> youtube.com -> yahoo.com -> cnn.com
^
|
current page
この時点で、もう一度Backを押してyoutube.comに移動するか、Forwardを押してcnn.comに移動します。もう一度Backを押したとしましょう:
google.com -> youtube.com -> yahoo.com -> cnn.com
^
|
current page
たとえば、abc.comにアクセスすると、リストは次のように変わります。
google.com -> youtube.com -> abc.com
^
|
current page
Yahoo.comとcnn.comの両方がリストから削除されていることに注意してください。これは、新しいルートを選択したためです。ブラウザは、あなたが今いる場所にたどり着くためにあなたが訪れたページのリストのみを維持し、あなたが今まで行ったすべてのページの履歴ではありません。また、ブラウザーはアクセスしているサイトの構造について何も知らないため、驚くべき動作を引き起こす可能性があります。
閲覧する製品のカテゴリとサブカテゴリがあるショッピングサイト(短い例としてne.com)を使用しています。サイト設計者は、ウィンドウの上部付近に breadcrumbs を用意して、カテゴリをナビゲートできるようにしました。サイトのトップページから開始し、[ハードウェア]、[メモリ]の順にクリックします。リストは次のようになります。
google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem
^
|
current page
ハードウェアカテゴリに戻りたいので、戻るボタンを使用する代わりに、ブレッドクラムを使用して親カテゴリに移動します。ブラウザのリストは次のようになります。
google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw
^
|
current page
サイト構造によると、あなたは後方に(レベルを上げて)行きましたが、リンクをクリックしたためにブラウザに進みました。リンクをクリックするか、アドレスバーにURLを入力するたびに、そのリンクが既にアクセスしたページに移動するかどうかに関係なく、ブラウザに関する限り先に進みます。
最後に、メインサイトページ(ne.com)に戻ります。パンくずリストを使用することもできますが、今回は[戻る]ボタンをクリックします-1レベル上に移動する必要があることは明らかです。しかし、それはあなたをどこに連れて行きますか?
最初は多くのユーザーを混乱させます(私がこれを正確に行うと、自分も含まれます)。レベルを下げて、メモリカテゴリに戻ります。ページのリストを見ると、その理由は簡単にわかります。
google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw
^
|
current page
[戻る]ボタンのみを使用してメインページに戻るには、さらに2回押す必要があり、ハードウェアカテゴリに戻り、最後にメインページに戻ります。私たちプログラマーにとっては何が起こっているのかとても明白に思えますが、ブラウザーが自分のウェブサイトの階層構造について何も知らないことに気付いていないため、通常のユーザーがいつも驚いています。
ブラウザがサイトデザイナーに「戻る」ボタンをプログラムさせて、今何をするのではなく、明白なことをする(レベルを上げる)のは素晴らしいことでしょうか?
編集:コメンターは、ブラウザーがページをリロードするか、単にローカルキャッシュからページを表示するかを尋ねました。
答えはそれによって異なります。サイト設計者は、ブラウザがページをキャッシュするかどうかを指定できます。キャッシュされていないページとして設定されているページの場合、[戻る]を押すと、ブラウザは初めてアクセスしたときのように、サーバーからページをリロードします。キャッシュされたページの場合、ブラウザはキャッシュからそれを表示します。これははるかに高速です。
私はそれを私の最後のリクエストを再発行することと考えたいです。単純なGETを実行すると、おそらく前回と同じ結果が返されます(マイナスの動的コンテンツ)。 POSTを行った場合、フォームを(確認後に)サーバーに再送信します。
基本的な考え方は、最後のページまたは論理的なサイト部門に戻ることです。
Gmailを見ると、検索を実行してメッセージをクリックし、[戻る]ボタンを押すと、実行した検索に戻ります。
ほとんどのブラウザでクリックすると、最後のhttpリクエストが再送信されるか、ブラウザがサイトをキャッシュする場合にキャッシュがロードされます。
これを説明する最も簡単な方法は擬似コードだと思います:
class Page:
String url, ...
Page previous, next # implements a doubly-linked list
class History:
Page current # current page
void back():
if current.previous == null:
return
current = current.previous
refresh()
void forward():
if current.next == null:
return
current = current.next
refresh()
void loadPage(Page newPage):
newPage.previous = current
current.next = newPage # remove all the future pages
current = current.next
display(current)
表示されたページの履歴は、スタックのような形式で保持されます。上位3ページ(たとえば、A、B、C)を「ポップ」してから別のページDに移動すると、前方に押してBに戻ることはできません。
開発者として、ブラウザが[戻る]ボタンをどのように処理しても、webappが機能することを確認する必要があります:-)要求を再送信しますか?新しいリクエストは古いリクエストと同一ですか、それとも何らかの違いがありますか?ブラウザはユーザーに再POSTの確認を求めますか?ページのどの要素が再要求され、キャッシュから何がロードされますか?ブラウザはキャッシュ制御ヘッダーを尊重しますか?
これらの質問に対する答えは、メーカー、ブラウザのバージョン、ユーザー設定によって異なります。これらすべてがそれほど重要ではないようにソフトウェアを設計してください。
あまり直接的な回答ではなく申し訳ありませんが、ここには既にいくつかの正解があります。
ブラウザは記憶のために常にページを保存し、戻るボタンを押しても前のページのリクエストをサーバーに送信せず、代わりにページを保存したキャッシュを表示し、LIFOルールは、最後に開いた戻るボタンを押すと最初にそのページを表示する理由です