JavaScript

The History object is an API in JavaScript that enables you to perform browser history operations—such as "Back" and "Forward"—and dynamically modify or manage the URL and session history state.

History

Historyオブジェクトは、ブラウザーが保持している“セッション履歴”を操作するためのAPIを提供します。セッション履歴とは、ユーザーがサイト内でページを遷移した履歴を指しており、一般的にはブラウザの「戻る」「進む」ボタンの動作に対応しています。JavaScriptからHistoryオブジェクトを使うと、プログラム的に「前のページに戻る」や「次のページに進む」などの操作を実行したり、URLと履歴を動的に追加・変更したりできます。

なぜHistoryオブジェクトを学ぶ必要があるのか?

ユーザー体験の向上
SPA(Single Page Application)などで「次の画面に進んだように見えるけれど、実際には画面の一部だけを更新する」という手法がよく使われます。こうしたアプリケーションは、URLを正しく管理しないと“戻る”ボタンが正常に動作しなかったり、履歴に反映されなかったりする問題が起こりやすくなります。
そこでHistory APIを使えば、ユーザーが違和感なく戻る・進むボタンを利用できるようにしたり、ページ遷移したように見せたり、URLを動的に更新したりできるようになります。
ブラウザ互換性と標準仕様
旧来の手法(ハッシュフラグメント # を使ったURL管理)と比べ、Historyオブジェクトを使った履歴操作はHTML5で標準化されたAPIであり、モダンブラウザの多くがサポートしています。そのため、最新のWebアプリケーション開発では押さえておきたい重要な機能です。

Historyオブジェクトの基本プロパティ

history.length

注意: history.length が “現在地のページを含む” という点を覚えておきましょう。例えば、最初に1ページだけしか見ていなければ history.length は 1 となります。

履歴の移動に関するメソッド

history.back()
history.forward()
history.go(n)

履歴スタックの操作(pushState / replaceState)

HTML5から登場したhistory.pushState()とhistory.replaceState()は、画面遷移を伴わずにブラウザの履歴とURLを直接操作できます。SPAのように、部分的にコンテンツを差し替えたい場合や、URLパラメータを動的に変えたい場合に非常に有用です。

history.pushState(state, title, url)
history.replaceState(state, title, url)

popstateイベント

pushState()やreplaceState()を使ってURLを動的に変更したとき、ユーザーが「戻る」や「進む」を押した際には、ページの再読み込みは行われず、代わりにJavaScriptの**popstateイベント**が発生します。このイベントを使うと、履歴の状態が変わったタイミングで画面の描画を更新するといった動きが実現できます。

使い方の例

HTML

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>popstateイベントの例</title>
</head>
<body>
	<h1>History API サンプル</h1>
	<button id="pushStateBtn">pushStateでURLを追加</button>
	<button id="replaceStateBtn">replaceStateでURLを置き換え</button>

	<script>
		// ボタン要素を取得
		const pushStateBtn = document.getElementById('pushStateBtn');
		const replaceStateBtn = document.getElementById('replaceStateBtn');

		// pushStateボタンが押されたときに新しい履歴を追加
		pushStateBtn.addEventListener('click', () => {
			const stateData = { message: 'Pushed!' };
			history.pushState(stateData, 'Pushed State', '/push-sample');
			console.log('pushStateでURLを /push-sample に変更しました');
		});

		// replaceStateボタンが押されたときに現在の履歴を置き換える
		replaceStateBtn.addEventListener('click', () => {
			const stateData = { message: 'Replaced!' };
			history.replaceState(stateData, 'Replaced State', '/replace-sample');
			console.log('replaceStateでURLを /replace-sample に変更しました');
		});

		// popstateイベントの監視
		window.addEventListener('popstate', (event) => {
			// event.state には pushState/replaceState でセットしたstateオブジェクトが入っている
			console.log('popstateイベントが発生:', event.state);
			// ここで画面を更新したり、URLに応じたコンテンツ切り替えをしたりできる
		});
	</script>
</body>
</html>

この例で、ユーザーがブラウザの戻るボタンをクリックすると、popstateイベントが呼び出され、コンソールにevent.stateの内容が表示されます。SPAのルーティングなどでは、この仕組みを使って柔軟に画面更新を行います。

注意点とベストプラクティス

ブラウザの互換性
history.pushState()やhistory.replaceState()はモダンブラウザであればほぼサポートされていますが、古いブラウザ(特にIE9未満)では非対応です。
ポリフィルを用意するか、非対応環境ではフォールバックとしてハッシュ(#)を使ったルーティングに切り替えるなどの対策を考慮する必要があります。
過度な操作を避ける
ユーザーが意図しないタイミングでback()やforward()を呼び出すと、ブラウザの基本操作を乱すことになります。ユーザビリティを損ねる可能性が高いので、通常は必要最低限に留めた方が良いでしょう。
URLの一貫性に注意
pushState()によって更新したURLが正しくリソースを指すようにするか、あるいはサーバ側で適切なルーティングを行う必要があります。ユーザーがそのURLをブックマークしたり、ページを再読み込みしたときに、整合性のある画面が表示されるように設計しましょう。
イベント処理の整理
popstateイベントを使う場合は、履歴変更時にどのように画面をアップデートするかを明確に分けておくとコードが複雑になりにくいです。特に大規模なSPAでは、ルーターライブラリを活用して管理するパターンが一般的です。

まとめ

Historyオブジェクトはセッション履歴を管理するためのAPI
history.back(), history.forward(), history.go() などにより、プログラムでブラウザの戻る・進むを制御できる。
history.lengthで履歴の件数を把握できる。
pushState / replaceStateでURLと履歴を動的に操作
ページを再読み込みせずにURLを変更したり、履歴に新たなエントリを追加・置き換えしたりできる。
SPA実装やモダンなWebアプリケーション開発で特に重要。
popstateイベントを活用して動的な画面更新を実現
pushState等で更新したURLから戻ったときに呼ばれるため、履歴操作にあわせてUIを差し替えることができる。
注意点として、ブラウザ互換性・ユーザビリティ・URLの整合性を考慮
古いブラウザをサポートする場合には対策を検討する必要がある。
過度に履歴操作を行うと、ユーザーが混乱する可能性がある。

History APIは、Webアプリケーションをよりリッチに、かつユーザーフレンドリーにする強力な手段です。とりわけSPA開発ではほぼ必須の知識と言っても過言ではありません。ぜひ理解を深め、実際のプロジェクトで活用してみてください。