코딩/TIL

TIL #210111

나동 2021. 1. 11. 23:31

📚 TIL


인터랙티브 자바스크립트

 

🎉 자바스크립트 중급 인터랙티브 자바스크립트 토픽 완료! 토픽2, 3은 출시 예정이래요 🎉

 

🔎 이벤트 살펴보기

 

이벤트 핸들러 등록하기

 

- onclick 프로퍼티로 새로운 이벤트 핸들러를 할당하면

 

(1) 기존의 값을 덮어쓰는 문제가 발생하고

(2) 여러 개의 이벤트를 다룰 수 없음

 

- addEventListener 메소드를 활용하면 위의 문제를 해결할 수 있음

- 이벤트를 삭제할 때 등록할때 사용했던 핸들러를 그대로 전달해야 함

 

elem.addEventListener(event, handler)
elem.removeEventListener(event, handler)

 

이벤트 객체(Event Object)

 

- 웹 페이지에서 이벤트가 발생할 때 관련된 정보를 담은 객체
- 이벤트 핸들러의 첫번째 파라미터에는 자동으로 이벤트 객체가 전달됨

 

이벤트 버블링(Event Bubbling)

 

- 하나의 요소에 이벤트가 발생하게 되면 요소에 할당된 이벤트가 동작하고 같은 타입의 이벤트에 한해서 부모 요소의 핸들러도 동작하는 현상

요소 각각에 할당된 모든 핸들러가 동작하는 원리

- target은 변하지 않고 처음 이벤트가 시작된 시작점을 나타냄

- currentTarget : 이벤트 핸들러가 동작하는 요소 출력하는 프로퍼티

- stopPropagation() : 버블링 전파를 막을 수 있는 메소드

 

캡쳐링(capturing)

 

- 이벤트가 발생하면 가장 먼저, 그리고 버블링의 반대 방향으로 진행되는 이벤트 전파 방식

- addEventListener에 세번째 프로퍼티에 true 또는 {capture:true}를 전달하여 동작

 


  표준 DOM 이벤트에서 정의한 이벤트 흐름

  1. 캡처링 단계: 이벤트가 하위 요소로 전파되는 단계 

  2. 타깃 단계: 이벤트가 실제 타깃 요소에 전달되는 단계 
  3. 버블링 단계: 이벤트가 상위 요소로 전파되는 단계


이벤트 위임(Event Delegation)

 

- 버블링을 활용하여 부모 요소에서 한 번에 자식 요소들에 발생한 이벤트를 관리하는 방식

 

브라우저의 기본 동작

 

- 브라우저에는 각 태그별 혹은 상황별로 기본적으로 약속된 동작들이 있음

- 이벤트 객체의 preventDefault 메소드를 통해 막을 수 있음

- HTML 태그들이 가지고 있는 고유한 역할과 의미를 훼손할 수도 있어 꼭 필요한 경우에만 주의해서 사용

 


 

🔎 다양한 이벤트 알아보기

 

마우스 버튼 이벤트

 

MouseEvent.button

 

- 0 : 마우스 왼쪽 버튼

- 1 : 마우스 휠

- 2 : 마우스 오른쪽 버튼

- 마우스 이동과 관련된 이벤트에서는 이 값이 null이나 undefined가 아니라 0임 

 

MouseEvent.type

 

이벤트 타입 설명
click 마우스 왼쪽 버튼을 눌렀을 때
contextmenu 마우스 오른쪽 버튼을 눌렀을 때
dbclick 동일한 위치에서 빠르게 두번 click할 때
mousedown 마우스 버튼을 누른 순간
mouseup 마우스 버튼을 눌렀다 뗀 순간
mousemove 마우스 포인터가 이동할 때
mouseover  마우스 포인터가 요소 밖에서 안으로 이동할 때
mouseout 마우스 포인터가 요소 안에서 밖으로 이동할 때
mouseenter 마우스 포인터가 요소 위로 올라온 순간
mouseleave 마우스 포인터가 요소에서 벗어나는 순간

 

mouseover/mouseout과 mouseenter/mouseleave의 차이

 

mouseenter/mouseleave 는

- 이벤트가 자식 요소에 영향을 끼치지 않는다. 
- 버블링이 일어나지 않는다. 
- 자식 요소의 영역을 계산하지 않는다.

 

MouseEvent.위치값/타겟

 

프로퍼티 설명
clientX, clientY 마우스 포인터의 브라우저 표시 영역에서의 위치
pageX, pageY 마우스 커서의 문서 영역에서의 위치
offsetX, offsetY 마우스 포인터의 이벤트 발생한 요소에서의 위치
screenX, screenY 마우스 포인터의 모니터 화면 영역에서의 위치
target  이벤트가 발생한 요소
relatedTarget  이벤트가 발생하기 직전(또는 직후)에 마우스가 위치해 있던 요소

 

키보드 이벤트

 

KeyboardEvent.type

 

이벤트 타입 설명
keydown 키보드의 버튼을 누르는 순간
keypress 키보드의 버튼을 누르는 순간 (출력이 가능한 키에서만 동작)
keyup 키보드의 버튼을 눌렀다 떼는 순간

 

KeyboardEvent.key vs KeyboardEvent.code

 

- key : 이벤트가 발생한 버튼의 값사용자가 누른 키가 가지고 있는 값 
- code : 이벤트가 발생한 버튼의 키보드에서의 물리적인 위치

 

 

input 태그 다루기

 

- 입력의 역할을 하는 태그

 

이벤트 타입 설명
focusin 요소에 포커스가 되는 순간
focusout 요소에 포커스가 빠져나가는 순간
focus 요소에 포커스가 되는 순간 (버블링이 일어나지 않음)
blur 요소에 포커스가 빠져나가는 순간 (버블링이 일어나지 않음)
change 입력된 값이 바뀌는 순간
input 값이 입력되는 순간
select 입력 양식의 하나가 선택되는 순간
submit 폼을 전송하는 순간

 

스크롤 이벤트

 

- 보통 window 객체에 이벤트 핸들러를 등록하고 window 객체의 프로퍼티와 함께 자주 활용
- scrollY 프로퍼티를 활용하면

 

(1) 스크롤된 특정한 위치를 기준으로 이벤트 핸들러가 동작하게 하거나

(2) 스크롤 방향(위로/아래로 스크롤 중인지)을 기준으로 이벤트 핸들러가 동작하게 활용 가능

 


 

🔎실습 문제 풀이

 

마우스 버튼 이벤트

 

- 마우스 왼쪽 버튼을 누른 순간 flagBlue에 'up'이라는 클래스 속성값 추가

- 마우스 오른쪽 버튼을 누른 순간 flagWhite에 'up'이라는 클래스 속성값 추가

 

function flagUp(e) {
  if (e.button === 0) {
    flagBlue.classList.add('up');
  } else if (e.button === 2) {
    flagWhite.classList.add('up);
  }
}

 

마우스 이동 이벤트

 

- 마우스 커서가 해당 태그 위로 올라가면 data-title 속성의 값이 나타나도록 코드 작성

 

function showTitle(e) {
  if (e.target.dataset.title) {
    const span = document.createElement('span');
    span.classList.add('title');
    span.textContent = e.target.dataset.title;
    e.target.append(span);
  }
}

 

키보드 이벤트

 

- textarea 태그에서 enter 키를 누르면 sendMyText 함수가 호출되는 코드를 추가

 

function sendMyTextByEnter (e) {
  if (e.key === 'Enter' && !e.shiftKey) {
    sendMyText();
    e.preventDefault();
  }
}
input.addEventListener('keypress', sendMyTextByEnter);

 

input 태그 다루기

 

- input 태그에 단어 입력이 완료되면 화면에 있는 단어들이 사라지도록 코드 작성

 

function removeWord() {
  const word = document.querySelector(`[data-word="${input.value}"]`);
  if (word) {
    word.remove();
    checker();
  }
  input.value = '';
}
input.addEventListener('change', removeWord);

 


 

😁 오늘 한 일


 

📕 코드잇 공부하기

- 오늘은 자바스크립트 중급 첫번째 토픽(이자 현재 마지막 토픽)을 끝냈어요

- 자바스크립트 기초 공부한 지 2주도 안됐는데 벌써 가물가물.. 복습해야겠어요!

- 자바스크립트도 객체로 이루어져서 이벤트와 객체 개념을 확실하게 해야겠어요

- 출시 예정인 강의들도 나중에 들어야지~~

 

 

📝 블로그 정리하기

- 이제 블로그를 시작한 지 2주 정도 지났네요!

- 얼마 안됐지만 처음 썼던 글을 현재 글과 비교해보니 고칠 점이 많더라고요!

- 이제 서식도 정해져서 글이 더 깔끔해진 것 같아요 ㅎㅎ

- 정리 못한 부분도 다시 하고 ㅎㅎ 이제 진짜 거슬려도 안건드려 ㅠㅠ 넘 오래 했다

 

📖 독서하기

- 베르나르 베르베르의 기억 1편을 마저 읽었어요

- 전작과 비슷하게 책 초반부에 엄청난 사건이 일어나요!

- 매일 책을 읽고 싶은데 난 너무 게을러~~ 하루가 더 길었으면 좋겠어요

- 2019년까지는 매주 독서모임을 했는데 그때가 그리워요 ㅠㅠ

'코딩 > TIL' 카테고리의 다른 글

TIL #210113  (0) 2021.01.13
TIL #210112  (0) 2021.01.12
TIL #210110  (0) 2021.01.10
TIL #210109  (0) 2021.01.09
TIL #210108  (0) 2021.01.08