コース一覧
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分

営業中か準備中かを判定せよ

師範 / 目安 30分

「いま開いてますか、っていう電話が1日に何本も来るの」と陽葵さん。「サイトを見たら分かるようにしたい。7時から22時までが営業中、それ以外は準備中よ」

素直に書けば new Date().getHours() で現在の時刻を取ってきて、そのまま判定すればよさそうに見えます。ところが、その形で書くと 自分で動かして確かめられない という問題が出ます。いま14時なら営業中しか見られず、準備中の表示が正しいかどうかは夜まで確かめようがありません。

そこで師範の教えが効いてきます。時刻を「取ってくる」処理と、時刻から「判定する」処理を分けるのです。判定のほうを isOpen(hour) という関数にして、時刻を引数で受け取る形にすれば、7時でも23時でも好きなだけ試せます。現在時刻を渡すのは、いちばん外側で1回だけやればいい。

この分け方は、あとで自動テストを書くときにそのまま効いてきます。引数で受け取る関数は何度でも同じ答えを返しますが、中で現在時刻を読む関数は実行するたびに答えが変わり、テストのしようがありません。

HTML は読み取り専用で、時刻を試すためのボタンを並べてあります。それぞれ data-hour に時刻が入っているので、押されたら isOpen(hour) に渡してバッジを書き換えてください。data-hour から読んだ値は文字列なので、数として比べるなら Number() を通してください。

完成条件

  • isOpen(hour) という関数を作る。7以上22未満なら true、それ以外は false を返す
  • .hour-button のすべてにクリックのイベントを付ける
  • 押されたら、その data-hour を数にして isOpen に渡す
  • true なら #status の文字を「営業中」にして open クラスを付け、closed クラスを外す
  • false なら「準備中」にして closed クラスを付け、open クラスを外す

進め方

白紙から書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

課題

  1. isOpen(hour) を作り、7以上22未満なら true、それ以外は false を返す
  2. すべての .hour-button にクリックのイベントを付ける
  3. 押されたら data-hour を Number() で数にして isOpen に渡す
  4. 営業中なら #status を営業中にして open クラスを付け、closed を外す
  5. 準備中なら #status を準備中にして closed クラスを付け、open を外す

ヒント

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

①方針 時刻を取ってくる処理と判定する処理を分けます。判定は `isOpen(hour)` に閉じ込め、時刻はボタンから渡す。こうすると夜の表示も昼のうちに確かめられます

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

できているか

  • 10時を選ぶと営業中になる
  • 23時を選ぶと準備中に切り替わる
  • 6時はまだ準備中である
  • 21時はまだ営業中である
エディタを読み込んでいます