두 프로젝트 모두 모듈프로그래밍을 기초로 둔다.
주접생성기 (main.js)
import {
copy,
shake,
getNode,
addClass,
showAlert,
getRandom,
insertLast,
removeClass,
clearContents,
isNumericString,
} from "./lib/index.js";
import jujeobData from "./data/data.js";
// 모듈 프로그래밍 사용해서
// [phase-1]
// 1. 주접 떨기 버튼을 클릭할 수 있는 핸들러를 연결해 주세요.
// - button click addEventListener
// 2. input 값을 (콘솔에)가져와 주세요.
// - input value console.log
// 3. jujeob 데이터를 가져오기
// 4. jujeobData 함수에 input.value를 넣어주세요
// 5. 랜덤한 주접 한개를 pick
// - jujeobData => return ???
// - array => array[] + getRandom( n )
// 6. pick을 result에 랜더링해주세요.
// - result 내용 비우기 ( clearContents, node.textContent = '')
// - pick text => insertAdjacentHTML('beforeend',text) , insertLast()
// [phase-2]
// 1. 아무 값도 입력 받지 못했을 때 예외처리 (alert)
// 2. 공백 문자를 받았을 때 예외처리 (alert)
// - String.prototype.replace + regExp
// 3. 숫자형 문자를 받았을 때 예외처리 (alert)
const submit = getNode("#submit");
const nameField = getNode("#nameField");
const result = getNode(".result");
function handleJujeob(e) {
e.preventDefault();
const name = nameField.value;
const list = jujeobData(name);
const pick = list[getRandom(list.length)];
if (!name || name.replace(/\s*/g, "") === "") {
showAlert(".alert-error", "이름을 입력해주세요");
shake.restart();
return;
}
if (!isNumericString(name)) {
showAlert('.alert-error','제대로된 이름을 입력해주세요');
shake.restart();
return;
}
clearContents(result);
insertLast(result, pick);
}
function handleCopy(){
const text = this.textContent;
if(!nameField.value) return;
copy(text).then(()=>{
showAlert('.alert-success','클립보드 복사 완료!!');
})
}
submit.addEventListener("click", handleJujeob);
result.addEventListener('click',handleCopy)
랜덤다이스 (main.js)
// [phase-1]
// 1. 주사위 굴리기 버튼을 누르면 diceAnimation() 실행될 수 있도록
// 2. 같은 버튼 toggle 만들기 (isClicked)
// 3. setInterval 재생 / 정지
// 4. 바깥 변수 보호하기 (closure)
// 5. button 활성화 여부
// [phase-2]
// 1. recordButton 이벤트 바인딩
// 2. recordListWrapper show / hidden
// 3. renderRecordItem 함수 만들기
// - 주사위 눈 가져오기
// - 템플릿 랜더링하기
// - 값 계산하기
// 미니 과제 => 만들어주는 함수, 초기화 버튼 클릭시 모든 데이터 날리기
import {diceAnimation, getNode, getNodes} from './lib/index.js'
const [rollingButton, recordButton, resetButton] = getNodes('.buttonGroup > button'); //queryselectorAll로, 유사배열에 구조분해할당 받기
const recordListWrapper = getNode('.recordListWrapper');
const tbody = getNode('.recordList tbody');
function handleRollingDice(){
let isClicked = false;
let stopAnimation;
return () => { //클로저 사용
if(!isClicked){
stopAnimation = setInterval(diceAnimation, 300);
console.log('시작');
recordButton.disabled = true; //버튼 활성화 여부
resetButton.disabled = true;
}
else {
clearInterval(stopAnimation);
console.log('종료')
recordButton.disabled = false;
resetButton.disabled = false;
}
isClicked = !isClicked;
}
}
let count = 0;
let total = 0;
function renderRecordItem() {
const cube = getNode('#cube');
const diceValue = +cube.dataset.dice;
let template = `
<tr>
<td> ${++count} </td>
<td> ${diceValue} </td>
<td> ${total += diceValue} </td>
</tr>`
//랜더링
tbody.insertAdjacentHTML('beforeend',template);
}
function handleRecord() {
recordListWrapper.hidden = false;
renderRecordItem();
}
function handleReset() {
// child.remove();
// const child = document.querySelectorAll('.recordList tbody tr');
tbody.innerHTML = '';
count = 0;
total = 0;
}
rollingButton.addEventListener('click', handleRollingDice());
recordButton.addEventListener('click', handleRecord);
resetButton.addEventListener('click', handleReset);
'JS' 카테고리의 다른 글
JS #16- 웹 API 6 비동기통신 (promise) (0) | 2024.02.15 |
---|---|
JS DOM/스타일/이벤트 정리 (0) | 2024.02.15 |
JS #10-자바스크립트 기초 개념10 (string, array 메서드) (1) | 2024.02.02 |
JS #9-자바스크립트 기초 개념9 (클로저) (2) | 2024.02.01 |
JS #8-자바스크립트 기초 개념8 (가비지컬렉터, this와 메서드, 클래스) (1) | 2024.01.31 |