컨디션이 회복되지 않았지만 더 이상 공부에 손을 놓고만 있을 수는 없어서 무리하지 않는 선에서 강의를 들었다. 가벼운 마음으로 가볍게 필기하며 들어서 최대한 컨디션에 영향이 가지 않게 하였다.
이벤트핸들러
이벤트 객체
프로퍼티 | 설명 |
---|---|
type | 이벤트 이름 ('click', 'mouseup', 'keydown' 등) |
target | 이벤트가 발생한 요소 |
currentTarget | 이벤트 핸들러가 등록된 요소 |
timeStamp | 이벤트 발생 시각(페이지가 로드된 이후부터 경과한 밀리초) |
bubbles | 버블링 단계인지를 판단하는 값 |
이벤트 버블링
특정 요소의 이벤트 핸들러가 호출되면, 해당 요소의 무보 요소의 이벤트 핸들러도 그 뒤를 따라 호출되게 되는 현상. 최상 요소인window객체까지 올라가는 것이 특징이다. 이벤트 버블링이 일어나도 이벤트 객체의 target 프로퍼티는 최초로 이벤트가 발생한 요소로 고정된다. 시작점을 담고 있는 것이다. 만약 이벤트핸들러를 등록한 대상에 접근하고 싶으면 currentTarget이라는 프로퍼티로 접근하면 된다.
e.stopPropagation()
으로 이벤트 버블링을 멈출 수 있다.이벤트 캡처링
이벤트 버블링은 부모 요소의 이벤트핸들러가 호출되는 현상이지만, 이벤트 캡쳐링은 그 반대의 방향으로 이벤트가 전파되는 방식이다. 이벤트가 발생하면 가장 먼저 window 객체에서부터 target 까지 이벤트 전파가 일어난다. target에 도달하면 비로소 이벤트 핸들러가 동작하고, 이벤트 버블링이 일어나며 다시 window객체로 이벤트가 전파된다. 캡처링 단계에서 target의 이벤트 핸들러 동작 전에 부모의 이벤트핸들러 동작이 필요한 경우는 드물지만, addEventListener에 세 번째 파라미터에 true 또는 { capture: true }를 전달해주면 가능하다.
이벤트 위임
이벤트 위임은 부모 요소에 핸들러 하나를 등록하여 모든 자식 요소에도 동일 이벤트에 대한 핸들러를 등록한 것과 같은 효과를 내는 현상이다. 예를 들어 ul
태그 안에 모든 li
태그에 대해서 각각 핸들러를 등록하는 것은 함수가 많아질 뿐더러, 다른 li
태그가 추가되면 또 따로 등록해줘야 하지만, ul
태그에 한번에 핸들러를 등록하면 하위요소인 li
태그들도 해당 핸들러가 등록되는 효과가 있다. 하지만 ul
안에 li
말고도 다른 태그가 있을 수 있고, 우리는 li
태그에만 핸들러를 등록하고 싶다. 이 때 이벤트 객체의 target
프로퍼티를 잘 활용하여 조건문을 if (e.target.tagName === ‘li’)
와 같이 만들어 사용할 수 있다.
const list = document.querySelector('#list'); // ul태그
list.addEventListener('click', (e)=>{
if(e.target.tagName === 'li'){
e.target.classList.toggle('done');
}
});
keyboard 이벤트
e.key
: 사용자가 누른 키가 가지고 있는 값e.code
: 누른 키의 물리적인 위치e.shiftKey
: 이벤트가 발생한 시점에 shift키를 눌렀는지 boolean값 다음 코드는 채팅창에 글자입력 후 엔터를 쳐서 전송할 수 있는 기능을 개발하는 코드의 일부이다. 보다시피 시프트키와 엔터를 함께 눌렀을 때는 메세지를 전송하는 것이 아닌 줄바꿈을 실행한다. 또한 preventDefault를 통해 메세지창에 엔터를 쳤을 때 전송과 동시에 줄바꿈이 이루어지는 것을 방지한다.const sendMyTextByEnter = (e)=>{
if(e.key === "Enter" && !e.shiftKey){
sendMyText();
e.preventDefault();
}
}
모던 자바스크립트
const example1 = null ?? 'I'; // I
const example2 = undefined ?? 'love'; // love
const example3 = 'Codeit' ?? 'JavaScript'; // Codeit
console.log(example1, example2, example3); // I love Codeit
function func(){
console.log('func');
}
const func2 = function(){
console.log('func2');
}
let countdown = function printCountdown(n) {
console.log(n);
if (n === 0) {
console.log('End!');
} else {
printCountdown(n - 1);
}
};
let myFunction = countdown;
countdown = null;
myFunction(5); // 정상적으로 동작
function printArgument(...args){
console.log(args.splice(0, 2));
console.log('----------------');
}
const title = 'Codeit';
const birth = 2017;
const job = 'Developer';
const user = {
title: title,
birth: birth,
job: job,
}
//위와 같이 키 밸류 값이 동일하다면 아래와 같이 간단하게 입력도 가능하다.
const user2 = {
title,
birth,
job,
}
const user = {
firstName: 'Tess',
lastName: 'Jang',
getFullName: function(){
return `${this.firstName} ${this.lastName}`;
},
}
//위와 같이 메서드를 객체 내부에서 선언할 경우, function키워드를 생략가능하다
const user2 = {
firstName: 'Tess',
lastName: 'Jang',
getFullName(){
return `${this.firstName} ${this.lastName}`;
},
}
const propertyName = 'birth';
const getJob = () => 'Job';
const user = {
['topic' + 'Name']: 'Modern Javascript',
[propertyName]: 2017,
[getJob()]: 'Developer',
}
//위와 같이 프로퍼티 이름에 대괄호를 이용하면 표현식을 쓸 수 있다. 함수의 리턴값이나 변수명, 계산식 등이 키에 들어갈 때 활용한다.
let firstName = 'Cho';
let lastName = 'Kenny';
[firstName, lastName] = [lastName, firstName];
const macbook = {
title: '맥북 pro',
price: 3690000,
memory: '16GB',
storage: '1TB SSD'
}
// macbook 객체의 title 프로퍼티를 product라는 변수 이름으로 담는다.
// title 프로퍼티 외의 나머지 프로퍼티는 객체의 형태로 모아서 rest라는 변수에 담는다.
const { title: product, ...rest } = macbook;
Content-Type 헤더
request
와 response
는 헤드와 바디로 이루어져 있다. 헤드에는 각종 부가 정보(사용하는 메소드, user-agent, status code 등)가 들어있고, 바디에 실제 주고받는 데이터가 들어간다. 크롬 개발자 도구에서 network 탭에 들어가 실제 통신의 내용을 볼 수 있는데, 이 떄 request headers
와 같이 header라는 탭이 있다. 이 header라는 것이 바로 요청/응답의 헤드에 들어있는 키 - 밸류 쌍 하나를 뜻한다. 예를 들어 status code : 200 OK
는 하나의 헤더이다.
여기서는 중요한 헤더중 하나인 content-type
에 대해서 알아보자. content-type
은 현제 요청 또는 응답의 바디에 들어있는 데이터가 어떤 타입인지를 나타낸다. 보통은 JSON형식 데이터겠지만 사실 텍스트, 이미지, 영상 부터 정말 다양한 종류가 들어갈 수 있다. 이런 데이터들의 타입 정보가 content-type
헤더에 들어있는 것이다.
content-type
은 “주 타입/서브 타입” 형식으로 나타나게 된다. 예를 들자면, “text/Javascript”
라면 주 타입이 text, 서브 타입이 자바스크립트 코드라는 뜻이다. 주 타입은 text, image, audio, video, application이 있다. 그리고 json형식 데이터는 content-type
이 application/json
이다.
Content-Type 설정하기
const newMember = {
name: 'Jerry',
email: 'jerry@codeit.kr',
department: 'engineering',
};
fetch('https://learn.codeit.kr/api/members', {
method: 'POST',
headers: { // 추가된 부분
'Content-Type': 'application/json',
},
body: JSON.stringify(newMember),
})
.then((response) => response.text())
.then((result) => { console.log(result); });