入力途中でうっかりリロードしてフォームの内容が消えた——そんな事故を防ぐには、localStorage に入力内容を一時保存しておきます。次回アクセス時に自動で復元でき、フォームのUXが大きく向上します。
この記事の結論:
input イベントで localStorage.setItem に保存し、DOMContentLoaded で getItem から復元します。フィールドが多いなら、まとめて1つのオブジェクトにして JSON.stringify で保存。送信できたら removeItem でクリアし、機密情報は保存しないのが鉄則です。完成イメージ(動くデモ)
↓ 入力したあと、このページをリロード(再読み込み)してみてください。入力内容が残っているのが分かります:
このデモは、入力のたびに localStorage へ自動保存し、読み込み時に復元しています。下のコードがその実装です。
localStorageとは?
- ブラウザにキーと値でデータを保存できるWeb API(文字列のみ保存可能)
- 容量は約5MB。サーバーとは無関係に端末に保存される
- 有効期限なし(手動で削除しない限り残る)
基本操作はlocalStorageの使い方完全ガイドで詳しく解説しています。
基本:1つの入力を保存・復元する
まずはシンプルに1つの入力欄で。input イベントで保存し、読み込み時に復元します。getItem は値が無いと null を返すので|| "" で空文字にフォールバックします。
HTML
<input type="text" id="name" placeholder="名前を入力">
JavaScript:1フィールドの保存・復元
const name = document.getElementById("name");
// 読み込み時に復元
window.addEventListener("DOMContentLoaded", () => {
name.value = localStorage.getItem("name") || "";
});
// 入力のたびに保存
name.addEventListener("input", () => {
localStorage.setItem("name", name.value);
});
複数フィールドをまとめて保存(JSON.stringify)
フィールドが増えると1つずつ書くのは大変です。フォーム全体を1つのオブジェクトにまとめ、JSON.stringify で保存するとスッキリ書け、チェックボックスにも対応できます。
HTML:複数フィールドのフォーム
<form id="myForm"> <input type="text" id="name" placeholder="名前"> <textarea id="memo" placeholder="メモ"></textarea> <label><input type="checkbox" id="agree"> 同意する</label> <button type="submit">送信</button> </form>
JavaScript:まとめて保存・復元
const form = document.getElementById("myForm");
const KEY = "formData";
// すべてのフィールドを1つのオブジェクトにして保存
function save() {
const data = {};
form.querySelectorAll("input, textarea, select").forEach((el) => {
data[el.id] = el.type === "checkbox" ? el.checked : el.value;
});
localStorage.setItem(KEY, JSON.stringify(data));
}
// 読み込み時にまとめて復元
window.addEventListener("DOMContentLoaded", () => {
const saved = JSON.parse(localStorage.getItem(KEY) || "{}");
Object.entries(saved).forEach(([id, value]) => {
const el = document.getElementById(id);
if (!el) return;
if (el.type === "checkbox") el.checked = value;
else el.value = value;
});
});
form.addEventListener("input", save); // どのフィールドでも保存
入力のリアルタイム監視(文字数カウントやバリデーション)はフォーム入力をリアルタイムで監視する方法も参考になります。
送信後にクリアする(removeItem)
無事に送信できたら、保存した下書きは不要です。removeItem で削除します。
JavaScript:送信時にクリア
form.addEventListener("submit", () => {
localStorage.removeItem("formData"); // 下書きを削除
});
注意点(機密情報・保存先)
機密情報は保存しない:パスワードやクレジットカード番号などは
localStorage に保存しないでください。XSS攻撃で読み取られるリスクがあります。名前やメモなど、漏れても影響の小さい下書きに留めましょう。プライベートモード・容量超過に注意:シークレットモードや、保存容量(約5MB)を超えたときは、
localStorage への保存が例外を投げることがあります。保存・復元は try...catch で囲み、失敗してもフォーム自体は使えるようにしておくと安全です(上のデモも try...catch で囲っています)。- 端末ごとの保存なので、他の端末・他のユーザーとは共有されない
- 「タブを閉じたら消す」なら、
localStorageではなくsessionStorageを使う(localStorageとsessionStorageの違い) - 保存できるのは文字列だけ。オブジェクトは
JSON.stringify/JSON.parseで変換する
よくある質問(FAQ)
Qフォームの入力値をlocalStorageに保存するには?
A
input イベントで localStorage.setItem("key", value) を呼び、ページ読み込み時に getItem で復元します。フィールドが多いときは、全体を1つのオブジェクトにして JSON.stringify で一括保存すると効率的です。Q再読み込み後に自動でフォームを復元するには?
A
DOMContentLoaded で localStorage から値を取得し、input 要素の value や checked にセットします。送信後や特定条件で removeItem によりクリアする処理も加えましょう。Qチェックボックスやセレクトも保存できますか?
Aできます。チェックボックスは
el.checked(真偽値)、セレクトやテキストは el.value を保存します。復元時も checked か value かを分けてセットします。Q機密情報(パスワード等)を保存してもいい?
Aいいえ。パスワードなどはXSSで読み取られる危険があるため
localStorage に保存しないでください。セッション情報はサーバー側のセッションや HttpOnly Cookieで管理します。まとめ
フォーム入力の保存は、input で setItem、DOMContentLoaded で復元するのが基本です。フィールドが多いなら、まとめて JSON.stringify で保存するとスッキリ書けます。
送信できたら removeItem でクリアし、機密情報は保存しないこと。タブを閉じたら消したいなら sessionStorage を使い分けましょう。リロードで消えないフォームは、ユーザーにとって大きな安心になります。

