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

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

入力途中でうっかりリロードしてフォームの内容が消えた——そんな事故を防ぐには、localStorage に入力内容を一時保存しておきます。次回アクセス時に自動で復元でき、フォームのUXが大きく向上します。

この記事の結論:input イベントで localStorage.setItem に保存し、DOMContentLoadedgetItem から復元します。フィールドが多いなら、まとめて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再読み込み後に自動でフォームを復元するには?
ADOMContentLoadedlocalStorage から値を取得し、input 要素の valuechecked にセットします。送信後や特定条件で removeItem によりクリアする処理も加えましょう。
Qチェックボックスやセレクトも保存できますか?
Aできます。チェックボックスは el.checked(真偽値)、セレクトやテキストは el.value を保存します。復元時も checkedvalue かを分けてセットします。
Q機密情報(パスワード等)を保存してもいい?
Aいいえ。パスワードなどはXSSで読み取られる危険があるため localStorage に保存しないでください。セッション情報はサーバー側のセッションや HttpOnly Cookieで管理します。

まとめ

フォーム入力の保存は、inputsetItemDOMContentLoaded で復元するのが基本です。フィールドが多いなら、まとめて JSON.stringify で保存するとスッキリ書けます。

送信できたら removeItem でクリアし、機密情報は保存しないこと。タブを閉じたら消したいなら sessionStorage を使い分けましょう。リロードで消えないフォームは、ユーザーにとって大きな安心になります。