<body>
<ul class="food__list">
<li class="food__list__box" id="1">
<span>광어</span>
<span>20,000원</span>
<button>장바구니에 추가</button>
</li>
<li class="food__list__box" id="2">
<span>우럭</span>
<span>21,000원</span>
<button>장바구니에 추가</button>
</li>
<li class="food__list__box" id="3">
<span>연어</span>
<span>21,000원</span>
<button>장바구니에 추가</button>
</li>
<li class="food__list__box" id="4">
<span>참돔</span>
<span>30,000원</span>
<button>장바구니에 추가</button>
</li>
</ul>
<div class="cart">
<h1>장바구니</h1>
<ul class="cart__list"></ul>
</div>
</body>
메뉴 리스트와 장바구니 카트를 만들어 주었습니다. document 객체의 querySelectorAll 메서드를 사용하기 위해 메뉴 리스트의 class이름을 동일하게 설정하였습니다.
const cartBtns = document.querySelectorAll(".food__list__box button");
const cartList = document.querySelector(".cart__list");
const printFood = (name, price) => {
const cartListBox = document.createElement("li");
const countBox = document.createElement("span");
cartListBox.innerText = `${name} - ${price}`;
countBox.innerText = "1개";
cartListBox.append(countBox);
cartList.append(cartListBox);
};
const addFood = (event) => {
const {
target: { parentNode },
} = event;
const foodName = parentNode.children[0].textContent;
const foodPrice = parentNode.children[1].textContent;
printFood(foodName, foodPrice);
};
cartBtns.forEach((btn) => btn.addEventListener("click", addFood));
querySelectorAll 메서드들 사용하여 메뉴 리스트의 버튼들은 전부 선언하였습니다. 그리고 해당 버튼들을 forEach 메서드를 이용하여 각각의 버튼에게 addEventListener를 통해 click 이벤트가 발생할 경우 addFood 함수를 실행시키게 하였습니다. addFood 함수는 클릭한 버튼의 event를 받아옵니다. 해당 event를 통해 previousElementSibling, parentNode등을 통해 부모 요소 및 주변 요소들을 선택할 수 있습니다. 이를 통해 메뉴의 이름과 가격이 적힌 태그들의 text요소를 textContent를 통해 값을 가져올 수 있습니다. 그 후 document 객체의 createElement 메서드를 이용하여 새로운 태그들을 생성한 후 원하는 text들 적어 append를 통해 자식 태그들로 부여할 수 있습니다.
previousElementSibling : 동등한 관계의 이전 태그를 의미
parentNode : 부모 노드를 의미
const cartBtns = document.querySelectorAll(".food__list__box button");
const cartList = document.querySelector(".cart__list");
const printFood = (name, price, id) => {
const cartListBox = document.createElement("li");
const countBox = document.createElement("span");
cartListBox.innerText = `${name} - ${price}`;
countBox.innerText = "1개";
cartListBox.append(countBox);
cartListBox.id = `list${id}`;
cartList.append(cartListBox);
};
const addFood = (event) => {
const {
target: { parentNode },
} = event;
const cartListBoxs = document.querySelectorAll(".cart__list li");
const idArray = [];
cartListBoxs.forEach((box) => {
if (`list${parentNode.id}` === box.id) {
idArray.push(box.id);
}
});
const exist = idArray.includes(`list${parentNode.id}`);
if (exist) {
cartListBoxs.forEach((box) => {
if (`list${parentNode.id}` === box.id) {
const count = +box.children[0].textContent.substring(
0,
box.children[0].textContent.length - 1
);
box.children[0].innerText = `${count + 1}개`;
}
});
} else {
const foodName = parentNode.children[0].textContent;
const foodPrice = parentNode.children[1].textContent;
printFood(foodName, foodPrice, parentNode.id);
}
};
cartBtns.forEach((btn) => btn.addEventListener("click", addFood));
위의 코드는 카트에 담길 메뉴들의 태그에 id값을 부여하여 중복된 메뉴들 선택할시 이미 선택된 메뉴들의 태그의 내용을 변경해주는 코드입니다. forEach를 통해 중복된 id값을 찾는데 활용하였고, substring를 이용하여 string 값을 필요한 부분만 선택하여 수정할 수 있었습니다.
<body>
<header>
<h1>실시간 채팅</h1>
</header>
<div class="chat"></div>
<form id="user">
<input type="text" id="user__name" placeholder="사용자명" />
<input type="text" id="user__msg" placeholder="메세지를 입력하세요." />
<input type="submit" value="전송" id="user__submit" />
</form>
</body>
채팅 사용자명과 메세지 내용을 적을 input 태그와 만들어질 채팅들을 담을 태그를 만들어 주었습니다.
const userForm = document.querySelector("#user");
const nameInput = document.querySelector("#user__name");
const msgInput = document.querySelector("#user__msg");
const submitBtn = document.querySelector("#user__submit");
const chat = document.querySelector(".chat");
const printMsg = (name, msg) => {
const newChat = document.createElement("div");
const newChatName = document.createElement("span");
const newChatMsg = document.createElement("span");
newChatName.innerText = `${name}: `;
newChatName.className = "chat__box__name";
newChatMsg.innerText = msg;
newChatMsg.className = "chat__box__msg";
newChat.appendChild(newChatName);
newChat.appendChild(newChatMsg);
chat.appendChild(newChat);
};
const addMsg = (event) => {
event.preventDefault();
const userName = nameInput.value;
const userMsg = msgInput.value;
printMsg(userName, userMsg);
msgInput.value = "";
};
userForm.addEventListener("submit", addMsg);
input들이 담긴 form에게 addEventListener 이용하여 submit 이벤트 발생시 addMsg 함수를 실행시키게 만들었습니다. 이때 form은 기본적으로 submit이 실행시 페이지의 reload가 발생되므로 preventDefault를 이용하여 해당 reload를 막아주어야 합니다. 그 후 document 객체의 createElement 메서드를 이용하여 새로운 태그들을 생성한 후, 사용자명과 메세지 내용을 적는 input들의 value를 담아 append를 통해 자식 태그들로 부여할 수 있습니다.
<body>
<form class="todo__form">
<input
type="text"
class="todo__form__input"
placeholder="할 일을 입력하세요."
required
/>
<input type="submit" value="Add" class="todo__form__submit" />
</form>
<ul class="todo__list"></ul>
</body>
할 일의 내용을 적을 input 태그와 목록을 담을 태그를 만들어 주었습니다.
const todoForm = document.querySelector(".todo__form");
const todoInput = todoForm.querySelector(".todo__form__input");
const todoSubmit = todoForm.querySelector(".todo__form__submit");
const todoList = document.querySelector(".todo__list");
const deleteTodo = (event) => {
const {
target: { parentNode },
} = event;
parentNode.remove();
};
const printTodo = (content, id) => {
const newTodo = document.createElement("li");
const newTodoContent = document.createElement("span");
const deleteBtn = document.createElement("button");
newTodoContent.innerText = content;
deleteBtn.innerText = "Delete";
deleteBtn.addEventListener("click", deleteTodo);
newTodo.id = id;
newTodo.appendChild(newTodoContent);
newTodo.appendChild(deleteBtn);
todoList.appendChild(newTodo);
};
const addTodo = (event) => {
event.preventDefault();
const todoContent = todoInput.value;
const todoId = Date.now();
printTodo(todoContent, todoId);
todoInput.value = "";
};
todoForm.addEventListener("submit", addTodo);
createElement 메소드를 통해 만들어진 button 태그에 addEventListener를 적용시킬 수 있습니다. 또한 remove를 통해 HTMl문서의 원하는 태그들을 삭제할 수 있습니다.
바닐라 Javascript를 이해할 수 있는 좋은 시간이었습니다. 많은 실습을 통해 HTMl 문서의 요소들을 통제하는 데 익숙해질 수 있었습니다. 다만 아직은 Javascript를 통해 객체 및 배열을 다루는 데에는 부족함이 느껴졌습니다. 더 많은 실습과 프로젝트들을 통해 자유롭게 Javascript를 사용하고 싶다는 생각이 들었습니다.
#프로젝트캠프 #프로젝트캠프후기 #유데미 #스나이퍼팩토리 #웅진씽크빅 #인사이드아웃 #IT개발캠프 #개발자부트캠프 #리액트 #react #부트캠프 #리액트캠프