フロントエンジニアになるための練習問題 押すと色が変わるボタン4

前回の課題の続きです。

課題

クライアントから、さらなる依頼をもらいました。

  • 一度ボタンを押すと、5秒間はクリックされても色が切り替わらないようにしてほしい

今回はこちらを実装してみます。

前提

  • setTimeout を使うことができる

30分から1時間程度。

実装の流れ

今回の実装方法としては以下のようにすることにしました。

  • ボタンを押せるかどうかのフラグ(true/false)をつくる
  • ボタンが押されたときに、フラグがfalseなら処理を抜ける
  • ボタンが押されたときに、フラグがtrueならfalseにし、色を変える処理を続行する。
  • フラグは5秒後にtrueにする

実装例

まず、ボタンが押せるかどうかのフラグを実装します。

    let canClick = true;

ボタンがクリックされたときに、このフラグを参照して、false なら return します。

return することでその後の処理は実行されませんので、「false なら色を変える処理は動かない」ことになります。

        startButtonEl.addEventListener("click", () => {
          if(!canClick) return; //追加

          if(startButtonEl.classList.contains("red-active") || startButtonEl.classList.contains("blue-active") || startButtonEl.classList.contains("yellow-active")){
            startButtonEl.classList.remove("red-active", "blue-active", "yellow-active");
          }else{
            const value = getRandom(1, 3);
            const applyClass = getClass(value);
            startButtonEl.classList.add(applyClass);
          }
        });

もし、false ではなかった場合、つまり true ならフラグを false にします。

        startButtonEl.addEventListener("click", () => {
          if(!canClick) return;

      canClick = false; //追加

          if(startButtonEl.classList.contains("red-active") || startButtonEl.classList.contains("blue-active") || startButtonEl.classList.contains("yellow-active")){
            startButtonEl.classList.remove("red-active", "blue-active", "yellow-active");
          }else{
            const value = getRandom(1, 3);
            const applyClass = getClass(value);
            startButtonEl.classList.add(applyClass);
          }
        });

これで、一度クリックすると、その後クリックしても二度と色が変わらないようになります。

このままではNGなので、最後に setTimeout 使って、5秒後にフラグを true に戻すようにします。

     let canClick = true;

        startButtonEl.addEventListener("click", () => {
          if(!canClick) return;

          canClick = false;
          setTimeout(() => {
            canClick = true;
          }, 5000); //追加

          if(startButtonEl.classList.contains("red-active") || startButtonEl.classList.contains("blue-active") || startButtonEl.classList.contains("yellow-active")){
            startButtonEl.classList.remove("red-active", "blue-active", "yellow-active");
          }else{
            const value = getRandom(1, 3);
            const applyClass = getClass(value);
            startButtonEl.classList.add(applyClass);
          }
        });

動作確認をします。

ボタンをクリックすると色が変わり、5秒間はクリックしても色が変わりません。

5秒経過してからクリックすると、再び色が変わるようになります。