Wiki_History_API - inoueshinichi/Wiki_Web GitHub Wiki
- ブラウザのセッション履歴, 現在のページが読み込まれたタブ・フレームで訪問したページを操作する.
| プロパティ | 説明 |
|---|---|
| window.history.length | ページのスタック(履歴)数. 新しいタブでロードしたページのこのプロパティは1. |
| window.history.scrollRestoration | ページ復元時にスクロール状態も復元するか否か(auto or manual) |
| window.state | 履歴スタックの最上位を覗き見(Peek)する(any型) |
| メソッド | 機能 |
|---|---|
| window.history.back() | 非同期処理 ブラウザの戻るボタンと同じ効果 |
| window.history.go(-1) | window.history.back()と同じ |
| window.history.forward() | 非同期処理 ブラウザの進むボタンと同じ効果 |
| window.history.go(1) | 非同期処理 window.history.forward()と同じ効果 |
| window.history.go(int) | 現在のページから相対位置指定で移動する. 履歴スタックの範囲外を指定した場合, 何も起きない. |
| window.history.pushState({obj}, {title}, {url}) | 指定したデータ(obj), タイトル, URLをセッション履歴に追加する. |
| window.history.replaceState({obj}, {title}, {url}) | 履歴スタックの最上位項目を指定したデータ(obj),タイトル,URLで更新する |
- safariブラウザ以外はタイトル引数を無視する
- 下記3つが主役
- pushState({obj}, {title}, {url})メソッド
- replaceState({obj}, {title}, {url})メソッド
- "popstate"イベント
pushState({obj}, {title}, {url})メソッドを使うことで,
履歴状態を変更した後に生成されるXMLHttpRequestオブジェクトの
HTTPヘッダーの中のリファラも変更される.
リファラはXHRが生成された時点でthisとなるウィンドウのURLとなる.
// e.g.
const stateObj = { foo: "bar" };
window.history.pushState(stateObj, "title", "https://mozilla.org/bar.html");
- 上記コードが
https://mozilla.org/foo.htmlで実行されたと想定. - URLバーには
https://mozila.org/bar.htmlと表示されるが, ブラウザーはbar.htmlをLoadすることはなく, その存在チェックもしない. - ユーザーが
https://google.comに移動し, それから「戻る」ボタンをクリックした時, URLバーはhttps://mozilla.org/bar.htmlを表示する. - window.history.stateは、stateObjになる.
- "popstate"イベントは, ページの再ロードのみで有効なため, pushState({obj}, {title}, {url}), replaceState({obj}, {title}, {url})では発行されない.
URLスタック
--------------------------------
| |
--------------------------------
|. |
--------------------------------
|. |
--------------------------------
URLバー → | https://mozilla.org/foo.html | ← 表示ページ
--------------------------------
↓ window.history.pushState({}, '', "https://mozilla.org/bar.html");
URLスタック
--------------------------------
| |
--------------------------------
|. |
--------------------------------
URLバー → | https://mozilla.org/bar.html |
--------------------------------
| https://mozilla.org/foo.html | ← 表示ページ
--------------------------------
↓ <a href="https://google.com"></a>
URLスタック
--------------------------------
| |
--------------------------------
URLバー → | https://google.com/ | ← 表示ページ
--------------------------------
| https://mozilla.org/bar.html |
--------------------------------
| https://mozilla.org/foo.html |
--------------------------------
↓ window.history.back()
URLスタック
--------------------------------
| |
--------------------------------
| |
--------------------------------
URLバー → | https://mozilla.org/bar.html | ← 表示ページ // window.history.pushState()でスタックされたものが,
-------------------------------- // popされる時, "popstate"イベントが発生する.
| https://mozilla.org/foo.html |
--------------------------------
↓ window.history.back()
URLスタック
--------------------------------
| |
--------------------------------
| |
--------------------------------
| | // "popstate"イベントが発生!
-------------------------------- // この時, window.history.stateは`null`になる.
URLバー → | https://mozilla.org/foo.html | ← 表示ページ
--------------------------------
- window.history.pushState(URLに紐づけるJSの状態オブジェクト, タイトル, URL)
-
key(URL)-value(状態オブジェクト)としてホストPCのディスクに保存される. Max 640KB. - 640KB以上を格納しようとすると, 例外が発生する.
- 640KB以上の大きなデータは, Storageオブジェクト(sessionStorage/localStorage)を用いる.
- タイトルは, Safari以外は空文字を入れる. 状態を示す識別し(tag)の役割をする.
- URLは, 新しいURL. pushState()で追加してもすぐに, ブラウザは, URLが示す先の静的ファイル(.html,.css,*.js)を読み込まない.
- 上記の状態で, ブラウザの再起動を行うと読み込みが発生するかもしれない.
- URLを指定しなかった場合, 現在ページのURLが自動で入る.
-
window.history.pushState({...}, '', 'URL')は`window.location = 'URL'と同等. - 上記の2つの方式は, どちらも現在の文書に関連する別履歴項目の生成と有効化を行う. React-Router-Domの内部実装.
- 同一オリジンであれば, どんなURLにも飛べる.
- window.locationは, 同じdocumentのままでハッシュの変更のみ可能.
- [補足] URLハッシュ(URLフラグメント)は, URLの末尾に
~/path/to#{anchor}と記述でき, ユーザがhtmlファイルを参照した際に`<タグ id="{anchor}"></タグ>が記述されている箇所まで一気に飛べる仕組み. - URLに状態オブジェクトを関連づけることができる.
- window.locationは, オブジェクトをURLエンコードしてURL文字列に埋め込む必要がある.
- window.locationは, 現在のURLハッシュが
~/path/to#fooの場合, 必ず別の~/path/to#barを指定しなければならない. - 一方, window.history.pushState()は, 必ずしもURLハッシュの指定を必要としない.
const stateObj = { foo: 'bar' };
window.history.pushState(stateObj, "", "http://domain/bar.html");
URLスタック
--------------------------------
| |
--------------------------------
| |
--------------------------------
| |
--------------------------------
URLバー → | https://mozilla.org/foo.html | ← 表示ページ
--------------------------------
↓ window.history.pushState({}, '', "https://mozilla.org/bar.html");
URLスタック
--------------------------------
| |
--------------------------------
| |
--------------------------------
| https://mozilla.org/bar.html |
--------------------------------
URLバー → | https://mozilla.org/foo.html | ← 表示ページ
--------------------------------
↓ ユーザ側(ブラウザ)でhttps://mozilla.org/bar.htmlを表示する
URLスタック
--------------------------------
| |
--------------------------------
| |
--------------------------------
URLバー → | https://mozilla.org/bar.html | ← 表示ページ
--------------------------------
| https://mozilla.org/foo.html |
--------------------------------
↓ window.history.replaceState({}, '', "https://mozilla.org/bar2.html"
URLスタック
--------------------------------
| |
--------------------------------
| |
----------------------------------------------------------------
URLバー → | https://mozilla.org/bar.html | https://mozilla.org/bar2.html | ← 表示ページ
----------------------------------------------------------------
| https://mozilla.org/foo.html |
--------------------------------
↓ <a href="https://microsoft.con"></a>
URLスタック
--------------------------------
| |
--------------------------------
URLバー → | https://microsoft.com | ← 表示ページ
----------------------------------------------------------------
| https://mozilla.org/bar.html | https://mozilla.org/bar2.html |
----------------------------------------------------------------
| https://mozilla.org/foo.html |
--------------------------------
↓ window.history.back()
URLスタック
--------------------------------
| |
--------------------------------
| https://microsoft.com. |
--------------------------------
URLバー → | https://mozilla.org/bar2.html | ← 表示ページ (bar.html -> bar2.html)
--------------------------------
| https://mozilla.org/foo.html |
--------------------------------
- アクティブな履歴項目が変更されるたびにブラウザウィンドウにposstateイベントが発行される.
- pushState() or replaceState()によって変更項目が作成されている場合,
popstate.stateは, stateのコピーとなる.
ページのLoad時にwindow.history.stateがnullでない場合(pushStateまたはreplaceStateで作成したもの),
ブラウザの再起動などでページをLoadすると, window(ブラウザのタブ)は, onloadイベントを受け取るが, popstateイベントは受け取らない.
この場合, window.history.state経由でstateを取得すべし.