[javascript] javascript boot camp 16기 여섯번째 수업
자바스크립트 부트캠프 16기 여섯번째 수업
이벤트 시스템의 이해 ui를 다루기위해선 필수적으로 익혀야하는 시스템.
저장소가 있을때, UI / 이벤트 / 함수
1) UI 요소: Btn이라는 DOM 2) 이벤트: click이라는 사건 3) 함수: 실행되어야하는 코드덩어리
querySelector는 css의 구문 즉 CSS의 선택자를 입력해서 활용할 수 있는 메소드입니다
기본적으로 ui를 가지고오는 코드가 수반됀다.
큐의 개념같은 경우는 지금 학습하기엔 어려움. 컴공 베이스지식(자료구조)이 있어야지 이해가능한 영역
비전공자라도 자료구조 중에 3가지는 꼭 알고가면 좋은 지식
- 스택
- 큐 스택이나 큐같은 경우는 알아서 배열루 구현하면 좋을거고
- 트리 트리도 학습할때 도움이 굉장히 마니 댐.
이벤트 구독
let root = document.querySelector('div');
let save = document.querySelector('[data-action=save]');
root.addEventListener('click', function(event) {
console.log(`target: ${event.target.tagName}`);
console.log(`currentTarget: ${event.currentTarget.tagName}`);
console.log(event.target.dataset.action);
});
save.addEventListener('click', function(event) {
if (event.target.dataset.saveType === 'auto') {
// dataset의 이름을 카멜케이스로 가지고올수있음
// event.target해버리면 i라는 node를 누르게 돼서 currentTarget이 적합하다.
console.log('자동 저장');
} else {
console.log('수동 저장');
}
});
target 과 currentTarget ? target: 클릭한 DOM. 실제로 이벤트가 발생한 DOM 요소 currentTarget: 이벤트리스너가 등록된 요소, 이벤트핸들러로 등록된 대상
html태그는 태그를 감싸고 있는 형태. a태그는 p태그가 감싸고 있고 div가 감싸고 있는 형태 2차원 평면형태로 바라보다보니깐 감싸진게 아니라 위치가 안쪽.
실제적으로는 전체가 다 감싸져있음
내가 등록한 요소에서만 이벤트가 발생하는게 아니구나 ! 요소 입장에서는 부모이벤트에 이벤트를 등록해놓으면.. 혼란이 올수도~_~ 정확히 어떤 요소가 클릭됐는지 확인됄 필요가 있기에 target을 씀
?_? 근데 버튼만하면 돼지 왜 div클릭하게하는걸까? 실제상황엔 변이가 많음.
구글 스프레드 시트 경우에는 그 많은 dom들을 querySelector로 등록하기엔 비용이 크니, 그냥 아예 div 통채로 묶어서 진행하는것이 더 효율적..
target을 쓸때가 나을때가 있고, currentTarget을 쓸때가 나을 수도 있음. 적절히 혼합해서 사용하기
이벤트 전파
쓸일이 없어도 개념은 확실히 알아야함 이벤트 핸들러가 어떤 순서로 호출되게 할것이냐…
바깥쪽 안 박스 안 박스가 있는데. 클릭할때, 바깥쪽부터 이벤트가 전파된다.
이벤트가 중첩됐을때 어떻게 전파되는가?
이벤트 버블링, 이벤트 캡쳐링
const BUBBLING_PHASE = false;
const CAPTURING_PHASE = true;
const PHASE_NAME = ['NONE', 'CAPTURING', 'TARGET', 'BUBBLING'];
function eventLogger(e) {
console.log(`${e.target.dataset.name}, ${e.currentTarget.dataset.name}, ${PHASE_NAME[e.eventPhase]}`);
}
let divs = document.getElementsByTagName('div');
/*
let divs = document.querySelectorAll('div');
divs.forEach(div => div.addEventListener('click', eventLogger));
*/
// 이벤트 버블링
for(let i=0; i < divs.length; i++) {
divs[i].addEventListener('click', eventLogger, BUBBLING_PHASE);
}
// 이벤트 캡쳐링 (캡쳐링 쓰는건 별로 없고..)
for(let i=0; i < divs.length; i++) {
divs[i].addEventListener('click', eventLogger, BUBBLING_PHASE);
// 세번째 인자는 기본값이 false고, 버블링이 일어난다.
}
event.stopPropagation(); // 이벤트 전파를 금지시킨다. (면접때 질문~_~)
브라우저 기본 객체의 이해
DOM이 중요한데 왜 자세히 다루지않는가? DOM은 매우 복잡하고 애립다. DOM을 다루면서 ui를 다루기에는 너무 복잡도가 높아짐
DOM을 가지고 제어하지않아도 ~ react나 vue로 만들 수 있어염
library의 역사는 DOM과의 사투였다
DOM을 몰라도 웹앱을 개발할 수 있다 -> react만 한다치면 가능함. react는 DOM의 직접적인 접근을 막고 지양함.
하지만 DOM에 대한 개념을 알아야 성능개선에 이로움
DOM (Document Object Model) -> html의 오브젝트들을 객체화 시킨 모델.
DOM도 자료구조라고 보면 CRUD가 가능하다 ㄴ> DOM TREE 돔 트리 ㄴ> html :root / 줄기는 node.
html root node. head와 body는 head node, body node 뿌리와 가지의 관계를 부모, 자식간의 관계로 표현하기도 함 자식을 추가한다 appendChild..
// 색이 다른 5개의 상자를 추가하세요.
function createBoxStyle(width, height, color) {
return {
width: `${width}px`,
height: `${width}px`,
backgroundColor: color
};
}
function createSquareBoxStyle(size, color) {
return createBoxStyle(size, size, color);
} // 의미를 더욱 더 명확하게 하기 위해서.. 명시적인 함수들을 활용하면 앱의 규모가 커질수록 더 가독성 높아지고 쾌적해짐.
function createBox(boxStyle) {
let box = document.createElement('div');
box.style.width = boxStyle.width;
box.style.height = boxStyle.height;
box.style.backgroundColor = boxStyle.backgroundColor;
return box;
}
let container = document.getElementById('box-container');
let boxStyles = [
createSquareBoxStyle(10, 'red'),
createSquareBoxStyle(20, 'orange'),
createSquareBoxStyle(30, 'yellow'),
createSquareBoxStyle(40, 'green'),
createSquareBoxStyle(50, 'blue'),
];
for(let i = 0; i < boxStyles.length; i++) {
container.appendChild(createBox(boxStyles[i]))
}
학생 1 ~ 학생 3 분들의 코드를 보고 리뷰해보는것도 괜찮.. 재미있는 approach ㅎㅎ