置換有効

履歴の探索 (Web)

[8] History インターフェイスgo メソッドは、 結合セッション履歴上の移動を求めるものです。 back メソッドは前に1つ、 forward メソッドは先に1つ、 それぞれ移動を求めるものです。

[40] 履歴の探索 (traverse the history) は、 セッション履歴における移動を行う仕様書上の操作です。

仕様書

呼び出し

[2] History インターフェイスgo メソッドは、次のように処理しなければなりません >>1

  1. [3] 第1引数を long として解釈します。省略されていれば、 0 とします。
  2. [4] 文脈オブジェクトの関連付けられた文書完全に活性でなければ、 SecurityError 例外を投げます。
  3. [5] そうでなければ、
    1. [6] 第1引数が 0 なら、 location.reload メソッドのように処理します。
    2. [7] それ以外なら、第1引数の値を⊿として traverse the history by a delta を実行します。

[14] History インターフェイスback メソッドは、次のように処理しなければなりません >>12

  1. [15] 文脈オブジェクトの関連付けられた文書完全に活性でなければ、 SecurityError 例外を投げます。
  2. [16] そうでなければ、⊿ = -1 として traverse the history by a delta を実行します。

[17] History インターフェイスforward メソッドは、次のように処理しなければなりません >>13

  1. [18] 文脈オブジェクトの関連付けられた文書完全に活性でなければ、 SecurityError 例外を投げます。
  2. [19] そうでなければ、⊿ = +1 として traverse the history by a delta を実行します。

[35] 利用者インターフェイスから利用者が履歴上の移動を指示したら、 traverse the history by a delta を適切な ⊿ の値で実行しなければなりません >>21

[36] 多くの Webブラウザーにはメニューバー等で「戻る」 や「進む」の機能が実装されています。直前や直後だけでなく、 結合セッション履歴上の離れた位置に移動できるものもあります。
[37] pushState の濫用を防ぐため、 直前ではなく前のページ (異なる文書エントリー) に移動する方法をも提供するべきかもしれません >>11

[39] navigate は、最終的に履歴の探索を呼び出します。

差分指定による履歴の探索

[22] traverse the history by a delta は、差分 (delta) ⊿ について処理を行うタスクを当該最上位閲覧文脈セッション履歴探索キューの末尾に追加することをいいます >>21

  1. [23] 結合セッション履歴において現在エントリーの索引に ⊿ を加えた値が 0 未満エントリー以上となる時は、ここで停止します。
  2. [24] 結合セッション履歴において現在エントリーの索引に ⊿ を加えた値が索引となるセッション履歴エントリーを得ます。
  3. [25] そのセッション履歴エントリー閲覧文脈を得ます。
  4. [26] その閲覧文脈活性文書unload a document を現在実行中なら、 ここで停止します。
  5. [27] 次のようなタスクタスクキューに入れます。
    タスク
    イベントループ
    その閲覧文脈活性文書イベントループ
    タスク源
    履歴探索タスク源
    処理
    1. [28] その閲覧文脈navigate する閲覧文脈とする navigate が実行中で mature フラグが設定されていないなら、その navigate を取り消します。
    2. [29] その閲覧文脈活性文書セッション履歴エントリー文書と同じ文書でなければ、
      1. [30] 全画面を完全に終了します。
      2. [31] その閲覧文脈活性文書prompt to unload a document を実行します。
      3. [32] refused to allow the document to be unloaded なら、停止します。
      4. [33] その閲覧文脈活性文書unload a document を実行します。
    3. [34] その閲覧文脈において、セッション履歴エントリーへと履歴を探索します。 履歴ナビゲーションフラグは、 とします。

[80] 全画面の終了のあたりのタイミングで固定状態も解除されるものと思われますが、 明文規定はありません。

エントリー指定による履歴の探索

[41] セッション履歴エントリーエントリー置換有効 (replacement enabled) フラグ、 non-blocking events フラグ、 reload-triggered navigation フラグ、 履歴ナビゲーションフラグ (history-navigation flag) について履歴を探索 (traverse the history) するには、 次のようにします >>42

[43] non-blocking events フラグは、 素片識別子へのnavigateの時だけになります。
  1. [87] エントリー文書が破棄されている場合、
    1. [88] navigate します。
      閲覧文脈
      閲覧文脈
      始点閲覧文脈
      エントリー始点閲覧文脈
      要求
      新しい要求
      [86] 要求
      URL
      エントリーURL
      履歴ナビゲーションフラグ
      履歴ナビゲーションフラグ
      reload-navigation flag
      reload-triggered navigation
      その他の引数
      エントリーnavigate引数
      エントリー更新 (entry update)
      エントリー更新するエントリー
      エントリー
    2. [78] ここで停止します。
  2. セッション履歴現在エントリーの題名を pushState/replaceState が設定していないなら (= 状態オブジェクトが存在し、題名が存在しないなら)、
    1. 題名を document.title の値とします。
  3. 必要があれば、利用者エージェントが永続化させたい状態をセッション履歴現在エントリーに反映させます。現在エントリー持続的利用者状態付きエントリーとなります。
  4. セッション履歴現在エントリーエントリーとで文書が異なるなら、
    1. 最上位閲覧文脈文書族文書に関連付けられた履歴探索タスク源タスクを (あれば) 削除します。
    2. エントリー文書文書の起源セッション履歴現在エントリー文書文書の起源同じ起源でなければ、
      1. セッション履歴閲覧文脈活性文書同じ起源文書と関連付けられており、セッション履歴現在エントリーと連続するすべてのセッション履歴エントリーに、 現在の閲覧文脈名を設定します。
      2. セッション履歴閲覧文脈最上位閲覧文脈で、auxiliary browsing context ではないなら、閲覧文脈名を未設定とします。
    3. セッション履歴閲覧文脈について、 エントリー文書活性文書を設定します。
    4. エントリー閲覧文脈名があれば、
      1. セッション履歴閲覧文脈閲覧文脈名をその名前とします。
      2. セッション履歴閲覧文脈活性文書同じ起源文書と関連付けられており、セッション履歴現在エントリーと連続するすべてのセッション履歴エントリーで、閲覧文脈名を未設定とします。
    5. エントリー文書autofill field nameoffフォーム制御子があれば、その再設定アルゴリズムを呼び出します。
    6. エントリー文書現在文書準備度complete なら、次のようなタスクキューに追加します。
      タスク
      タスク源
      DOM操作タスク源
      処理
      1. 文書page showing フラグがなら、ここで停止します。
      2. 文書page showing フラグをに設定します。
      3. セッション履歴文書可視性変更ステップ群を実行します。
      4. イベント発火します。
        イベント
        イベント名
        pageshow
        インターフェイス
        PageTransitionEvent
        trusted
        対象
        文書Window
        target override
        文書
        bubbles
        cancelable
        persisted
        既定動作
        なし
    7. セッション履歴閲覧文脈活性文書文書の番地を、 エントリーURL に設定します。
    8. hash changedにします。
  5. それ以外なら、
    1. セッション履歴閲覧文脈活性文書文書の番地を、 エントリーURL に設定します。
    2. エントリーセッション履歴現在エントリーとで URL素片識別子が異なるなら、
      1. hash changedにします。
      2. old URL現在エントリーURL にします。
      3. new URLエントリーURL にします。
    3. それ以外なら、
      1. hash changedにします。
  6. [49] 置換有効なら、セッション履歴においてエントリーの直前のセッション履歴エントリーを削除します。
  7. [57] エントリー持続的利用者状態付きエントリーでないなら、
    1. [58] エントリーURL素片識別子があれば、 素片識別子にスクロールします。
  8. [72] state を、 StructuredDesrialize (エントリー直列化済み状態, 現在Realm記録) に設定します。 例外投げられたら、 state を、 null に設定します。
  9. [69] セッション履歴現在エントリーを、エントリーに設定します。
  10. [73] セッション履歴閲覧文脈活性文書History オブジェクトhistory.statestate に設定します。
  11. エントリー文書最新エントリーを持ち、 それがエントリーと異なるなら、 state changedに設定します。そうでなければ、 state changedに設定します。
  12. エントリー文書最新エントリーエントリーに設定します。
  13. [66] non-blocking events フラグが設定されていれば、次の通り処理するDOM操作タスク源タスクキューに入れます。そうでなければ、次の通り処理します。
    1. [63] state changedなら、
      1. [64] 次のイベント発火します。
        イベント
        インターフェイス
        PopStateEvent
        イベント名
        popstate
        対象
        エントリー文書Window
        bubbles
        取り消し可能
        trusted
        state
        state
    2. [60] エントリー持続的利用者状態付きエントリーなら、
      1. [61] 持続的利用者状態の復元を行って構いません。
    3. [62] hash changedなら、
      1. [65] 次のイベント発火します。
        イベント
        インターフェイス
        HashChangeEvent
        イベント名
        hashchange
        対象
        セッション履歴閲覧文脈Window
        bubbles
        取り消し可能
        trusted
        oldURL
        old URL
        newURL
        new URL
  14. [68] 条件が満たされるなら、 webNavigation API の onHistoryStateUpdated を呼び出します。 遷移型遷移修飾子は適宜設定します。現在時刻も引き渡します。
[44] pushState/replaceState は必ず題名の値を設定するようですが...
[45] セッション履歴エントリーに基づきフォームデータを復元する場合、 フォーム制御子dir 属性の値を変更することになるかもしれません >>42。ということは mutation observer が呼び出されることになるかもしれません。
[46] 素片識別子へのnavigateなら non-blocking events フラグが設定されますから、 最後の2つのイベントは別のタスクで実行されることになります。 つまり現在エントリーが更新された後にイベント発火されます。 それ以外の場合には、現在エントリーが更新される前に発火されることになります。
[47] 新しい活性文書が設定されてから新しい現在エントリーが設定されるまで、 最後の2つのイベント以外にスクリプトは実行されませんから、 スクリプトから観測可能な範囲で活性文書現在エントリー文書は常に同じです (現在エントリー文書を直接的に観測する方法はありませんが)。 最後の2つのイベントが (同期的に) 実行されるのは素片識別子へのnavigate の場合 (>>46) のみで、その場合は活性文書は変更されませんから、 現在エントリーは未更新ですが、現在エントリー文書活性文書は同じです。
[53] 活性文書が変化すると、その文書が活性でなくなったことによってレンダリングその他の変化が (おそらくは次のレンダリングの更新のタイミングで) 発生します。 活性文書を参照。
[54] 閲覧文脈名は、履歴の探索の際に保存されたり復元されたりすることになっています。 閲覧文脈名name 属性の設定などによって変化することがあります。
[79] 履歴移動先がキャッシュ禁止の場合や POST の場合に、 モーダルダイアログ非文書表示されることがあります。

[91] 差分指定による履歴の探索の他に、navigate から呼び出されます。

置換有効フラグ

[48] 履歴に関するいくつかの操作と navigate には、 置換有効 (replacement enabled) フラグがあります。 いくつかのメソッドはこのフラグを引数として指定できるほか、 このフラグに相当する2つのメソッドが用意されていることもあります。 いずれにせよ、履歴上で現在エントリーを置換して新しいセッション履歴エントリーとするべきか、現在エントリーの次のエントリーとするべきかを示すものです。

document.open 以外では、最終的に >>49 に行き着きます。

[55] window.open には「新しい (new) 」 フラグがあって、 navigate置換有効フラグとして使われるとともに、 初期「about:blank」文書に関する分岐にも使われます。

[50] navigate/構文解析の最終段階である stops parsingcompletely loaded フラグが設定されるまでは、基本的には置換有効フラグが自動的に設定されます。

これは、 location.href への代入などの JavaScript によるクライアント側リダイレクトが行われた時に、リダイレクトページを履歴から除去するためのものです。 JavaScript 実装初期の Webブラウザーはこの処理をしていなかったため、 利用者戻る操作を行った時にリダイレクトページに戻り、 直ちに自動的にリダイレクトされてしまい不便でした。

[51] 初期「about:blank」文書から最初の文書への navigate でも、基本的に置換有効フラグが設定されます。そのため利用者著者が想定していない空ページは履歴に現れなくなります。

[52] Refresh による自動的なリダイレクトでも、 置換有効フラグが設定されます。

navigation の種別における履歴ナビゲーション

[97] 要求は、 履歴ナビゲーションフラグ (history-navigation flag) を持ちます Fetch Standard。 既定値はです。

[101] 履歴の探索に設定されることがあります。

[102] Request インターフェイスboolean 型のIDL属性 isHistoryNavigation は、 取得時、次にようにしなければなりません Fetch Standard

  1. [103] 文脈オブジェクト履歴ナビゲーションフラグを返します。

関連

[9] history.go はあまり使われません。 結合セッション履歴上の他のエントリーの内容をスクリプトから調べることはできませんし、 入れ子閲覧文脈Pjax を考慮して移動数をスクリプトから推測することも困難なので、 本メソッドは実用的ではありません。

[20] history.back はしばしば「前のページに戻る」リンク・ボタンの実装に使われています。 著者としては簡単に実現できるメリットがありますが、 利用者としては検索エンジンなど外部サイトから当該ページを表示した時に著者が想定していたであろうサイト内動線上の「前」のページを知ることができず、 不便であると批判もされています。

歴史

[59] history.go, history.back, history.forwardJavaScript 1.0 で追加されました。

[10] IRC logs: freenode / #whatwg / 20130923 ( ( 版)) <http://krijnhoetmer.nl/irc-logs/whatwg/20130923>

[56] Make history.go() default to 0 · whatwg/html@a098b12 ( 版) <https://github.com/whatwg/html/commit/a098b126b19733c74e60d302f0089b9064b8f77b>

[67] Move scroll position restoration after popstate ( (domenic著, )) <https://github.com/whatwg/html/commit/98895af2179ad879da9fa57983ab9589251f7950>

[70] Editorial: clean up "traverse the history" (annevk著, ) <https://github.com/whatwg/html/commit/b9c90431ad4c8aa583aee1691a6a1bd355b68b53>

[71] Set current entry earlier in "traverse the history" (annevk著, ) <https://github.com/whatwg/html/commit/dd2166c88e6e01439fcfefb03817184cd5b116dc>

[74] Remove the "replace" argument to window.open() (domenic著, ) <https://github.com/whatwg/html/commit/f444d452cb062ba848570c7b69e6cfcf8aac5c62>

[75] 368366 – page that is javascript redirected never appears in history ( ()) <https://bugzilla.mozilla.org/show_bug.cgi?id=368366>

[76] 754029 – Navigating from a new script tag does not add a session history entry ( ()) <https://bugzilla.mozilla.org/show_bug.cgi?id=754029>

[77] 17041 – Setting location before the page is done loading shouldn't always be a replace load ( ()) <https://www.w3.org/Bugs/Public/show_bug.cgi?id=17041>

[81] Breaking: refactor structured clone into serialize/deserialize (domenic著, ) <https://github.com/whatwg/html/commit/97d644c97335956610a31e8ad98d1a388c063e84>

[82] Centralize setting the active document (annevk著, ) <https://github.com/whatwg/html/commit/4257a9bf03f8ebbd6cc8b41933b6c5b619611662>

[83] Fragment navigation should use replacement enabled (annevk著, ) <https://github.com/whatwg/html/commit/cf02423dc52686d084a3191833d939919b5907fd>

[84] Q:

<form><input type="image" src="back.jpg" onclick="history.back()"></form>
... はどうなるでしょう。

[85] Editorial: make traverse the history pass a request to navigate (yutakahirano著, ) <https://github.com/whatwg/html/commit/cc12390b34dcbe0d06f345e55e87b9e7ffca48c5>

[89] Pass a request, rather than URL, to Navigate algorithm by yutakahirano · Pull Request #3642 · whatwg/html () <https://github.com/whatwg/html/pull/3642>

[90] Set request's reload-navigation flag for reloads (yutakahirano著, ) <https://github.com/whatwg/html/commit/3072f1d71fc66c792412e1f5785f047f637545b9>

[92] Set request's reload-navigation flag when the navigation is reload-trigerred by yutakahirano · Pull Request #3592 · whatwg/html () <https://github.com/whatwg/html/pull/3592>

[93] Set request's reload-navigation flag when the navigation is reload-trigerred by yutakahirano · Pull Request #3592 · whatwg/html () <https://github.com/whatwg/html/pull/3592>

[94] Proposal: FetchEvent.navigationLoadType · Issue #1167 · w3c/ServiceWorker () <https://github.com/w3c/ServiceWorker/issues/1167>

[95] Make popstate and hashchange events not bubble (foolip著, ) <https://github.com/whatwg/html/commit/85e1e724cf09574dba47d5eae689bdb5b7fd6502>

[96] Set request's history-navigation flag for history traversal (yutakahirano著, ) <https://github.com/whatwg/html/commit/437ae8e13bd1b27b951567905e192f78924819d5>

[98] Proposal: FetchEvent.navigationLoadType · Issue #1167 · w3c/ServiceWorker () <https://github.com/w3c/ServiceWorker/issues/1167>

[99] Set request's history-navigation flag for history traversal by yutakahirano · Pull Request #3674 · whatwg/html () <https://github.com/whatwg/html/pull/3674>

[100] Add Request's isHistoryNavigation (yutakahirano著, ) <https://github.com/whatwg/fetch/commit/bd9b4e3d14520a41e5c49f3ec9c9c6de0035ce07>

[104] Add Request's isHistoryNavigation by yutakahirano · Pull Request #718 · whatwg/fetch () <https://github.com/whatwg/fetch/pull/718>

[105] document.open() simplifications, part 1 (TimothyGu著, ) <https://github.com/whatwg/html/commit/6f769b8089a843066aa19f5991405bf4c84458b3>

[106] At least Blink does not support document.open()'s replace parameter · Issue #3564 · whatwg/html () <https://github.com/whatwg/html/issues/3564>

[107] Remove overridden reload concept (TimothyGu著, ) <https://github.com/whatwg/html/commit/6440ccae7340ea41d3eb5bf8ff0b3b27363eda85>