[8] [CODE(DOMi)@en[[[History]]]] [[インターフェイス]]の
[DFN[[CODE(DOMm)@en[[[go]]]]]] [[メソッド]]は、
[[結合セッション履歴]]上の移動を求めるものです。
[DFN[[CODE(DOMm)@en[[[back]]]]]] [[メソッド]]は前に1つ、
[DFN[[CODE(DOMm)@en[[[forward]]]]]] [[メソッド]]は先に1つ、
それぞれ移動を求めるものです。

[40] [DFN[[RUBYB[履歴の探索]@en[traverse the history]]]]は、
[[セッション履歴]]における移動を行う仕様書上の操作です。

* 仕様書

[REFS[
- [1] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#dom-history-go>
- [12] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#dom-history-back>
- [13] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#dom-history-forward>
- [21] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#traverse-the-history-by-a-delta>
- [11] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#history-notes>
- [42] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#traverse-the-history>
]REFS]

* 呼び出し

[2] [CODE(DOMi)@en[[[History]]]] [[インターフェイス]]の 
[DFN[[CODE(DOMm)@en[[[go]]]]]] [[メソッド]]は、次のようにしなければ[MUST[なりません]]
[SRC[>>1]]。

[FIG(steps)[
= [3] [VAR[⊿]]
を、第1引数を [CODE(IDL)@en[[[long]]]] として解釈した結果に設定します。
既定値は [N[0]] とします。
= [109] [VAR[文書]]を、
[[文脈オブジェクト]]の[F[文書]]に設定します。
= [4] [VAR[文書]]の[F[完全に活性]]が[[偽]]の場合、
== [110] 
[CODE(DOMe)@en[[[SecurityError]]]] 
[CODE[DOMException]]
を[[投げ]]、
ここで停止します。
= [6]
[VAR[⊿]]
が 
[N[0]]
の場合、
== [5] 
[CODE(JS)@en[[[location.reload]]]] [[メソッド]]のように処理します。
= [111] 
それ以外の場合、
== [7] 
[[traverse the history by a delta]] 
を実行します。
[FIG(list members)[

: [VAR[⊿]] : [VAR[⊿]]
: [VAR[始点閲覧文脈]] : [VAR[文書]]の[F[閲覧文脈]]

]FIG]

]FIG]

[14] [CODE(DOMi)@en[[[History]]]] [[インターフェイス]]の 
[DFN[[CODE(DOMm)@en[[[back]]]]]] [[メソッド]]は、
次のようにしなければ[MUST[なりません]]
[SRC[>>12]]。

[FIG(steps)[
= [15] [VAR[文書]]を、
[[文脈オブジェクト]]の[F[文書]]に設定します。
= [112] [VAR[文書]]の[F[完全に活性]]が[[偽]]の場合、
== [113]  
[CODE(DOMe)@en[[[SecurityError]]]] 
[CODE[DOMException]]
を[[投げ]]、
ここで停止します。
= [16] 
[[traverse the history by a delta]] 
を実行します。
[FIG(list members)[

: [VAR[⊿]] : [N[-1]]
: [VAR[始点閲覧文脈]] : [VAR[文書]]の[F[閲覧文脈]]

]FIG]

]FIG]

[17] [CODE(DOMi)@en[[[History]]]] [[インターフェイス]]の 
[DFN[[CODE(DOMm)@en[[[forward]]]]]] [[メソッド]]は、
次のようにしなければ[MUST[なりません]]
[SRC[>>13]]。

[FIG(steps)[
= [18] [VAR[文書]]を、
[[文脈オブジェクト]]の[F[文書]]に設定します。
= [19] [VAR[文書]]の[F[完全に活性]]が[[偽]]の場合、
== [114]   
[CODE(DOMe)@en[[[SecurityError]]]] 
[CODE[DOMException]]
を[[投げ]]、
ここで停止します。
= [115]  
[[traverse the history by a delta]] 
を実行します。
[FIG(list members)[

: [VAR[⊿]] : [N[+1]]
: [VAR[始点閲覧文脈]] : [VAR[文書]]の[F[閲覧文脈]]

]FIG]

]FIG]

-*-*-

[39] [[navigate]] は、最終的に[[履歴の探索]]を呼び出します。

-*-*-

[36] 普通、
[[Webブラウザー]]には[[ツールバー]]や[[文脈メニュー]]等で
「[DFN[[[戻る]]]]」
や
「[DFN[[[進む]]]]」
の機能が実装されています。直前や直後だけでなく、
[[結合セッション履歴]]上の離れた位置に移動できるものもあります。

[37] [CODE(DOMm)@en[[[pushState]]]] の濫用を防ぐため、
直前ではなく前のページ (異なる[[文書]]の[[エントリー]]) に移動する方法をも提供するべきかもしれません
[SRC[>>11]]。

[116] 
[[Webブラウザー]]によっては[[起源]]や[[サイト]]の境界をヒントに、
[[利用者]]が戻りたいであろうところに戻りやすい工夫をしています。

;; [38] [[利用者インターフェイス]]については[[履歴]]も参照。

[35] [[利用者]]が[[利用者インターフェイス]]からある[[閲覧文脈]]の[[履歴]]上の移動を指示した場合、
適切な
[VAR[⊿]]
と当該[[閲覧文脈]]について、
[[traverse the history by a delta]]
しなければ[MUST[なりません]]
[SRC[>>21]]。



* 差分指定による履歴の探索

[22] [DFN[traverse the history by a delta]] は、
[VAR[⊿]]、
[VAR[始点閲覧文脈]]について、
次のようにします。
[SRC[>>21]]

[FIG(steps)[
= [117] 
[[タスク]] (>>118)
を、
[VAR[始点閲覧文脈]]の[F[最上位閲覧文脈]]の[F[セッション履歴探索キュー]]の末尾に追加します。

]FIG]

[118] 
ここで追加する[[タスク]]は、
次のようにします。
[SRC[>>21]]

[FIG(steps)[
= [23] [[結合セッション履歴]]において[[現在エントリー]]の索引に ⊿ を加えた値が
0 [[未満]]か[[エントリー]]数[[以上]]となる時は、ここで停止します。
= [24] [[結合セッション履歴]]において[[現在エントリー]]の索引に ⊿ を加えた値が索引となる[[セッション履歴エントリー]]を得ます。
= [25] その[[セッション履歴エントリー]]の[[閲覧文脈]]を得ます。
= [119] 
[VAR[始点閲覧文脈]]が
[[allowed to navigate]]
で''ない''場合、
== [120] 
ここで停止します。
= [26] その[[閲覧文脈]]の[[活性文書]]の [[unload a document]] を現在実行中なら、
ここで停止します。
= [27] 次のような[[タスク]]を[[タスクキュー]]に入れます。
[FIG(list members)[
[FIGCAPTION[
[[タスク]]
]FIGCAPTION]
:[[イベントループ]]:その[[閲覧文脈]]の[[活性文書]]の[[イベントループ]]
:[[タスク源]]:[[履歴探索タスク源]]
:処理:
[FIG(steps)[
= [28] その[[閲覧文脈]]を [VAR[[[navigate]] する[[閲覧文脈]]]]とする [[navigate]]
が実行中で [VAR[[[mature]]]] フラグが設定されていないなら、その [[navigate]]
を取り消します。
= [29] その[[閲覧文脈]]の[[活性文書]]が[[セッション履歴エントリー]]の[[文書]]と同じ[[文書]]でなければ、
== [30] [[全画面を完全に終了]]します。
== [31] その[[閲覧文脈]]の[[活性文書]]の [[prompt to unload a document]] を実行します。
== [32] [[refused to allow the document to be unloaded]] なら、停止します。
== [33] その[[閲覧文脈]]の[[活性文書]]の [[unload a document]] を実行します。
= [34] その[[閲覧文脈]]において、[[セッション履歴エントリー]]へと[[履歴を探索]]します。
[VAR[[[履歴ナビゲーションフラグ]]]]は、
[[真]]とします。
]FIG]
]FIG]
]FIG]

[80] [[全画面]]の終了のあたりのタイミングで[[固定状態]]も解除されるものと思われますが、
明文規定はありません。

* エントリー指定による履歴の探索

[41] [[セッション履歴エントリー]][VAR[エントリー]]、
[VAR[[RUBYB[[[置換有効]]]@en[replacement enabled]]]]フラグ、
[VAR[non-blocking events]] フラグ、
[VAR[[[reload-triggered navigation]]]]
フラグ、
[DFN[[RUBYB[履歴ナビゲーションフラグ]@en[history-navigation flag]]]]について[DFN[[RUBYB[[[履歴を探索]]]@en[traverse the history]]]]するには、
次のようにします [SRC[>>42]]。

;; [43] [VAR[non-blocking events]] フラグは、
[[素片識別子へのnavigate]]の時だけ[[真]]になります。

[FIG(steps)[
= [87] [VAR[エントリー]]の[F[文書]]が破棄されている場合、
== [88] [[navigate]] します。
[FIG(list members)[

: [VAR[閲覧文脈]] : [[閲覧文脈]]
: [VAR[始点閲覧文脈]] : [VAR[エントリー]]の[F[始点閲覧文脈]]
: [VAR[要求]] : 新しい[[要求]]
[FIG(list members)[ [86] [[要求]]

: [F[URL][要求URL]] : [VAR[エントリー]]の [F[URL]]
: [F[履歴ナビゲーションフラグ]] : [VAR[[[履歴ナビゲーションフラグ]]]] 
: [F[reload-navigation flag]] : [VAR[[[reload-triggered navigation]]]]
:その他の[[引数]]:
@@[VAR[エントリー]]の [[navigate]] の[[引数]]

]FIG]
: [F[[RUBYB[[[エントリー更新]]]@en[entry update]]]] : [[真]]
:[[エントリー更新]]する[[エントリー]]:[VAR[エントリー]]

]FIG]
== [78] ここで停止します。
= [[セッション履歴]]の[[現在エントリー]]の題名を 
[CODE(DOMm)@en[[[pushState]]]]/[CODE(DOMm)@en[[[replaceState]]]] が設定していないなら
(= [[状態オブジェクト]]が存在し、[[題名]]が存在しないなら)、
== 題名を [CODE(JS)@en[[[document.title]]]] の値とします。
= 必要があれば、[[利用者エージェント]]が永続化させたい状態を[[セッション履歴]]の[[現在エントリー]]に反映させます。[[現在エントリー]]は[[持続的利用者状態付きエントリー]]となります。
= [[セッション履歴]]の[[現在エントリー]]と[VAR[エントリー]]とで[[文書]]が異なるなら、
== [[最上位閲覧文脈]]の[[文書族]]の[[文書]]に関連付けられた[[履歴探索タスク源]]の[[タスク]]を (あれば) 削除します。
== [VAR[エントリー]]の[[文書]]の[[文書の起源]]が[[セッション履歴]]の[[現在エントリー]]の[[文書]]の[[文書の起源]]と[[同じ起源]]でなければ、
=== [[セッション履歴]]の[[閲覧文脈]]の[[活性文書]]と[[同じ起源]]の[[文書]]と関連付けられており、[[セッション履歴]]の[[現在エントリー]]と連続するすべての[[セッション履歴エントリー]]に、
現在の[[閲覧文脈名]]を設定します。
=== [[セッション履歴]]の[[閲覧文脈]]が[[最上位閲覧文脈]]で、[[auxiliary browsing context]]
ではないなら、[[閲覧文脈名]]を未設定とします。
== [[セッション履歴]]の[[閲覧文脈]]について、
[VAR[エントリー]]の[F[文書]]に[[活性文書を設定]]します。
== [VAR[エントリー]]に[[閲覧文脈名]]があれば、
=== [[セッション履歴]]の[[閲覧文脈]]の[[閲覧文脈名]]をその名前とします。
=== [[セッション履歴]]の[[閲覧文脈]]の[[活性文書]]と[[同じ起源]]の[[文書]]と関連付けられており、[[セッション履歴]]の[[現在エントリー]]と連続するすべての[[セッション履歴エントリー]]で、[[閲覧文脈名]]を未設定とします。
== [VAR[エントリー]]の[[文書]]に [[autofill field name]]
が [CODE[[[off]]]] の[[フォーム制御子]]があれば、その[[再設定アルゴリズム]]を呼び出します。
== [VAR[エントリー]]の[[文書]]の[[現在文書準備度]]が
[CODE[[[complete]]]] なら、次のような[[タスク]]を[[キュー]]に追加します。
[FIG(list members)[
[FIGCAPTION[
[[タスク]]
]FIGCAPTION]
:[[タスク源]]:[[DOM操作タスク源]]
:処理:
[FIG(steps)[
= [[文書]]の [[page showing]] フラグが[[真]]なら、ここで停止します。
= [[文書]]の [[page showing]] フラグを[[真]]に設定します。
= [[セッション履歴文書可視性変更ステップ群]]を実行します。
= [[イベント]]を[[発火]]します。
[FIG(list members short)[
[FIGCAPTION[
[[イベント]]
]FIGCAPTION]
:[[イベント名]]:[CODE(DOMe)@en[[[pageshow]]]]
:[[インターフェイス]]:[CODE(DOMi)@en[[[PageTransitionEvent]]]]
:[[trusted]]:[[真]]
:[[対象]]:[[文書]]の [CODE(DOMi)@en[[[Window]]]]
:[[target override]]:[[文書]]
:[[bubbles]]:[[偽]]
:[[cancelable]]:[[偽]]
:[CODE(DOMa)@en[[[persisted]]]]:[[真]]
:[[既定動作]]:なし
]FIG]
]FIG]
]FIG]
== [[セッション履歴]]の[[閲覧文脈]]の[[活性文書]]の[[文書の番地]]を、
[VAR[エントリー]]の [[URL]] に設定します。
== [VAR[hash changed]] を[[偽]]にします。
= それ以外なら、
== [[セッション履歴]]の[[閲覧文脈]]の[[活性文書]]の[[文書の番地]]を、
[VAR[エントリー]]の [[URL]] に設定します。
== [VAR[エントリー]]と[[セッション履歴]]の[[現在エントリー]]とで
[[URL]] の[[素片識別子]]が異なるなら、
=== [VAR[hash changed]] を[[真]]にします。
=== [VAR[old URL]] を[[現在エントリー]]の [[URL]] にします。
=== [VAR[new URL]] を[VAR[エントリー]]の [[URL]] にします。
== それ以外なら、
=== [VAR[hash changed]] を[[偽]]にします。
= [49] [VAR[[[置換有効]]]]なら、[[セッション履歴]]において[VAR[エントリー]]の直前の[[セッション履歴エントリー]]を削除します。
= [57] [VAR[エントリー]]が[[持続的利用者状態付きエントリー]]でないなら、
== [58] [VAR[エントリー]]の [[URL]] に[[素片識別子]]があれば、
[[素片識別子にスクロール]]します。
= [72] 
[VAR[state]] を、
[CODE[[[StructuredDesrialize]] ([VAR[エントリー]]の[F[直列化済み状態]], [[現在Realm記録]])]]
に設定します。
[[例外]]が[[投げ]]られたら、
[VAR[state]] を、 [CODE[null]] に設定します。
= [69] [[セッション履歴]]の[F[現在エントリー]]を、[VAR[エントリー]]に設定します。 
= [73] [[セッション履歴]]の[[閲覧文脈]]の[[活性文書]]の [CODE(DOMi)@en[[[History]]]]
[[オブジェクト]]の [CODE(JS)@en[[[history.state]]]] を [VAR[state]] に設定します。
= [VAR[エントリー]]の[[文書]]が[[最新エントリー]]を持ち、
それが[VAR[エントリー]]と異なるなら、 [VAR[state changed]]
を[[真]]に設定します。そうでなければ、 [VAR[state changed]] を[[偽]]に設定します。
= [VAR[エントリー]]の[[文書]]の[[最新エントリー]]を[VAR[エントリー]]に設定します。
= [66] [VAR[non-blocking events]] フラグが設定されていれば、次の通り処理する[[DOM操作タスク源]]の[[タスク]]を[[キュー]]に入れます。そうでなければ、次の通り処理します。
== [63] [VAR[state changed]] が[[真]]なら、
=== [64] 次の[[イベント]]を[[発火]]します。
[FIG(list members middle)[
[FIGCAPTION[
[[イベント]]
]FIGCAPTION]
:[[インターフェイス]]:[CODE(DOMi)@en[[[PopStateEvent]]]]
:[[イベント名]]:[CODE(DOMe)@en[[[popstate]]]]
:[[対象]]:[VAR[エントリー]]の[[文書]]の[CODE(DOMi)@en[[[Window]]]]
:[[bubbles]]:[[偽]]
:[[取り消し可能]]:[[偽]]
:[[trusted]]:[[真]]
:[CODE(DOMa)@en[[[state]]]]:[VAR[state]]

]FIG]
== [60] [VAR[エントリー]]が[[持続的利用者状態付きエントリー]]なら、
=== [61] [[持続的利用者状態の復元]]を行って構いません。
== [62] [VAR[hash changed]] が[[真]]なら、
=== [65] 次の[[イベント]]を[[発火]]します。
[FIG(list members middle)[
[FIGCAPTION[
[[イベント]]
]FIGCAPTION]
:[[インターフェイス]]:[CODE(DOMi)@en[[[HashChangeEvent]]]]
:[[イベント名]]:[CODE(DOMe)@en[[[hashchange]]]]
:[[対象]]:[[セッション履歴]]の[[閲覧文脈]]の[CODE(DOMi)@en[[[Window]]]]
:[[bubbles]]:[[偽]]
:[[取り消し可能]]:[[偽]]
:[[trusted]]:[[真]]
:[CODE(DOMa)@en[[[oldURL]]]]:[VAR[old URL]]
:[CODE(DOMa)@en[[[newURL]]]]:[VAR[new URL]]

]FIG]
= [68] 条件が満たされるなら、 [CODE[webNavigation]] API の [CODE[onHistoryStateUpdated]]
を呼び出します。
[VAR[[[遷移型]]]]と[VAR[[[遷移修飾子]]群]]は適宜設定します。現在時刻も引き渡します。
]FIG]

;; [44] [CODE(DOMm)@en[[[pushState]]]]/[CODE(DOMm)@en[[[replaceState]]]]
は必ず題名の値を設定するようですが...

;; [45] [[セッション履歴エントリー]]に基づき[[フォームデータ]]を復元する場合、
[[フォーム制御子]]の [CODE(HTMLa)@en[[[dir]]]] [[属性]]の値を変更することになるかもしれません [SRC[>>42]]。ということは [[mutation observer]] が呼び出されることになるかもしれません。

;; [46] [[素片識別子へのnavigate]]なら [VAR[non-blocking events]] フラグが設定されますから、
最後の2つの[[イベント]]は別の[[タスク]]で実行されることになります。
つまり[[現在エントリー]]が更新された後に[[イベント]]が[[発火]]されます。
それ以外の場合には、[[現在エントリー]]が更新される前に[[発火]]されることになります。

;; [47] 新しい[[活性文書]]が設定されてから新しい[[現在エントリー]]が設定されるまで、
最後の2つの[[イベント]]以外に[[スクリプト]]は実行されませんから、
[[スクリプト]]から観測可能な範囲で[[活性文書]]と[[現在エントリー]]の[[文書]]は常に同じです 
([[現在エントリー]]の[[文書]]を直接的に観測する方法はありませんが)。
最後の2つの[[イベント]]が ([[同期的]]に) 実行されるのは[[素片識別子へのnavigate]]
の場合 (>>46) のみで、その場合は[[活性文書]]は変更されませんから、
[[現在エントリー]]は未更新ですが、[[現在エントリー]]の[[文書]]と[[活性文書]]は同じです。

;; [53] [[活性文書]]が変化すると、その[[文書]]が活性でなくなったことによって[[レンダリング]]その他の変化が
(おそらくは次の[[レンダリングの更新]]のタイミングで) 発生します。
[[活性文書]]を参照。

;; [54] [[閲覧文脈名]]は、[[履歴の探索]]の際に保存されたり復元されたりすることになっています。
[[閲覧文脈名]]は [CODE(HTMLa)@en[[[name]]]] [[属性]]の設定などによって変化することがあります。

@@
[79] 履歴移動先がキャッシュ禁止の場合や [CODE[POST]] の場合に、
[[モーダルダイアログ]]や[[非文書表示]]されることがあります。

[91] 差分指定による履歴の探索の他に、[[navigate]] から呼び出されます。

* 置換有効フラグ

[48] [[履歴]]に関するいくつかの操作と [[navigate]] には、
[DFN[[VAR[[RUBYB[[[置換有効]]]@en[replacement enabled]]]]]]フラグがあります。
いくつかの[[メソッド]]はこのフラグを[[引数]]として指定できるほか、
このフラグに相当する2つの[[メソッド]]が用意されていることもあります。
いずれにせよ、[[履歴]]上で[[現在エントリー]]を置換して新しい[[セッション履歴エントリー]]とするべきか、[[現在エントリー]]の次のエントリーとするべきかを示すものです。

;; [CODE(JS)@en[[[document.open]]]] 以外では、最終的に >>49 に行き着きます。

[55] [CODE(JS)@en[[[window.open]]]] には「[VAR[[RUBYB[新しい]@en[new]]]]」
フラグがあって、 [[navigate]] の[[置換有効]]フラグとして使われるとともに、
[[初期「[CODE(URI)@en[about:blank]]」文書]]に関する分岐にも使われます。

[50] [[navigate]]/[[構文解析]]の最終段階である [[stops parsing]] で
[[completely loaded]] フラグが設定されるまでは、基本的には[[置換有効]]フラグが自動的に設定されます。

;; これは、 [CODE(JS)@en[[[location.href]]]] への[[代入]]などの [[JavaScript]]
による[[クライアント側]]の[[リダイレクト]]が行われた時に、[[リダイレクト]]ページを[[履歴]]から除去するためのものです。
[[JavaScript]] 実装初期の [[Webブラウザー]]はこの処理をしていなかったため、
[[利用者]]が[[戻る]]操作を行った時に[[リダイレクト]]ページに戻り、
直ちに自動的に[[リダイレクト]]されてしまい不便でした。

[51] [[初期「[CODE(URI)@en[about:blank]]」文書]]から最初の[[文書]]への
[[navigate]] でも、基本的に[[置換有効]]フラグが設定されます。そのため[[利用者]]や[[著者]]が想定していない空ページは[[履歴]]に現れなくなります。

[52] [CODE(HTTP)@en[[[Refresh]]]] による自動的な[[リダイレクト]]でも、
[[置換有効]]フラグが設定されます。

* navigation の種別における履歴ナビゲーション

[97] [[要求]]は、
[DFN[[RUBY[履歴ナビゲーションフラグ]@en[history-navigation flag]]]]を持ちます
[SRC[[CITE[Fetch Standard]]]]。
既定値は[[偽]]です。

[101] [[履歴の探索]]で[[真]]に設定されることがあります。

[102] [CODE[Request]] [[インターフェイス]]の
[CODE[boolean]] 型の[[IDL属性]]
[DFN[[CODE[isHistoryNavigation]]]] は、
[[取得時]]、次にようにしなければ[MUST[なりません]] [SRC[[CITE[Fetch Standard]]]]。

[FIG(steps)[
= [103] [[文脈オブジェクト]]の[F[履歴ナビゲーションフラグ]]を返します。
]FIG]

* 関連

[9] [CODE(JS)@en[[[history.go]]]] はあまり使われません。
[[結合セッション履歴]]上の他のエントリーの内容を[[スクリプト]]から調べることはできませんし、
[[入れ子閲覧文脈]]や [[Pjax]] を考慮して移動数を[[スクリプト]]から推測することも困難なので、
本メソッドは実用的ではありません。

[20] [CODE(JS)@en[[[history.back]]]] はしばしば「前のページに戻る」リンク・ボタンの実装に使われています。
[[著者]]としては簡単に実現できるメリットがありますが、
[[利用者]]としては[[検索エンジン]]など外部サイトから当該ページを表示した時に[[著者]]が想定していたであろうサイト内動線上の「前」のページを知ることができず、
不便であると批判もされています。

* 歴史

[59] [CODE(JS)@en[[[history.go]]]], [CODE(JS)@en[[[history.back]]]],
[CODE(JS)@en[[[history.forward]]]] は [[JavaScript 1.0]] で追加されました。

[10] [CITE[IRC logs: freenode / #whatwg / 20130923]]
( ([TIME[2013-09-24 20:37:19 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130923>

[56] [CITE@en[Make history.go() default to 0 · whatwg/html@a098b12]]
([TIME[2015-08-28 20:09:59 +09:00]] 版)
<https://github.com/whatwg/html/commit/a098b126b19733c74e60d302f0089b9064b8f77b>

[67] [CITE@en[Move scroll position restoration after popstate]]
( ([[domenic]]著, [TIME[2016-05-28 03:46:12 +09:00]]))
<https://github.com/whatwg/html/commit/98895af2179ad879da9fa57983ab9589251f7950>

[70] [CITE@en[Editorial: clean up "traverse the history"]]
([[annevk]]著, [TIME[2016-07-07 16:31:28 +09:00]])
<https://github.com/whatwg/html/commit/b9c90431ad4c8aa583aee1691a6a1bd355b68b53>

[71] [CITE@en[Set current entry earlier in "traverse the history"]]
([[annevk]]著, [TIME[2016-07-08 03:55:04 +09:00]])
<https://github.com/whatwg/html/commit/dd2166c88e6e01439fcfefb03817184cd5b116dc>

[74] [CITE@en[Remove the "replace" argument to window.open()]]
([[domenic]]著, [TIME[2016-07-19 02:20:54 +09:00]])
<https://github.com/whatwg/html/commit/f444d452cb062ba848570c7b69e6cfcf8aac5c62>

[75] [CITE@en[368366 – page that is javascript redirected never appears in history]]
( ([TIME[2016-08-26 13:56:33 +09:00]]))
<https://bugzilla.mozilla.org/show_bug.cgi?id=368366>

[76] [CITE@en[754029 – Navigating from a new script tag does not add a session history entry]]
( ([TIME[2016-08-26 14:00:50 +09:00]]))
<https://bugzilla.mozilla.org/show_bug.cgi?id=754029>

[77] [CITE@en[17041 – Setting location before the page is done loading shouldn't always be a replace load]]
( ([TIME[2016-08-26 14:02:43 +09:00]]))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=17041>

[81] [CITE@en[Breaking: refactor structured clone into serialize/deserialize]]
([[domenic]]著, [TIME[2017-03-21 06:09:33 +09:00]])
<https://github.com/whatwg/html/commit/97d644c97335956610a31e8ad98d1a388c063e84>

[82] [CITE@en[Centralize setting the active document]]
([[annevk]]著, [TIME[2017-05-18 13:20:38 +09:00]])
<https://github.com/whatwg/html/commit/4257a9bf03f8ebbd6cc8b41933b6c5b619611662>

[83] [CITE@en[Fragment navigation should use replacement enabled]]
([[annevk]]著, [TIME[2017-08-19 22:16:53 +09:00]])
<https://github.com/whatwg/html/commit/cf02423dc52686d084a3191833d939919b5907fd>

[84] Q:
[PRE(HTML code)[
<form><input type="image" src="back.jpg" onclick="history.back()"></form>
]PRE]
... はどうなるでしょう。

[85] [CITE@en[Editorial: make traverse the history pass a request to navigate]]
([[yutakahirano]]著, [TIME[2018-04-26 16:46:42 +09:00]])
<https://github.com/whatwg/html/commit/cc12390b34dcbe0d06f345e55e87b9e7ffca48c5>

[89] [CITE@en[Pass a request, rather than URL, to Navigate algorithm by yutakahirano · Pull Request #3642 · whatwg/html]]
([TIME[2018-05-01 13:23:50 +09:00]])
<https://github.com/whatwg/html/pull/3642>

[90] [CITE@en[Set request's reload-navigation flag for reloads]]
([[yutakahirano]]著, [TIME[2018-04-27 16:20:41 +09:00]])
<https://github.com/whatwg/html/commit/3072f1d71fc66c792412e1f5785f047f637545b9>

[92] [CITE@en[Set request's reload-navigation flag when the navigation is reload-trigerred by yutakahirano · Pull Request #3592 · whatwg/html]]
([TIME[2018-05-01 14:01:52 +09:00]])
<https://github.com/whatwg/html/pull/3592>

[93] [CITE@en[Set request's reload-navigation flag when the navigation is reload-trigerred by yutakahirano · Pull Request #3592 · whatwg/html]]
([TIME[2018-05-01 14:01:52 +09:00]])
<https://github.com/whatwg/html/pull/3592>

[94] [CITE@en[Proposal: FetchEvent.navigationLoadType · Issue #1167 · w3c/ServiceWorker]]
([TIME[2018-05-01 14:03:42 +09:00]])
<https://github.com/w3c/ServiceWorker/issues/1167>

[95] [CITE@en[Make popstate and hashchange events not bubble]]
([[foolip]]著, [TIME[2018-06-07 21:23:33 +09:00]])
<https://github.com/whatwg/html/commit/85e1e724cf09574dba47d5eae689bdb5b7fd6502>

[96] [CITE@en[Set request's history-navigation flag for history traversal]]
([[yutakahirano]]著, [TIME[2018-05-26 06:36:06 +09:00]])
<https://github.com/whatwg/html/commit/437ae8e13bd1b27b951567905e192f78924819d5>

[98] [CITE@en[Proposal: FetchEvent.navigationLoadType · Issue #1167 · w3c/ServiceWorker]]
([TIME[2018-06-14 18:06:23 +09:00]])
<https://github.com/w3c/ServiceWorker/issues/1167>

[99] [CITE@en[Set request's history-navigation flag for history traversal by yutakahirano · Pull Request #3674 · whatwg/html]]
([TIME[2018-06-14 18:07:15 +09:00]])
<https://github.com/whatwg/html/pull/3674>

[100] [CITE@en[Add Request's isHistoryNavigation]]
([[yutakahirano]]著, [TIME[2018-05-29 12:22:11 +09:00]])
<https://github.com/whatwg/fetch/commit/bd9b4e3d14520a41e5c49f3ec9c9c6de0035ce07>


[104] [CITE@en[Add Request's isHistoryNavigation by yutakahirano · Pull Request #718 · whatwg/fetch]]
([TIME[2018-06-14 18:19:07 +09:00]])
<https://github.com/whatwg/fetch/pull/718>

[105] [CITE@en[document.open() simplifications, part 1]]
([[TimothyGu]]著, [TIME[2018-08-17 07:20:44 +09:00]])
<https://github.com/whatwg/html/commit/6f769b8089a843066aa19f5991405bf4c84458b3>

[106] [CITE@en[At least Blink does not support document.open()'s replace parameter · Issue #3564 · whatwg/html]]
([TIME[2018-09-05 22:42:14 +09:00]])
<https://github.com/whatwg/html/issues/3564>

[107] [CITE@en[Remove overridden reload concept]]
([[TimothyGu]]著, [TIME[2018-08-18 05:31:49 +09:00]])
<https://github.com/whatwg/html/commit/6440ccae7340ea41d3eb5bf8ff0b3b27363eda85>

[108] [CITE@en[Explicitly prevent sandboxed navigation via History]]
([[dtapuska]]著, [TIME[2019-08-14 03:02:21 +09:00]])
<https://github.com/whatwg/html/commit/2dafc5396632b1f9831f704f35d13d70194db484>

[121] [CITE@en[<iframe> and the History API · Issue #184 · w3c/webcomponents · GitHub]]
([TIME[2020-07-13 12:24:06 +09:00]])
<https://github.com/w3c/webcomponents/issues/184>

[122] [CITE@en[27325 – '''['''Shadow''']''': Figure out how session history should work for <iframe>s in shadow DOM]]
([TIME[2019-04-02 13:48:11 +09:00]])
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=27325>

[123] [CITE@en[Explicitly prevent sandboxed navigation in the history interface. by dtapuska · Pull Request #4787 · whatwg/html · GitHub]]
([TIME[2020-07-13 12:25:06 +09:00]])
<https://github.com/whatwg/html/pull/4787>