0Pricing
HTML Academy · レッスン

pushStateとreplaceState

ページ全体を再読み込みせずにブラウザーのURLを更新します

「pushStateとreplaceState」はCoddyKit上の無料HTML Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはHTML Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 HTML Academyコースには全4レッスンが含まれています。

History API

History APIを使うと、ページ全体を移動させずにアドレスバーに表示されるURLを変更できます。クライアントサイドレンダリングと組み合わせることで、ブックマーク可能なURLを維持しながら、ネイティブアプリのように動作するSingle-Page Applicationを実現できます。

pushState

history.pushState(state, "", url)は、ブラウザーの履歴に新しいエントリを追加します。アドレスバーのURLは直ちに更新されますが、ネットワーク リクエストは発生しません。ユーザーはブラウザーの戻るボタンで前のエントリに移動できます。

history.pushState({ view: "settings" }, "", "/settings");

state引数

最初の引数は、そのエントリに関連付けられる任意のシリアライズ可能なデータです。後からhistory.stateまたはpopstateイベントで読み取れます。どのタブが開いていたか、スクロール位置などのUI状態を渡すために使うと、戻る操作で表示を正確に復元できます。

title 引数

2 番目の引数はエントリのタイトルです。実際には、現在のすべてのブラウザーがこれを無視します。タイトルを変更するには document.title = "..." を直接設定してください。慣例として空文字列を渡しますが、効果はありません。

url 引数

3 番目の引数は新しい URL です。相対 URL は現在のページを基準に解決されます。新しい URL は同一オリジンでなければならず、クロスオリジンの場合は SecurityError が発生します。ブラウザーは URL を取得しません。pushState はアドレスバーと履歴を更新するだけです。

replaceState

history.replaceState(state, "", url) は新しい履歴エントリを追加する代わりに、現在の履歴エントリを置き換えます。戻る操作の新しい段階を作らずに URL を更新したい場合(フィルターのクエリ文字列を更新する場合など)に使用します。

// Update query string in place
const url = new URL(location);
url.searchParams.set("filter", "open");
history.replaceState(null, "", url);

pushState の使用例

SPA のルート変更(ページ全体を再読み込みせずにナビゲーションリンクをクリックする場合)、モーダルを開く操作(戻るボタンでモーダルを閉じられるようにする場合)、ウィザードのステップ遷移などです。意味のある状態ごとに新しい履歴エントリにすることで、戻るボタンがユーザーの期待どおりに動作します。

replaceState の使用例

履歴を増やしたくないフィルター、並べ替え、ページネーションの更新、フォームの一部入力後のリダイレクト、ナビゲーション可能なエントリを作らずにトラッキングパラメーターを更新する場合などです。ユーザーが戻る操作を行うと、これらの「中間」状態は飛ばされます。

pushState 後のビューの更新

pushState は URL を変更するだけなので、DOM は別途コードで更新する必要があります。基本的な流れは、新しいコンテンツを描画してから pushState を呼び出すことです。この 2 つを組み合わせることで SPA の操作感が実現します。

function navigate(path) {
  renderPage(path);
  history.pushState(null, "", path);
  window.scrollTo(0, 0);
}

タイトルとメタ情報の更新

ナビゲーション後に document.title と og:title メタタグを更新し、ソーシャル共有やブラウザータブのタイトルに現在のビューを反映させてください。これを忘れると、後で共有したときにも最初のタイトルが残ってしまいます。これは SPA でよくある、気付きにくいバグです。

ページ読み込み時の初期 pushState

ユーザーがナビゲーションする前に pushState を呼び出すと、初期エントリが上書きされます。ページの最初のエントリに state を関連付けるには、代わりに replaceState を使用してください。履歴の深さを変えずに state を追加できます。

セキュリティ上の制約

pushState の URL は同一オリジンでなければなりません。https://evil.com に対して pushState を試みると SecurityError が発生します。これにより、別のサイトにいるとユーザーに思わせるために、ページがアドレスバーを偽装することを防ぎます。

理解度チェック

history.pushState にはない、history.replaceState の働きは何ですか。

まとめ

pushState はページを再読み込みせずに新しい履歴エントリを追加します。これは SPA ルーティングの基盤です。replaceState は現在のエントリをその場で更新するため、見た目上の URL 変更に使用します。どちらも同一オリジンの URL を必要とし、title 引数は無視します。DOM は必ず別途更新し、ナビゲーション後には document.title とメタタグも更新してください。

よくある質問

「pushStateとreplaceState」レッスンは無料ですか?

はい。「pushStateとreplaceState」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、HTML Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 HTML Academyコースには全4レッスンが含まれています。

「pushStateとreplaceState」で何を学びますか?

ページ全体を再読み込みせずにブラウザーのURLを更新します ブラウザで直接実行するハンズオンコードでHTML Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

HTML Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのHTML Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「pushStateとreplaceState」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このHTML Academyレッスンでコードを書いて実行できますか?

はい。すべてのHTML Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. pushStateとreplaceState
  2. popstateイベント
  3. ハッシュベースとパスベースのルーティング
  4. Navigation API:モダンブラウザー
← HTML Academyに戻る