URLの変更・履歴操作
history.pushState replaceState URLSearchParams
ページ遷移なしでブラウザのURLや履歴スタックを操作します。SPAのルーティングの基盤となる技術です。
デモ:URL操作(ページ遷移なし)
現在のURL:
履歴スタック数: 0
コード例
js
// ページ遷移なしでURLを変更(履歴に追加)
history.pushState({ page: 2 }, '', '/page/2');
// ページ遷移なしでURLを変更(履歴を置換)
history.replaceState({ search: 'q' }, '', '?q=hello');
// 状態取得
console.log(history.state); // { page: 2 }
console.log(history.length); // 履歴スタック数
// ブラウザの戻る・進む
history.back();
history.forward();
history.go(-2); // 2つ前
// popstate イベント(戻る・進むで発火)
window.addEventListener('popstate', (e) => {
console.log('状態:', e.state);
renderPage(e.state?.page); // ページを再描画
});
// URLSearchParams(クエリパラメータ操作)
const params = new URLSearchParams(window.location.search);
params.get('page'); // "2"
params.set('page', '3');
params.append('tag', 'js'); // 追加(同名キーも可)
params.delete('old');
params.has('page'); // true
// URLにセット
window.history.pushState({}, '', '?' + params.toString());
// URL クラス(URL全体の操作)
const url = new URL(window.location.href);
url.searchParams.set('filter', 'active');
url.pathname = '/new-path';
url.hash = '#section1';
history.pushState({}, '', url.toString());比較:pushState vs replaceState
| 観点 | pushState | replaceState |
|---|---|---|
| 履歴への影響 | 新しい履歴エントリを追加 | 現在の履歴エントリを置換 |
| 戻るボタン | 前のページに戻れる | 元のURLに戻れない |
| 使いどころ | SPAページ遷移、タブ切り替え | フィルター・検索(戻り不要な変更) |
NEWNavigation API(History API の後継, Chrome 102+)
History API の問題点(state管理の複雑さ、cross-documentナビゲーション非対応)を解決する新APIです。
js
// Navigation API(Chrome 102+)
navigation.addEventListener('navigate', (e) => {
// 全ナビゲーションを interceptできる
if (!shouldHandleUrl(e.destination.url)) return;
e.intercept({
async handler() {
// 遷移前の処理
const data = await fetchPageData(e.destination.url);
renderPage(data);
}
});
});
// プログラムナビゲーション
navigation.navigate('/new-page', { state: { from: 'home' } });
navigation.back();
navigation.forward();
// 現在のエントリ
navigation.currentEntry.url;
navigation.currentEntry.state;🤖 AIプロンプトテンプレート
以下のようなHistory APIのpushState / replaceState / popstateイベントのサンプルコードを生成してください: - history.pushStateでページ遷移なしにURLを変更してSPAルーティングを実装 - history.replaceStateでフィルター・検索条件をURLに反映する方法 - popstateイベントでブラウザの戻る・進むに対応したページ再描画の実装 - URLSearchParamsを使ったクエリパラメータの追加・更新・削除 - URLクラスを使ってhref・pathname・hashをまとめて操作するパターン
⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。