forEach 안에서 버튼을 사용하면 제일 위에것만 적용이 됩니다.

조회수 266회

장바구니를 만들고 있습니다. forEach를 이용해서 목록이 나오게 했는데 수량 버튼을 구현하려고 합니다.

 <input class="minusbutton" type='button' onclick='count("minus")' value='-'/>
 <div id='result'>${list.basket_count}</div>
 <input class="plusbutton" type='button' onclick='count("plus")' value='+'/>

이런식으로 하고서 자바스크립트를 이용해서 minus버튼이나 plus버튼 클릭시 result값이 -1 +1 되도록 설정했더니 장바구니 목록에서 제일 위에 있는 값만 적용이 됩니다. 예를들어서 3가지의 상품이 있는데 3번째 상품의 갯수를 + 해도 1번째 상품의 갯수가 올라갑니다. 어떻게 해결해야할까요??!

1 답변

  • 1. 원래대로라면 window.count() 함수 정의를 봐야 하지만... 그보다 더 결정적인 문제가 있습니다. 카운트 올릴 대상이 id를 갖고 있다는 게 문제입니다.

    HTML에서, id 속성은 문서 전체에서 단 한 번씩만 등장해야 합니다. (그래야 identification이 되겠지요.) 하지만 질문자님의 코드는 십중팔구 <div id="result">가 여러 번 등장하고 있을 겁니다. 그러니까 window.count()가 아무리 document.getElementById('result')를 조작하려고 해도, 그 ID로 가장 먼저 발견된 최초의 div만 조작되고 있는 겁니다.

    class로 고치시고, 다음 코드가 동작하는지 확인해 보세요.

    <input class="minusbutton" type='button' onclick="count(this, 'minus')" value='-' />
    <div class='result'>0</div>
    <input class="plusbutton" type='button' onclick="count(this, 'plus')" value='+' />
    
    var count = function (clickedElement, plusOrMinus) {
      var parent = clickedElement.parentElement;
      var result = parent.querySelector('.result');
      // 이하 생략
    };
    

    2. 지금 구현하고 계신 것을 spinner라고 부릅니다. 숫자 입력을 처리하고, 올리기, 내리기 버튼을 주고, 한 번에 몇씩 올릴 것인지를 정의할 수 있어야 하죠.
    근데 사실 그런 걸 구현하자면 최신 브라우저들이 제공하는 number 타입 input의 step을 쓰시는 게 가장 깔끔합니다.
    https://www.w3schools.com/tags/att_input_step.asp
    저라면 일단은 그냥 이거 쓰고 지나갈 거 같습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)