본문 바로가기

프로그래밍/js

lessons 32. 이벤트

2023.03.19

자바스크립트 스터디 9회차

공부 사이트: https://poiemaweb.com/

 

 

32. 이벤트

이벤트가 발생하면 이를 감지하고, 대응하는 처리를 호출해 주어야 한다.

브라우저는 이벤트를 감지할 수 있으며 이벤트 발생 시에는 통지를 해준다. 이런 과정을 통해 사용자와 웹 페이지가 상호작용이 가능하다.

 

발생한 이벤트에 맞게 반응하기 위해 함수를 사용한다. ← 이 함수가 이벤트 핸들러

 

 

1) 이벤트 루프와 동시성

브라우저는 단일 스레드에서 이벤트 드리븐 방식으로 동작한다.

#단일 스레드: 스레드가 하나이므로 하나의 작업만을 처리할 수있다.

그러나 웹 애플리케이션은 많은 작업이 동시에 처리되는 것처럼 느껴지는데, 이는 자바스크립트의 동시성 때문이다.

동시성을 지원하는 것이 이벤트 루프이다.

 

이벤트 루프와 브라우저 환경 (출처: poiemaweb)

ㅇ Call Stack: 함수가 호출되면 순차적으로 Cal Stack에 쌓임. 순차적으로 실행. 자바스크립트는 하나의 Call Stack을 사용하므로, 해당 작업이 끝나기 전에는 다른 어떤 작업도 수행될 수 없음.

Heap: 동적으로 생성된 객체 인스턴스가 할당되는 영역

Event Queue: 비동기 처리 함수의 콜백 함수, 비동기식 이벤트 핸들러, Timer 함수의 콜백 함수가 보관되는 영역. 이벤트 루프에 의해 특정 시점에 순차적으로 Call Stack으로 이동되어 실행됨.

Event Loop: Call Stack 내에서 현재 실행 중인 작업이 있는지, Event Queue에 작업이 있는지 반복하여 확인. 만약 Call Stack이 비어있다면, Event Queue 내의 작업이 Call Stack으로 이동하고 실행됨.

 

 

 

2) 이벤트의 종류

① UI Event

- load : 웹페이지 로드 완료 시

- unload : 웹페이지 언로드 시 (새로운 페이지 요청 등)

- error : 브라우저가 자바스크립트 오류를 만났거나 요청 자원이 존재하지 않을 때

- resize : 브라우저 창 크기 조절

- scroll : 사용자가 페이지를 스크롤

- select : 텍스트 선택 시

 

② Keyboard Event

- keydown : 키 다운

- keyup: 키 업

- keypress: 키 다운 후 키 업

 

③ Mouse Event

- click : 마우스 클릭

- dbclick : 마우스 더블클릭

- mousedown : 마우스 다운

- mouseup : 마우스 업

- mousemove : 마우스 무브

- mouseover : 마우스를 요소 위로 

- mouseout : 마우스를 요소 밖으로

 

④ Focus Event

- focus / focusin : 요소가 포커스를 얻었을 때

- blur / foucusout : 요소가 포커스를 잃었을 때

 

⑤ Form Event

- input : input / textarea 요소 값 변경 시

- change : select box, checkbox, radio button 상태 변경 시

- submit : form을 submit

- reset : reset 버튼 클릭

 

⑥ Clopboard Event

- cut : 콘텐츠 잘라내기

- copy : 콘텐츠 복사

- paste : 콘텐츠 붙여넣기

 

 

 

3) 이벤트 핸들러 등록 방법

① 인라인 이벤트 핸들러 방식 

- 사용 금지

 

② 이벤트 핸들러 프로퍼티 방식

- HTML과 Javascript가 뒤섞이는 문제 해결 가능.

- 이벤트 핸들러 프로퍼티에 하나의 이벤트 핸들러만을 바인딩할 수 있음

 

③ addEventListener 메소드 방식

- 메소드를 통해 대상 DOM 요소에 이벤트를 바인딩하고, 이벤트 발생 시 실행될 콜백함수를 지정할 수 있음

- 제일 좋은 방법

- 하나의 이벤트에 대해 하나 이상의 이벤트 핸들러 추가 가능

- 버블링 / 캡처링 지원

# 버블링: 한 요소에 이벤트 발생 시 요소가 할당된 핸들러가 동작하고, 부모 요소의 핸들러가 동작하고 ... 최상단 부모 요소를 만날 때까지 반복하여 핸들러가 동작 (최하위에서 최상위까지 반복하여 핸들러 동작)

# 캡처링: 최상위 태그에서 해당 태그를 찾아서 내려가는 흐름

- HTML 요소 뿐만아니라 DOM 요소에 대해서도 동작함.

<!DOCTYPE html>
<html>
<body>
<button class="btn">TEST</button>
  <script>
	const btn = document.querySelector('.btn');
  
        btn.addEventListener('click', function() {
            alert('TEST');
	});
  </script>
</body>
</html>
<!-- Username은 두 글자 이상 입력해야 한다 -->
<!DOCTYPE html>
<html>
<body>
<label>Username <input type='text'></label>
<em class="message"></em>
  <script>
	const MIN_LENGTH = 2;
	const input = document.querySelector('input[type=text]');
	const msg = document.querySelector('.message');
	
	function checkUsernameLength(n){
		if(input.value.length <n){
			msg.innerHTML = '이름은 ' + n + '자 이상';
		} else {
			msg.innerHTML= '';
		}
	}
	
        input.addEventListener('blur', function() {
            checkUsernameLength(MIN_LENGTH);
	});
  </script>
</body>
</html>

 

 

 

4) 이벤트 핸들러 함수 내부에서의 this

① 인라인 이벤트 핸들러 방식 

- this는 전역 객체 window를 가리킴

 

② 이벤트 핸들러 프로퍼티 방식

- this는 이벤트에 바인딩된 요소를 가리킴 

- 이벤트 객체의 currentTarget 프로퍼티와 동일

 

③ addEventListener 메소드 방식

- this는 이벤트 리스너에 바인딩된 요소를 가리킴

- 이벤트 객체의 currentTarget 프로퍼티와 동일

 

 

 

5) 이벤트 흐름

계층적 구조에 포함되어있는 HTML 요소에 이벤트 발생 시 연쇄적인 반응이 일어난다.

이벤트가 전파되는데, 그 방향에 따라 버블링과 캡처링으로 구분된다.

 

ㅇ 버블링: 한 요소에 이벤트 발생 시 요소가 할당된 핸들러가 동작하고, 부모 요소의 핸들러가 동작하고 ... 최상단 부모 요소를 만날 때까지 반복하여 핸들러가 동작 (최하위에서 최상위까지 반복하여 핸들러 동작)

ㅇ 캡처링: 최상위 태그에서 해당 태그를 찾아서 내려가는 흐름

 

※ 버블링과 캡처링은 둘 중 하나만 발생하는 것이 아니라, 캡처링부터 시작하여 버블링으로 종료한다.

→ 이벤트 발생 시 캡처링과 버블링은 순차적으로 발생한다.

 

ㅇ addEventListener 메소드의 세 번째 매개변수에 true 설정 시 캡처링으로 전파되는 이벤트를 캐치, false로 설정 시 버블링으로 전파되는 이벤트를 캐치한다. (Default : false)

 

 

 

 

6) Event객체

Event객체는 이벤트를 발생시킨 요소와 발생한 이벤트에 대한 정보를 제공한다. 이벤트 발생 시 event 객체는 동적으로 생성되어 이벤트 핸들러에 인자로 전달된다. (암묵적 전달)

 

① Event Property

- Event.target : 실제로 이벤트를 발생시킨 요소를 가리킴

- Event.currentTarget : 이벤트에 바인딩된 DOM 요소를 가리킴

- Event.type : 발생한 이벤트의 종류를 나타내는 문자열 반환

- Event.cancelable : 요소의 기본 동작을 취소시킬 수 있는지 여부를 나타냄 (ture/false)

- Event.eventPhase : 이벤트 흐름 상 어느 단계에 있는지를 반환함 ( 0 이벤트 없음 / 1 캡처링 단ㄴ계 / 2 타깃 / 3 버블링 단계)

 

② Event Delegation 

다수의 자식 요소에 각각 이벤트 핸들러를 바인딩하는 대신, 하나의 부모 요소에 이벤트 핸들러를 바인딩하는 방법.

 

③ Event Method

- Event.preventDefault() : 요소가 가지고 있는 기본 동작을 중단시키기 위한 메소드

- Event.stopPropagation(): 어느 한 요소를 이용하여 이벤트를 처리한 후 이벤트가 부모요소로 전파되는 것을 중단

 

 

 

'프로그래밍 > js' 카테고리의 다른 글

lessons 35. REST API  (0) 2023.03.23
lessons 34. Ajax  (0) 2023.03.22
lessons 31. 동기식/비동기식 처리 모델  (0) 2023.03.03
lessons 30. DOM  (0) 2023.03.02
lessons 29. 배열 고차 함수  (0) 2023.02.28