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
現在のブラウザタブ(またはウィンドウ)で、履歴に格納されているエントリー(ページ)の数を表します。
例:console.log(history.length);
履歴に何ページ分の情報があるのかを確認できます。
注意: history.length が “現在地のページを含む” という点を覚えておきましょう。例えば、最初に1ページだけしか見ていなければ history.length は 1 となります。
履歴の移動に関するメソッド
history.back()
ブラウザの「戻る」ボタンと同様の動作を行います。
例:
// 前のページに戻る
history.back();
history.forward()
ブラウザの「進む」ボタンと同様の動作を行います。
例:
// 次のページに進む
history.forward();
history.go(n)
履歴を相対的に移動します。n には移動するステップ数を指定します。
例1:
// 1ページ前に戻る(つまりhistory.back()と同様)
history.go(-1);
例2:
// 2ページ先に進む
history.go(2);
0 を指定すると、現在のページをリロードします。(例: history.go(0);)
履歴スタックの操作(pushState / replaceState)
HTML5から登場したhistory.pushState()とhistory.replaceState()は、画面遷移を伴わずにブラウザの履歴とURLを直接操作できます。SPAのように、部分的にコンテンツを差し替えたい場合や、URLパラメータを動的に変えたい場合に非常に有用です。
history.pushState(state, title, url)
新しい履歴エントリを作成し、URLを更新します。
引数:
state
履歴エントリに紐づける任意のオブジェクト。画面の状態などを保存できます。
title
ほとんどのブラウザでは無視されますが、将来的に使われる可能性があるため一応設定しておくことが推奨されています。
url
ブラウザのアドレスバーに表示されるURLを指定します。
例:
// 現在の状態を“stateObj”に入れ、新しいURL“/new-page”を履歴に追加
const stateObj = { someData: '保存したいデータ' };
history.pushState(stateObj, 'new page title', '/new-page');
このコードを実行すると、実際にはページ遷移を起こさずにURLが/new-pageに変わり、履歴には新しいエントリが追加されます。
history.replaceState(state, title, url)
“現在の”履歴エントリを置き換えます。
画面遷移をせずにURLを変更しつつ、履歴は増やさず上書きしたい場合に使います。
引数の意味はpushStateと同じです。
例:
const newStateObj = { updatedData: '更新されたデータ' };
history.replaceState(newStateObj, 'replaced page title', '/replaced-page');
このコードを実行すると、履歴を上書きする形で、URLを/replaced-pageに変更します。
popstateイベント
pushState()やreplaceState()を使ってURLを動的に変更したとき、ユーザーが「戻る」や「進む」を押した際には、ページの再読み込みは行われず、代わりにJavaScriptの**popstateイベント**が発生します。このイベントを使うと、履歴の状態が変わったタイミングで画面の描画を更新するといった動きが実現できます。
使い方の例
<!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開発ではほぼ必須の知識と言っても過言ではありません。ぜひ理解を深め、実際のプロジェクトで活用してみてください。
Home
HTML (HyperText Markup Language)
ウェブページの基本的な構造を作成します。見出し、段落、リンク、画像などの要素を定義します。
<!DOCTYPE>
書かれた HTML文書が、どのバージョンで書かれたものかを宣言します。(文書型宣言)
body 要素
ドキュメントの本文
button 要素
ユーザーがクリックすることで何らかのアクションを実行するためのボタンを作成する。
h1~h6 要素
セクションに見出しを付けます。
head 要素
ドキュメントのメタデータを格納します。
html 要素
Webページのルート要素であり、全ての要素を囲む親要素です。
meta 要素
その文書に関する情報(メタデータ)を指定する際に使用します。
script 要素
Webページに動的な機能や挙動を追加するために使用される、JavaScriptコードを含めるための方法です。
title 要素
ドキュメントのタイトル
グローバル属性
id 属性
要素を一意に識別するための属性です。同じ識別名はページ内で1回しか使えません。
CSS (Cascading Style Sheets)
ウェブページのデザインやレイアウトを設定します。色、フォント、レイアウトなどのスタイルを指定します。
JavaScript
ウェブページにインタラクティブな動作を追加します。フォームの検証、アニメーション、リアルタイムのデータ処理などを行います。
アロー関数
=> (矢)を使って関数リテラルを記述します。
addEventListener
イベントリスナー(さまざまなイベントに合わせて処理を実行させる関数)を登録するためのメソッドです。
const
文字列や数値などのデータに名前を付けたり繰り返し利用するために、データを保持するための変数を宣言します。
document
ドキュメントを参照する。
getElementById
オブジェクトの情報を id で取得する。
window
ウィンドウを使用する。
PHP (Hypertext Preprocessor)
サーバー上で動作してデータベースと連携し、動的なWebページを簡単に作成できるスクリプト言語です。
API
APIとは、異なるソフトウェアやシステム同士がデータや機能をやり取りするためのインターフェースです。
Console API
console.log
コンソール画面にログを表示する。