1日目のゴールと今日やること
1日目のテーマは「フォームバリデーションの全体像をつかむこと」です。
いきなり難しい正規表現を覚えるのではなく、
- どんな画面を作るのか
- どこでチェックするのか
- エラーをどう見せるのか
を、ざっくりイメージできるようになるのがゴールです。
今日は次の3つに絞ります。
- フォームの骨組み(HTML)を作る
- JavaScript から値を読み取り、簡単なチェックをする
- エラーメッセージを画面に出す「流れ」を体験する
正規表現は「軽く触る」くらいにして、まずは「バリデーションの流れ」を体に入れます。
フォームバリデーションの全体像をイメージする
何をチェックしたいのかを言葉にする
今回のフォームは、シンプルな「ログインフォーム」を想定します。
入力欄は2つです。
- メールアドレス
- パスワード
そして、最低限やりたいチェックはこうです。
- メールアドレスが空ではない
- メールアドレスが「それっぽい形」になっている
- パスワードが空ではない
- パスワードがある程度の長さになっている
さらに中級らしくするために、
- エラーがあるときは、その場でメッセージを表示
- エラーがある間は「送信ボタンを押しても送信されない」
という UX も意識していきます。
「いつチェックするか」を考える
バリデーションにはタイミングがあります。
- 入力中にリアルタイムでチェックする
- フォーカスが外れたときにチェックする
- 送信ボタンを押したときにまとめてチェックする
1日目は「送信ボタンを押したときにまとめてチェックする」パターンから始めます。
ここが理解できれば、2日目以降で「入力中に動的にチェック」に広げるのが楽になります。
HTMLでフォームの骨組みを作る
最小限のフォームを用意する
まずは index.html を用意して、次のように書きます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>フォームバリデーション練習</title>
<style>
body { font-family: sans-serif; padding: 20px; }
.field { margin-bottom: 16px; }
.error-message { color: red; font-size: 12px; height: 16px; }
.input-error { border-color: red; }
button[disabled] { opacity: 0.5; cursor: not-allowed; }
</style>
</head>
<body>
<h1>ログインフォーム(バリデーション付き)</h1>
<form id="login-form" novalidate>
<div class="field">
<label for="email">メールアドレス</label><br />
<input id="email" type="text" />
<div id="email-error" class="error-message"></div>
</div>
<div class="field">
<label for="password">パスワード</label><br />
<input id="password" type="password" />
<div id="password-error" class="error-message"></div>
</div>
<button id="submit-button" type="submit">ログイン</button>
<div id="form-message"></div>
</form>
<script src="app.js"></script>
</body>
</html>
ここでのポイントを押さえます。
novalidateを form に付けて、ブラウザ標準のバリデーションは一旦オフにしています。
自分で JavaScript で制御するためです。- 各入力欄の下に「エラーメッセージ表示用の div」を用意しています。
ここに文字を入れたり消したりして、エラーを見せます。 .error-messageに高さを指定しているのは、「エラーがないときもレイアウトが崩れないようにする」ためです。
UX 的に地味に大事なポイントです。
JavaScriptからフォームの値を読み取る
DOM要素を取得する
app.js を作り、まずはフォームと入力欄を JavaScript から掴みます。
const formEl = document.getElementById("login-form");
const emailInputEl = document.getElementById("email");
const passwordInputEl = document.getElementById("password");
const emailErrorEl = document.getElementById("email-error");
const passwordErrorEl = document.getElementById("password-error");
const submitButtonEl = document.getElementById("submit-button");
const formMessageEl = document.getElementById("form-message");
JavaScriptこれで、JavaScript から
- 入力された値を読む
- エラーメッセージを書き込む
- ボタンの状態を変える
といった操作ができるようになります。
submitイベントを捕まえる
フォームが送信されるタイミングでチェックを行うために、submit イベントを使います。
formEl.addEventListener("submit", (event) => {
event.preventDefault(); // 本当の送信を止める
const email = emailInputEl.value;
const password = passwordInputEl.value;
console.log("メール:", email);
console.log("パスワード:", password);
});
JavaScriptここではまだチェックはしていません。
まずは「送信ボタンを押したときに JavaScript が動く」ことを確認します。
event.preventDefault() が重要です。
これをしないと、ページがリロードされてしまい、エラーメッセージを表示する前に画面が消えてしまいます。
1日目の簡単なバリデーションを実装する
まずは「空チェック」から始める
いきなり正規表現に行かず、まずは「空かどうか」のチェックから始めます。
これだけでも立派なバリデーションです。
formEl.addEventListener("submit", (event) => {
event.preventDefault();
const email = emailInputEl.value.trim();
const password = passwordInputEl.value.trim();
let emailError = "";
let passwordError = "";
if (!email) {
emailError = "メールアドレスを入力してください。";
}
if (!password) {
passwordError = "パスワードを入力してください。";
}
emailErrorEl.textContent = emailError;
passwordErrorEl.textContent = passwordError;
if (!emailError && !passwordError) {
formMessageEl.textContent = "送信できます!(まだ本当には送信していません)";
} else {
formMessageEl.textContent = "入力内容を確認してください。";
}
});
JavaScriptここでやっていることを整理します。
trim()で前後の空白を削除してからチェックしています。
スペースだけの入力を「空」とみなすためです。- エラーがあれば、対応するエラー用 div にメッセージを書き込む。
なければ空文字にして、表示を消します。 - 両方エラーがなければ「送信できる状態」と判断し、フォーム全体のメッセージを変えています。
この時点で、「submit 制御」の一番シンプルな形は体験できています。
正規表現の入口としてメールの簡易チェックを入れてみる
正規表現で「それっぽいメールか」を見る
1日目の最後に、軽く正規表現に触れておきます。
完璧なメールチェックは難しいので、「それっぽい形かどうか」だけ見ます。
const emailRegex = /^[^@\s]+@[^@\s]+\.[^@\s]+$/;
JavaScript意味はざっくりこうです。
^と$は「文字列の先頭」と「末尾」[^@\s]+は「@ と空白以外の文字が1文字以上」@が1つ- その後にまた
[^@\s]+ .が1つ- 最後にまた
[^@\s]+
つまり「何か@何か.何か」という形をチェックしています。
メールチェックに正規表現を組み込む
さきほどの submit 処理を少しだけ拡張します。
formEl.addEventListener("submit", (event) => {
event.preventDefault();
const email = emailInputEl.value.trim();
const password = passwordInputEl.value.trim();
let emailError = "";
let passwordError = "";
if (!email) {
emailError = "メールアドレスを入力してください。";
} else if (!emailRegex.test(email)) {
emailError = "メールアドレスの形式が正しくありません。";
}
if (!password) {
passwordError = "パスワードを入力してください。";
} else if (password.length < 8) {
passwordError = "パスワードは8文字以上にしてください。";
}
emailErrorEl.textContent = emailError;
passwordErrorEl.textContent = passwordError;
if (!emailError && !passwordError) {
formMessageEl.textContent = "送信できます!(まだ本当には送信していません)";
} else {
formMessageEl.textContent = "入力内容を確認してください。";
}
});
JavaScriptここでの重要ポイントは、
- 「空チェック」と「形式チェック」を分けてメッセージを出していること
- 正規表現のチェックは
emailRegex.test(email)で true/false を返すこと
です。
「正規表現=難しい呪文」ではなく、「文字列が条件を満たしているかをチェックする道具」として捉えてください。
1日目のまとめと、明日につなげる視点
今日やったことは、フォームバリデーションの「一番シンプルな流れ」です。
- HTML でフォームとエラー表示用の場所を用意した
- JavaScript で submit イベントを捕まえた
- 入力値を読み取り、条件をチェックした
- エラーメッセージを動的に表示した
- 条件を満たしているかどうかで「送信できるか」を判断した
ここまでできていれば、もう「フォームバリデーションの入口」は完全に踏み込めています。
2日目以降はここから一歩進めて、
- 入力中にエラーを動的に表示する(UX を良くする)
- エラー状態を「state」として管理し、render 関数で画面を更新する
- 正規表現をもう少しだけ深掘りして、パスワードのルールを設計する
といった方向に広げていきます。
もし余力があれば、1日目のうちに「わざと変なメール」「短すぎるパスワード」などを入れて、
どんなメッセージが出るか、自分で遊んでみてください。
バリデーションは「ユーザーの失敗パターンを想像する力」でもあります。


