공부/javascript

2022.06.05 - (+ 수정완료 ) javascript 계산기 만들기

기묜몬 2022. 6. 5. 23:34

제로초님 강의를 참고하여 만들었습니다.
[ HTML / CSS ]

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <link rel="preconnect" href="https://fonts.googleapis.com" />
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
    <link
      href="https://fonts.googleapis.com/css2?family=Gugi&display=swap"
      rel="stylesheet"
    />
    <meta charset="utf-8" />
    <title>계산기연습</title>
    <style>
      * {
        box-sizing: border-box;
      }
      #result {
        width: 180px;
        height: 50px;
        margin: 5px;
        text-align: right;
        border-color: aliceblue;
        border-radius: 10px;
      }
      #operator {
        width: 50px;
        height: 50px;
        margin: 5px;
        text-align: center;
        border-color: aliceblue;
        border-radius: 10px;
      }
      button {
        width: 50px;
        height: 50px;
        margin: 5px;
        border-color: aliceblue;
        border-radius: 10px;
      }
      #clear {
        background-color: palevioletred;
        border-color: aliceblue;
      }
      #calculate {
        background-color: pink;
      }
      .calBox {
        background-color: #a9cce0;
        padding: 10px 10px 10px 13px;
        width: 280px;
        border-radius: 20px;
        margin: 30px 0px 0px 30px;
      }
      .calText {
        text-align: center;
        font-size: 20px;
        color: black;
        font-family: "Gugi", cursive;
      }
      #name {
        text-align: right;
        font-size: 13px;
        color: whitesmoke;
      }
    </style>
  </head>

[ JS ]

<!-- 계산기 버튼 구현 -->
  <body>
    <div class="calBox">
      <div class="calText">
        <p id="cal">귀여운 나만의 계산기</p>
        <p id="name">hyoeun : - )</p>
      </div>
      <input readonly id="operator" />
      <input readonly type="number" id="result" />
      <div class="row">
        <button id="num-7">7</button>
        <button id="num-8">8</button>
        <button id="num-9">9</button>
        <button id="plus">+</button>
      </div>
      <div class="row">
        <button id="num-4">4</button>
        <button id="num-5">5</button>
        <button id="num-6">6</button>
        <button id="minus">-</button>
      </div>
      <div class="row">
        <button id="num-1">1</button>
        <button id="num-2">2</button>
        <button id="num-3">3</button>
        <button id="divide">/</button>
      </div>
      <div class="row">
        <button id="clear">C</button>
        <button id="num-0">0</button>
        <button id="calculate">=</button>
        <button id="multiply">x</button>
      </div>
    </div>
    <script>
      let calNum1 = "";
      let operator = "";
      let calNum2 = "";
      let calR = "";
      let result = "";

      const $operator = document.querySelector("#operator");
      const $result = document.querySelector("#result");
       // 계산기 숫자, 연산부호 클릭이벤트 생성생성
      // if문 중첩 
      // const onClickNum = (e) => {
      //   if (!operator) {
      //     calNum1 += e.target.textContent;
      //     $result.value += e.target.textContent;
      //     return;
      //   }
      //   if (!calNum2) {
      //     $result.value = "";
      //   }
      //   calNum2 += e.target.textContent;
      //   $result.value += e.target.textContent;
      // };
	
      const onClickNum = (e) => {
        if (operator) {
          if (!calNum2) {
            // num2가 없는 상황에서는 화면의 숫자를 "" 지워라..
            $result.value = "";
          }
          // 처음 클릭할때 num2가 없고, 두번째 숫자 클릭할때 num2가 생김 -> 화면을 잠깐 지우고나서 num2의 숫자가 생성
          calNum2 += e.target.textContent;
        } else {
          calNum1 += e.target.textContent;
        }
        $result.value += e.target.textContent;
      };
      document.querySelector("#num-0").addEventListener("click", onClickNum);
      document.querySelector("#num-1").addEventListener("click", onClickNum);
      document.querySelector("#num-2").addEventListener("click", onClickNum);
      document.querySelector("#num-3").addEventListener("click", onClickNum);
      document.querySelector("#num-4").addEventListener("click", onClickNum);
      document.querySelector("#num-5").addEventListener("click", onClickNum);
      document.querySelector("#num-6").addEventListener("click", onClickNum);
      document.querySelector("#num-7").addEventListener("click", onClickNum);
      document.querySelector("#num-8").addEventListener("click", onClickNum);
      document.querySelector("#num-9").addEventListener("click", onClickNum);

      const onClickOper = (op) => () => {
        //ex) +를 누르면 op가 +가 됨
        if (calNum1) {
          operator = op;
          $operator.value = op;
        } else if (!calNum2) {
          alert("숫자를 입력하세요.");
        }
      };

      document
        .querySelector("#plus")
        .addEventListener("click", onClickOper("+"));
      document
        .querySelector("#minus")
        .addEventListener("click", onClickOper("-"));
      document
        .querySelector("#divide")
        .addEventListener("click", onClickOper("/"));
      document
        .querySelector("#multiply")
        .addEventListener("click", onClickOper("*"));

      document.querySelector("#calculate").addEventListener("click", () => {
        if (calNum2) {
          if (operator == "+") {
            $result.value = parseInt(calNum1) + parseInt(calNum2);
          } else if (operator == "-") {
            $result.value = parseInt(calNum1) - parseInt(calNum2);
          } else if (operator == "*") {
            $result.value = parseInt(calNum1) * parseInt(calNum2);
          } else {
            $result.value = parseInt(calNum1) / parseInt(calNum2);
          }
            // 누적이 안됐던 부분 추가~~!
          $operator.value = "";
          calNum1 = $result.value;
          operator = "";
          calNum2 = "";
        } else {
          alert("숫자를 먼저 입력하세요.");
        }
      });

      document.querySelector("#clear").addEventListener("click", () => {
        calNum1 = "";
        calNum2 = "";
        operator = "";
        $operator.value = "";
        $result.value = "";
      });
    </script>
  </body>
</html>

하... 값이 누적이 안됨.. 검색을 해도해도 어떻게해야 할지 모르겠어서
그냥 내일 첨부터 다시 뜯어 고칠 생각..

+ 6/8(수) 진짜 바보다..
연산식 함수에서 누적해주는 코드 몇 줄만 입력하면 되는데
그걸 놓치고 있었다.. 나는 언제 늘까 ㅠ_ㅠ