Salangdung_i의 기록
자바스크립트를 이용한 미니 게임 만들기 프로젝트 본문
유튜브에서 드림코딩 엘리의 강의를 보고 온라인쇼핑몰미니게임을 만들어보았다.
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>은지 Online Shopping</title>
<link rel="stylesheet" href="style.css" />
<script src="src/main.js" defer></script>
</head>
<body>
<!-- Logo -->
<img src="img/logo.png" alt="Logo" class="logo">
<!-- Buttons -->
<section class="buttons">
<button class="btn">
<img
src="img/blue_t.png"
alt="tshirt"
class="imgBtn"
data-key="type"
data-value="tshirt"
/>
</button>
<button class="btn">
<img
src="img/blue_p.png"
alt="pants"
class="imgBtn"
data-key="type"
data-value="pants"
/>
</button>
<button class="btn">
<img
src="img/blue_s.png"
alt="skirt"
class="imgBtn"
data-key="type"
data-value="skirt"
/>
</button>
<button class="btn colorBtn blue" data-key="color" data-value="blue">Blue</button>
<button class="btn colorBtn yellow" data-key="color" data-value="yellow">Yellow</button>
<button class="btn colorBtn pink" data-key="color" data-value="pink">Pink</button>
</section>
<!-- Items -->
<ul class="items"></ul>
</body>
</html>
사용자 정의 데이터 속성이라고 하는 속성 클래스를 형성하여 스크립트에서 사용할 수 있는 HTML 과 DOM 표현 간에 독점 정보를 교환 할 수 있습니다. 이러한 모든 사용자 정의 데이터는 HTMLElement속성이 설정된 요소의 인터페이스를 통해 사용할 수 있습니다 . HTMLElement.dataset속성은 그들에 액세스 할 수 있습니다.
https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes#attr-dataset
main.js 은 function별로 하나씩 주석을 달며 파악하자!
Fetch the items from ths JSON file
function loadItems() {
return fetch('data/data.json')
.then(response => response.json()) //json으로 변환
.then(json => json.items); //json 안의 items를 return
}
loadItems 라는 함수는 fetch를 이용해서 데이터를 받아온 다음 받아온 데이터가 성공적이면 Json으로 변환하고 json 안의 items 를 리턴한다. 간략하게 말하면 loadItems 'data.json'의 리소스를 가져와 json으로 변환한후 json에 담긴 items를 리턴하는 것이다.
fetch는 가져오기API, 네트워크에서 비동기적으로 리소스를 가져오는 방법을 제공한다. 아래는 기본 가져오기 요청 설정 예시이다.
fetch('http://example.com/movies.json')
.then(response => response.json())
.then(data => console.log(data));
참고 : https://developer.mozilla.org/ko/docs/Web/API/Fetch_API
Update the list with the given items
function displayItems(items) {
const container = document.querySelector('.items');
container.innerHTML = items.map(item => createHTMLStirng(item)).join('');
}
querySelector로 itmes 클래스에 접근
querySelector : Returns all element descendants of node that match selectors. 선택자와 일치하는 노드의 모든 요소 하위 항목을 반환합니다.
map() 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환한다.
Create HTML list item from the given data item
주어진 데이터 항목에서 HTML 목록 항목 만들기
function createHTMLStirng(item) {
return `
<li class="item">
<img src="${item.image}" alt="${item.type}" class="item__thumbnail" />
<span class="item__description">${item.gender}, ${item.size}</span>
</li>
`;
}
json.items 을 전달받아 아래 작업을 수행
Handle button click
function onButtonClick(event, items) {
const dataset = event.target.dataset;
const key = dataset.key;
const value = dataset.value;
if(key == null || value == null) {
return;
}
const filtered = items.filter(item => item[key] == value);
console.log(filtered);
displayItems(filtered);
}
만약 key: color, value: blue 라면 item 에서 item.color == blue 인것만 filter된다.
event는 Event인터페이스는 DOM에서 일어나는 이벤트를 나타낸다. event자체에는 모든 이벤트에 공통적인 속성과 메서드가 포함되어 있다.
event.target은 이벤트가 전달되는 객체(대상)를 반환한다.
https://developer.mozilla.org/ko/docs/Web/API/EventListener
https://developer.mozilla.org/en-US/docs/Web/API/Event
https://developer.mozilla.org/en-US/docs/Web/API/Event/target
function setEventListeners(items) {
const logo = document.querySelector('.logo');
const buttons = document.querySelector('.buttons');
logo.addEventListener('click', () => displayItems(items));
buttons.addEventListener('click', () => onButtonClick(event, item));
}
addEventListener() 메서드는 지정한 이벤트가 대상에 전달될 떄마다 호출함수를 설정한다. logo에 클릭시 displayItems를 실행
addEventListener<K extends keyof ElementEventMap>(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
loadItems()
.then(items => {
displayItems(items);
setEventListeners(items)
})
.catch(console.log)
loadItems를 실행하고 items를 반환한다. 이후 displayItems, setEventListeners 를 실행시킨다.
main.js
// Fetch the items from ths JSON file
function loadItems() {
return fetch('data/data.json')
.then(response => response.json()) //json으로 변환
.then(json => json.items); //json 안의 items를 return
}
// Update the list with the given items
function displayItems(items) {
const container = document.querySelector('.items');
container.innerHTML = items.map(item => createHTMLStirng(item)).join('');
}
// Create HTML list item from the given data item
function createHTMLStirng(item) {
return `
<li class="item">
<img src="${item.image}" alt="${item.type}" class="item__thumbnail" />
<span class="item__description">${item.gender}, ${item.size}</span>
</li>
`;
}
// Handle button click
function onButtonClick(event, items) {
const key = dataset.key;
const value = dataset.value;
if(key == null || value == null) {
return;
}
const filtered = items.filter(item => item[key] == value);
console.log(filtered);
}
function setEventListeners(items) {
const logo = document.querySelector('.logo');
const buttons = document.querySelector('.buttons');
logo.addEventListener('click', () => displayItems(items));
buttons.addEventListener('click', () => onButtonClick(event, item));
}
loadItems()
.then(items => {
displayItems(items);
setEventListeners(items)
})
.catch(console.log)
https://github.com/salangdung-i/shopping-game
https://www.youtube.com/watch?v=We2Kv1HMGvc
'WEB FRONT END > JavaScript' 카테고리의 다른 글
브라우저의 랜더링(async/defer) (0) | 2022.03.18 |
---|---|
[JS] 클로저 (0) | 2022.03.04 |