Calculator(잠시중단)

또치·2022년 8월 16일

자바스크립트 계산기 잠시중단...

2022.07.19


결과부터 말하자면 아무리해도 못했어..
원래 보던 사이트에서 해놓은 JS보고 전혀 이해를 못하겠어서 다시 갈아엎어서 다른데서 찾은거 한줄씩보고 따라쳤는데도 이해 못한게 수두룩하고
결정적으로 계산을 못해 내 계산기는...
아니 보고 따라하는 주제에 변수이름이랑 HTML 명칭은 또 내가 하고싶은대로 했더니 다 따라해도 안되지 바보야...그치만 마지막남은 자존심이였다고...암튼 그래서 계산이 안되는 계산기가 나와버렸다
(그래도 처음 시작할때 버튼 누른게 대체 화면에 어떻게 나오게하는건가로 머리터졌는데 이건 알았어...ㅎ)

일단은 일주일이나 여기에 매달렸기 때문에 지금 상태로 더 매달리면 시간 낭비같아
잠깐 중단하고 이거 보면서 이해못한 부분들 강의를 보고와야겠어
내가 진짜 꼭 계산되게 만든다...

이거 하나 못해서 지금 자존감 다 깍이고 코딩이고 뭐고 때려쳐야되나 고민하게 하는게 짜증나


첫번째 시도!

  • 일단 html이랑 css부터 문제가 많았음
    계산화면창 띄우는거부터가 진짜...
    div로 하고 input으로 하고...뭐로 해도 맞았겠지만 내가 계속 바꿔대가지고...

  • =을 어떻게 지 혼자 길게 있게 하는거지...
    -> 이건 grid로 하면 다 해결되는 문제였다...진짜 오래걸린데다가 못할줄알았는데 겁나 쉬웠어...

  • 인풋창에 글자나오게 해야되고...
    일단 숫자를 누르면 나오게 해야되고 머리터진다...
    이걸 인풋창에 어떻게 뜨게해... 지금 계산시키는게 문제가 아니여... 와 input을 애초에 readonly로 넣어줬으면 됐어...(이걸로 해결이 될지는 모르겠지만..) 처음에 div로 아예 만들어줬는데...
    -> 이 난리를 쳤다고...

두번째 시도!

  • input으로 하면 안될것같아

  • 애들 전체를 또 div로 꼭 해줘야할듯

  • div마다 다 class를 지정해줘야되나...

  • data-key. data-type이 중요한가봐... 아이고 두야... id를 설정안하고 저걸 설정해서 해야 더 잘되는건가... 왜 뭐는 data-key로 설정해주고 뭐는 class로 다르게 하고...뭘까
    -> dataset 공부해야돼!!

  • 이벤트위임이라니 머리터진다

  • 그래도 css에 webkit 등등 쓰는 이유는 알았어...

let $calculator= document.querySelector('.calculator');
let $result= document.querySelector('.result');
let $keys= document.querySelector('.calculator__keys');

$keys.addEventListener('click', e => {
    if(!e.target.closest('button')) {
        return;
    }  
    let key= e.target; // key = $keys.addEventListener 
    let keyvalue= key.textContent;
    let resultvalue= $result.textContent;
    let {type}= key.dataset;
    let {previousKeyType}= $calculator.dataset;

    if(type === 'reset') {
        $result.textContent= '0';
    }
    // if (type === 'clear') {
    //     display.textContent = (display.textContent).slice(0,-1);
    // }  뭔지 모르겠음

    if(type === 'number') {
        if(
            resultvalue === '0' ||
            previousKeyType === 'sign'
            ) {
                $result.textContent= keyvalue;
            } else {
                $result.textContent= resultvalue + keyvalue;
            }
    }

    if(type === 'sign') {
        let signkeys= $keys.querySelectorAll('[data-type= "sign"]')
        signkeys.forEach(element => {
            element.dataset.state= ''
        })
        key.dataset.state= 'selected';
        $calculator.dataset.firstnumber= resultvalue;
        $calculator.dataset.sign= key.dataset.key;
    }
    if(type === 'decimal') {
        if(resultvalue.indexOf('.') === -1 ) {
            $result.textContent= resultvalue + keyvalue;
        } else {return;}
    }

    if (type === 'equal') {
        const firstNumber = $calculator.dataset.firstNumber;
        const sign = $calculator.dataset.sign;
        const secondNumber = resultvalue;
        const input = calculate(firstNumber, sign, secondNumber);
        $result.textContent = parseFloat(input.toFixed(7));
    }

    $calculator.dataset.previousKeyType = type;
});

function calculate (firstNumber, sign, secondNumber) {
    firstNumber = parseFloat(firstNumber);
    secondNumber = parseFloat(secondNumber);

    if (sign === 'plus') return firstNumber + secondNumber;
    if (sign === 'minus') return firstNumber - secondNumber;
    if (sign === 'mul') return firstNumber * secondNumber;
    if (sign === 'divide') return firstNumber / secondNumber;
}

지금 생각으로는 저 calculate랑 if~equal에 무슨 문제가 있는것같아...
것도 그럴게 저 부분은 진짜 아예 이해를 못하겠어...
아니 selected랑 firstNumber는 뭔데 대체...어디에서 선언한적도 없는데 왜 그냥 변수처럼 쓰고있는거냐고...

메모

이벤트위임(event.target)
parseFloat
dataset
grid

0개의 댓글