【JavaScript】簡単な入力チェックを行う方法

フォームの入力チェック(バリデーション)は、ユーザーに正しいデータを入力してもらうために欠かせません。JavaScriptで実装できますが、実はHTML5の標準機能だけで多くのチェックは自動化できます。

この記事では、まずHTML5の標準バリデーションを活かし、足りない部分をJavaScriptで補う、という実務的な進め方で解説します。エラー表示・フォーカス・アクセシビリティまで押さえます。

この記事の結論:まず requiredtype="email"制約検証APIcheckValidity())で標準チェックを使います。独自チェックは value.trim() で空白を除き、errors 配列にためてtextContent で表示。エラー時は最初の項目に focus() すると親切です。
スポンサーリンク

まずHTML5の標準バリデーションを使う

入力欄に requiredtype="email" を付けるだけで、ブラウザが標準で形式チェックをしてくれます。これをJavaScriptから扱うのが制約検証APIです。

HTML
<form id="form">
  <label for="name">名前</label>
  <input type="text" id="name" required>

  <label for="email">メールアドレス</label>
  <input type="email" id="email" required>

  <button type="submit">送信</button>
  <div id="errors" role="alert"></div>
</form>
JavaScript:制約検証APIで送信時チェック
const form = document.getElementById("form");

form.addEventListener("submit", (event) => {
  if (!form.checkValidity()) {   // 1つでも不正なら
    event.preventDefault();
    form.reportValidity();       // 標準エラーを表示+最初のエラー項目へ自動フォーカス
  }
});

reportValidity()ブラウザ標準のエラー表示と、最初のエラー項目へのフォーカスまで自動で行います。メッセージを自作したいときは setCustomValidity() を使います(メールの形式チェックの詳細はメールアドレスをチェックする方法を参照)。

JavaScriptで独自にチェックする(submit時)

標準機能で足りない条件や、エラーをまとめて自前で表示したい場合はJavaScriptで実装します。ポイントはvalue.trim() で前後の空白を除いてから判定することです。空白だけの入力を「入力済み」と誤判定しないためです。

JavaScript:独自チェックとエラー表示
const form = document.getElementById("form");
const errorBox = document.getElementById("errors");

form.addEventListener("submit", (event) => {
  const errors = [];
  const name = document.getElementById("name").value.trim();
  const email = document.getElementById("email").value.trim();

  if (!name) errors.push("名前を入力してください。");

  if (!email) {
    errors.push("メールアドレスを入力してください。");
  } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
    errors.push("有効なメールアドレスを入力してください。");
  }

  errorBox.textContent = ""; // 表示をリセット
  if (errors.length > 0) {
    event.preventDefault();   // 送信を止める
    errors.forEach((msg) => {
      const p = document.createElement("p");
      p.textContent = msg;    // textContentでXSSを防ぐ
      errorBox.appendChild(p);
    });
  }
});

エラー文は innerHTML ではなく textContent で表示します。ユーザー入力を含めるときに innerHTML を使うとXSSの危険があるためです(textContent・innerHTMLの使い分け)。

最初のエラー項目にフォーカスする

エラーがあったら最初の問題の項目へフォーカスを移すと、ユーザーがすぐ修正できます。HTML5の :invalid 疑似クラスを使えば一行です。

JavaScript:最初のエラー項目へフォーカス
const firstInvalid = form.querySelector(":invalid");
if (firstInvalid) {
  firstInvalid.focus();
}

独自チェックの場合は、最初にエラーになったフィールドを覚えておいて focus() します。フォーカスの当て方は特定の要素をフォーカスする方法で詳しく解説しています。

入力中・離脱時にリアルタイムでチェックする

送信時だけでなく、入力中(input)や項目を離れたとき(blurにチェックすると、ユーザーは早めに間違いに気づけます。送信時の最終チェックと組み合わせるのが理想です。

JavaScript:blurでリアルタイムチェック
const name = document.getElementById("name");
const nameError = document.getElementById("name-error");

name.addEventListener("blur", () => {
  nameError.textContent = name.value.trim() ? "" : "名前を入力してください。";
});

入力監視のイベント(input / change)の使い分けやデバウンスはフォーム入力をリアルタイムで監視する方法にまとめています。

アクセシブルにエラーを伝える(aria属性)

エラー表示は、スクリーンリーダー利用者にも伝わるように aria 属性を付けます。aria-describedby で入力欄とエラー文を関連付け、role="alert" で読み上げ、aria-invalid で状態を示します。

HTML
<input type="email" id="email" required
       aria-describedby="email-error" aria-invalid="false">
<span id="email-error" role="alert"></span>
JavaScript:エラー時にaria-invalidを更新
const email = document.getElementById("email");
const emailError = document.getElementById("email-error");

function showEmailError(message) {
  emailError.textContent = message;
  email.setAttribute("aria-invalid", message ? "true" : "false");
}

よくある質問(FAQ)

QJavaScriptで簡単なバリデーションを実装するには?
A各入力の value.trim() の長さや正規表現でチェックし、エラーメッセージをDOMに挿入します。submit イベントで全フィールドを検証し、問題があれば preventDefault() で送信を止めます。requiredtype="email" を付ければ、多くは標準機能で自動チェックできます。
Qリアルタイムバリデーションとsubmit時バリデーションのどちらを使うべき?
A両方の組み合わせが推奨です。入力中(input)やフォーカス離脱時(blur)にリアルタイム確認し、送信時(submit)に最終検証を行います。
Qバリデーションのエラーメッセージをアクセシブルに表示するには?
Aaria-describedby でエラー文と入力欄を関連付け、role="alert" でスクリーンリーダーに通知します。エラー時に入力欄へ aria-invalid="true" を設定することも重要です。
Qなぜ value === “” ではなく value.trim() を使うのですか?
Avalue === "" では、スペースだけの入力(" ")を「入力済み」と誤判定します。value.trim() で前後の空白を除いてから判定すれば、空白のみの入力もはじけます。

まとめ

入力チェックは、まず required / type="email"制約検証API(checkValidity / reportValidityで標準機能を活かし、足りない部分をJavaScriptで補うのが効率的です。

独自チェックでは value.trim() で空白を除きerrors 配列にためて textContent で安全に表示します。最初のエラー項目への focus()blur でのリアルタイム確認、aria 属性でのアクセシブルな表示まで加えると、使いやすいフォームになります。