フォームの入力チェック(バリデーション)は、ユーザーに正しいデータを入力してもらうために欠かせません。JavaScriptで実装できますが、実はHTML5の標準機能だけで多くのチェックは自動化できます。
この記事では、まずHTML5の標準バリデーションを活かし、足りない部分をJavaScriptで補う、という実務的な進め方で解説します。エラー表示・フォーカス・アクセシビリティまで押さえます。
required や type="email" + 制約検証API(checkValidity())で標準チェックを使います。独自チェックは value.trim() で空白を除き、errors 配列にためてtextContent で表示。エラー時は最初の項目に focus() すると親切です。まずHTML5の標準バリデーションを使う
入力欄に required や type="email" を付けるだけで、ブラウザが標準で形式チェックをしてくれます。これをJavaScriptから扱うのが制約検証APIです。
<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>
const form = document.getElementById("form");
form.addEventListener("submit", (event) => {
if (!form.checkValidity()) { // 1つでも不正なら
event.preventDefault();
form.reportValidity(); // 標準エラーを表示+最初のエラー項目へ自動フォーカス
}
});
reportValidity() はブラウザ標準のエラー表示と、最初のエラー項目へのフォーカスまで自動で行います。メッセージを自作したいときは setCustomValidity() を使います(メールの形式チェックの詳細はメールアドレスをチェックする方法を参照)。
JavaScriptで独自にチェックする(submit時)
標準機能で足りない条件や、エラーをまとめて自前で表示したい場合はJavaScriptで実装します。ポイントはvalue.trim() で前後の空白を除いてから判定することです。空白だけの入力を「入力済み」と誤判定しないためです。
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 疑似クラスを使えば一行です。
const firstInvalid = form.querySelector(":invalid");
if (firstInvalid) {
firstInvalid.focus();
}
独自チェックの場合は、最初にエラーになったフィールドを覚えておいて focus() します。フォーカスの当て方は特定の要素をフォーカスする方法で詳しく解説しています。
入力中・離脱時にリアルタイムでチェックする
送信時だけでなく、入力中(input)や項目を離れたとき(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 で状態を示します。
<input type="email" id="email" required
aria-describedby="email-error" aria-invalid="false">
<span id="email-error" role="alert"></span>
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)
value.trim() の長さや正規表現でチェックし、エラーメッセージをDOMに挿入します。submit イベントで全フィールドを検証し、問題があれば preventDefault() で送信を止めます。required や type="email" を付ければ、多くは標準機能で自動チェックできます。input)やフォーカス離脱時(blur)にリアルタイム確認し、送信時(submit)に最終検証を行います。aria-describedby でエラー文と入力欄を関連付け、role="alert" でスクリーンリーダーに通知します。エラー時に入力欄へ aria-invalid="true" を設定することも重要です。value === "" では、スペースだけの入力(" ")を「入力済み」と誤判定します。value.trim() で前後の空白を除いてから判定すれば、空白のみの入力もはじけます。まとめ
入力チェックは、まず required / type="email" と制約検証API(checkValidity / reportValidity)で標準機能を活かし、足りない部分をJavaScriptで補うのが効率的です。
独自チェックでは value.trim() で空白を除き、errors 配列にためて textContent で安全に表示します。最初のエラー項目への focus()、blur でのリアルタイム確認、aria 属性でのアクセシブルな表示まで加えると、使いやすいフォームになります。
