JavaScriptのHistory APIにあるreplaceState()メソッドを使うと、ブラウザの履歴を変更することができます。この記事では、replaceState()の基本的な使い方から実践的な実装例まで、わかりやすく解説します。

replaceState()とは

replaceState()は、現在の履歴エントリーを新しい状態に置き換えるメソッドです。ページのURLを変更しても、ブラウザの戻るボタンで前のページに戻れないようにしたい場合などに使用します。

基本的な構文

history.replaceState(state, title, url)

パラメータの説明

  • state: 履歴エントリーに関連付けるデータ(オブジェクト)
  • title: ページのタイトル(現在はほとんどのブラウザで無視される)
  • url: 新しいURL

実装例

基本的な使用例

// 現在のURLを/new-pageに置き換える
history.replaceState(null, '', '/new-page');

クエリパラメータを変更する例

// 現在のURLにクエリパラメータを追加
const newUrl = window.location.pathname + '?param=value';
history.replaceState(null, '', newUrl);

状態データを保存する例

const stateData = {
  userId: 123,
  page: 'profile'
};

history.replaceState(stateData, '', '/user-profile');

よくある使用シーンと実装例

フォーム送信後のURL変更

document.getElementById('myForm').addEventListener('submit', function(e) {
  e.preventDefault();
  
  // フォーム処理
  submitForm().then(() => {
    // 送信後にURLからパラメータを削除
    history.replaceState(null, '', window.location.pathname);
  });
});

SPAでの画面遷移

function navigateToPage(page) {
  // コンテンツの更新
  updateContent(page);
  
  // URLを更新(履歴を残さない)
  history.replaceState(
    { page: page },
    '',
    `/${page}`
  );
}

注意点

1. セキュリティ上の制限により、異なるオリジンのURLには変更できません

2. stateオブジェクトは2MB以下に制限されています

3. IE10以下では対応していないため、必要に応じてポリフィルを使用してください

ブラウザ対応状況

replaceState()は以下のブラウザで使用可能です:

  • Chrome 5+
  • Firefox 4+
  • Safari 5+
  • Edge 12+
  • Opera 11.5+

まとめ

replaceState()を使用することで、ブラウザの履歴を制御し、よりスムーズなユーザー体験を提供することができます。特にSPAやフォーム処理後のURL制御など、モダンなWeb開発では必須の機能となっています。

実装の際は、ブラウザの対応状況や使用制限を確認し、適切なフォールバック処理を実装することをお勧めします。