[JS Toy Project] 장바구니

sangyong park·2022년 10월 2일
0
post-thumbnail
post-custom-banner

오늘은 강의를 보며 홈페이지에서 자주 쓰이는 장바구니를 만들어 보았다.

# UI/UX

기능 설명

input창에 구매할 상품을 입력하고 장바구니 담기 버튼을 누르면 상품리스트에 추가된다.
input창에 입력 후 엔터키를 눌러도 상품리스트에 추가가 된다.

추가된 상품리스트에는 필요없는 상품을 삭제하기 위한 delete버튼이 들어있다.

HTML 코드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shooping List</title>
    <script src="https://kit.fontawesome.com/05d3201823.js" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="./css/style.css">
</head>
<body>
    <section id="shooping-box">
        <header class="header">상품리스트</header>
        <ul class="items"></ul>
        <footer class="footer">
            <!-- <form action="" class="form"> -->
                <input type="text" placeholder="구매하실 상품을 입력하세요 !" class="footer_input">
                <button type="submit" class="footer_button">장바구니 담기</button>
            <!-- </form> -->
        </footer>
    <section>

    <script src="./js/index.js" defer></script>
</body>
</html>

JAVASCRIPT 코드

<script>
const items = document.querySelector(".items");
// const form = document.querySelector(".form");
const input = document.querySelector(".footer_input");
const addBtn = document.querySelector(".footer_button");

function onAdd() {
  // 1. 사용자가 입력한 텍스트를 받아옴
  let text = input.value;
  if (text === "") {
    input.focus();
    return;
  }
  // 2. 새로운 아이템을 만듬 (텍스트 + 삭제 버튼)
  const item = createItem(text);
  // 3. items 컨테이너안에 새로 만든 아이템을 추가한다
  items.appendChild(item);
  // 새로 추가된 아이템으로 스크롤링
  item.scrollIntoView({ block: "center" });
  // 5. input을 초기화 한다.
  input.value = "";
  input.focus();
}
</script>

우선 필요한 html 요소를 DOM 요소로 가져왔습니다.

onAdd 함수

  1. 사용자가 입력한 텍스트를 text 라는 변수에 저장 하였습니다.

  2. 상품리스트를 입력 할 때마다 item 이라는 변수에 input.value를 받아와 새로운 아이템을 만들었습니다.

  3. 새로 만든 item 이라는 요소를 items 컨테이너안에 appendChild를 이용하여 추가 하였습니다.

  4. 쇼핑리스트 아이템이 입력되면 input 창을 초기화 하고 focus가 잡히도록 하였습니다.

<script>
function createItem(text) {
  const itemRow = document.createElement("li");
  itemRow.setAttribute("class", "iitem_row");

  const itemDivider = document.createElement("div");
  itemDivider.setAttribute("class", "item");

  const itemSpan = document.createElement("span");
  itemSpan.setAttribute("class", "item_name");
  itemSpan.innerText = text;

  const itemButton = document.createElement("button");
  itemButton.setAttribute("class", "item_delete");
  itemButton.innerHTML = `- 빼기`;
  itemButton.addEventListener("click", () => {
    items.removeChild(itemRow);
  });

  itemDivider.appendChild(itemSpan);
  itemDivider.appendChild(itemButton);

  itemRow.appendChild(itemDivider);
  return itemRow;
}

// input과 button에 각각 이벤트를 주지 않고도 form 을 이용해서 똑같은 이벤트를 처리할 수 있다.
// form.addEventListener('submit', (event) => {
//     event.preventDefault();
//     onAdd();
// })

input.addEventListener("keyup", (e) => {
  // keydown을 사용하게 되면 한글로 입력시 두번씩 입력이 되는 경우가 있다
  // 그 경우 isComposing 사용
  // if (event.isComposing) {
  //     return;
  // }

  if (e.key === "Enter") {
    onAdd();
  }
});
addBtn.addEventListener("click", onAdd);
</script>

create 함수

create 함수는 새로 추가된 아이템을 만드는 함수 입니다.

input에 keyup 이라는 이벤트를 사용하여 만약 e.key === "Enter"와 같다면 onAdd 함수가 실행 되도록 하였습니다.

addBtn에도 click 이라는 이벤트를 처리하여 onAdd 함수가 실행 되도록 하였습니다.

위 처럼 input과 button에 각각 이벤트를 주지 않고도 html 요소에 form 을 이용하면 똑같은 이벤트를
처리 할 수있습니다.

input의 이벤트를 처리할 때 keydown을 사용하게 되면 하글로 입력시 두번씩 입력이 되는
경우가 있습니다. 그 경우 isComposing을 사용하여 처리 하거나 , keyup을 사용합니다.

profile
Dreams don't run away It is always myself who runs away.
post-custom-banner

0개의 댓글