コース一覧
JavaScriptでWebページを動かす
つくる フォームの入力チェック

JavaScriptでWebページを動かす

DOM から要素を取得・更新・追加し、クリック・入力・フォーム送信に反応する処理を作る全 20 レッスン(411 分)のコースです。タイマーと localStorage も使い、最後は入力を保存できるひとことメモを仕上げます。用意された HTML/CSS を使うため、学習の中心は JavaScript です。

1
DOM のきほん
01. DOM とは何か15分
02. 要素を取得する20分
03. テキストを書き換える20分
04. class を付け外しする20分
05. 要素を作って追加する20分
06. 配列から一覧を描画する25分
07. つくる ギャラリーをデータ駆動にする30分
08. 第1章まとめクイズ10分
2
イベント処理
01. クリックに反応する18分
02. event オブジェクト20分
03. 入力欄の値を取る18分
04. フォーム送信を制御する20分
05. つくる ダークモード切替25分
06. つくる フォームの入力チェック25分
07. 第2章まとめクイズ10分
3
タイマーと総合制作
01. setTimeout と setInterval20分
02. localStorage で保存する20分
03. つくる ひとことメモウィジェット30分
04. 自由拡張30分
05. 完成と次のステップ15分

つくる フォームの入力チェック

解説

このレッスンで分かること

  • 未入力の入力欄の value は空文字列なので、そのまま falsy として判定できます
  • 検証に落ちたら早期 return で抜け、通ったときはエラー表示を消します

空のまま送られると、誰から来たのか分からない

前回で送信は止められるようになりました。ところが、名前もメールアドレスも空のまま送信ボタンを押すと、いまのコードは何ごともなく「送信を受け付けました」と答えます。受け取る側から見れば、宛先の分からない問い合わせが届くだけです。届いてから困るくらいなら、押した瞬間に教えてあげたほうがずっと親切です。

今回作るのは、その入力チェックです。決まりは次のとおりです。

  • フォームの中、送信ボタンのすぐ上に id="form-error" class="form-error" の空の p を足す
  • 前回書いた submit の処理を書き換える。event.preventDefault() は先頭のまま残す
  • #name と #email の値を読み、どちらかが空ならエラー文を出し、フォームに has-error を付けて処理を打ち切る
  • 両方そろっているときは、エラー文と has-error を消してから受け付けたと表示する

新しく addEventListener を足すのではなく、前回の処理の中身を差し替えてください。同じフォームに 2 つ登録すると、両方が動いてしまいます。

空文字は falsy なので、そのまま判定できる

空かどうかの書き方はいくつかあります。どれも動きますが、読みやすさに差があります。

書き方動くか評価
title === ""動く空白だけの入力を通してしまう
title.length === 0動く意味は同じだが 1 段まわりくどい
!title動く短く、第2章の falsy の考え方に沿っている

第2章で学んだ falsy が、ここでようやく本領を発揮します。空の入力欄の value は "" であり、"" は falsy です。長さを数えたり空文字と比べたりする必要はありません。

ただし !title だけでは、半角スペースを 1 つ打たれたときに通ってしまいます。空白も文字なので " " は truthy です。そこで、読み取った直後に trim() を通します。

JavaScript

const title = document.querySelector("#book-title").value.trim(); console.log(!title); // 空欄でも空白だけでも true

trim() は前後の空白を取り除いた新しい文字列を返すメソッドです。元の文字列も画面の入力欄も変えません。入力チェックでは value を読んだらすぐ trim()、と手が動くようにしておくと安全です。

落ちたらそこで抜け、直したら消す

第6章で学んだ早期 return がそのまま使えます。エラーのときの処理を書いたら、最後に return を置いて先へ進ませません。

JavaScript

if (!title) { errorText.textContent = "タイトルを入力してください"; bookForm.classList.add("has-error"); return; }

return を書き忘れると、エラーを出したうえで受け付けたとも表示する、ちぐはぐな画面になります。

見落としがちなのは、その逆側です。エラーを出す処理だけを書いて、正常だったときに消す処理を書き忘れると、一度出たエラー文が画面に残り続けます。直したのに何が悪いのか分からないまま止まってしまい、いちばん嫌われる作りです。状態は 2 通りの見せ方で表すので、消すほうも 2 つあります。

  • 文字 … エラー文を入れる。正常なら空文字に戻す
  • class … フォームに has-error を付ける。正常なら外す

JavaScript

errorText.textContent = ""; bookForm.classList.remove("has-error");

has-error が付いている間だけ入力欄の枠が赤くなる CSS は用意してあります。前回のダークモードと同じで、見た目は CSS が持ち、JavaScript は状態の名前を付け外しするだけです。

エラー文には「何がいけないのか」と「どうすれば直るのか」を入れます。エラー の一言では次の一手が分かりません。置く場所も、押した直後に目が向くところにします。スクロールしないと見えないエラーは、出していないのとほとんど変わりません。

なお、ブラウザ側の検証は見ている人に早く気付いてもらうためのもので、安全のためのものではありません。JavaScript は見ている人がいくらでも書き換えられるので、実際にデータを受け取るサーバー側でも同じ検証をやり直します。

よくある間違い

  • 条件を && でつなぐ — if (!name && !email) は「両方とも空のとき」です。片方だけ空のときは素通りします。どちらか一方でも空なら止めたいので || を使います
  • エラーを消す処理がない — 正常だったときに文字を空へ戻し、has-error を外す行を必ず書きます

課題

  1. HTML の .contact-form の中、送信ボタンのすぐ上に id="form-error" class="form-error" の空の p を足す
  2. 前回書いた submit の処理を書き換える。event.preventDefault() は先頭のまま残す
  3. #name と #email の value を trim() して読み取り、どちらかが falsy ならエラー文を #form-error に出し、.contact-form に has-error を付けて return する
  4. 両方そろっているときは #form-error を空にし、has-error を外して #form-message に「送信を受け付けました」と出す

ヒント

`document.querySelector("#name").value.trim()` のように、読み取ったらすぐ `trim()` を通します

条件は「どちらか一方でも空なら」なので `||` でつなぎます。`&&` にすると両方空のときしか止まりません

エラーの分岐の最後に `return;` を置きます。忘れるとエラー文と受付メッセージが同時に出ます

index.html
style.css
script.js
プレビュー

できているか

  • #form-error の段落がある
  • #form-error がフォームの中にある
  • 最初はエラーの状態になっていない
  • 空のまま送信するとエラーが出る
  • 入力してから送信するとエラーが消える
エディタを読み込んでいます