コース一覧
JavaScript道場 ハレノヒ珈琲を動かす10問
予約フォームの検証

JavaScript道場 ハレノヒ珈琲を動かす10問

JavaScript の基本を終えた人が、白紙から画面を動かす演習専用コースです。解説はありません。依頼と完成条件だけを読み、自分でコードを組み立てます。HTML と CSS は用意してあるので、書くのは JavaScript だけです。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。クリックへの応答から始まり、クラスの切り替え、入力の監視、配列の絞り込みと描画、フォームの検証、タブの出し分けを経て、最後は予約ページの一連の流れまで、10問で主要な操作を一巡します。1問15分から45分、全10問で約5時間です。JavaScript入門を終えて「読めるけれど自分では書けない」と感じている方に向いています。

1
初段
01. ボタンで挨拶を出せ15分
02. ダークモード切替15分
03. 文字数カウンター20分
04. メニューの絞り込み25分
2
中段
01. 予約フォームの検証25分
02. 配列からメニューを描画せよ25分
03. タブ切替30分
04. 営業中か準備中かを判定せよ30分
3
師範
01. 時計の表示を整えよ30分
02. 総合 予約ページ完成45分

予約フォームの検証

中段 / 目安 25分

陽葵さんが受信箱を開いて見せてくれます。「これ見て。名前が空っぽの予約が、けっこう届くの……」。誰のものか分からない予約が並んでいます。「送信する前にチェックして、空ならエラーを出して!」

画面には id="reserve-form" のフォーム、id="name" の入力欄、エラーを出すための id="error"、受け付けた結果を出すための id="result" があります。error と result はどちらも最初は空です。

フォームの送信は、放っておくとブラウザがページごと送り出してしまいます。書いた検証を効かせるには、送信の合図が走ったときに「今回は行かせない」と止める必要があります。それが preventDefault です。これを呼ばないと、エラー文を出した次の瞬間に画面が作り直されて、書いたものが全部消えます。今回の判定はフォームの submit を止められる形(cancelable)で流すので、止める処理を書いていない解答は本番で必ず崩れます。必ず1行目で呼んでください。

名前が空のまま送られたら、#error にエラー文を出し、あわせて #error に on クラスを付けます。名前が入っていたら #error の文字を空に戻して on クラスも外し、#result に受け付けた旨と名前を出します。

入力欄に空白だけを打った人も「空っぽ」の扱いにしてください。

完成条件

  • #reserve-form の submit を待ち受け、preventDefault() で既定の送信を止める
  • 名前が空(空白だけを含む)なら #error に「お名前」を含むエラー文を出し、on クラスを付ける
  • 名前が入っていれば #error の文字を空にし、on クラスを外す
  • 名前が入っていれば #result に「承りました」と入力された名前を出す

進め方

待ち受けるのはボタンの click ではなく、フォームの submit です。click で書くと、キーボードの Enter で送られたときに素通りします。

待ち受ける関数は引数を1つ受け取れます。それが出来事そのものを表すオブジェクトで、preventDefault() を呼べる相手です。関数の一番上で呼んでしまうのが安全です。

前後の空白を落とすのは trim() です。空文字は条件式の中で偽として扱われるので、if (!name) の形がそのまま使えます。空のときの処理を書いたら return で抜けると、その下に成功時の処理をそのまま続けられます。

ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

課題

  1. #reserve-form の submit を待ち受け、preventDefault() で既定の送信を止める
  2. 名前が空(空白だけも含む)なら #error にエラー文を出し、on クラスを付ける
  3. 名前が入っていれば #error の文字を空にし、on クラスを外す
  4. 名前が入っていれば #result に「承りました」と入力された名前を出す

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

①方針 フォームに submit の待ち伏せを1つ仕掛けます。中では最初に既定の送信を止め、次に名前を読んで、空かどうかで出す場所を分けます。

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
index.html
style.css
script.js
プレビュー

できているか

  • 開いた直後はエラーが出ていない
  • 空のまま送るとエラーが出て、受付は行われない
  • 名前を入れて送ると受け付けられ、エラーが消える
エディタを読み込んでいます