【JavaScript】フォーム入力内容をローカルストレージに保存する方法|リロードしても消えない!

【JavaScript】フォーム入力内容をローカルストレージに保存する方法|リロードしても消えない! JavaScript

入力途中でうっかりリロードしてフォームの内容が消えた——そんな事故を防ぐには、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に保存するには?
Ainput イベントで localStorage.setItem("key", value) を呼び、ページ読み込み時に getItem で復元します。フィールドが多いときは、全体を1つのオブジェクトにして JSON.stringify で一括保存すると効率的です。
Q再読み込み後に自動でフォームを復元するには?
ADOMContentLoaded で 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 を使い分けましょう。リロードで消えないフォームは、ユーザーにとって大きな安心になります。