[ 모던 자바스크립트 스터디 ] 이벤트

2022. 11. 5. 18:23·Archive/Develop
목차
  1. 이벤트 드리븐 프로그래밍
  2. 이벤트 타입
  3. 마우스 이벤트
  4. 키보드 이벤트
  5. 포커스 이벤트
  6. 폼 이벤트
  7. 값 변경 이벤트
  8. DOM 뮤테이션
  9. 이벤트 핸들러 등록
  10. 이벤트 핸들러 어트리뷰트 방식
  11. 이벤트 핸들러 프로퍼티 방식
  12. addEventListener 메서드 방식
  13. 이벤트 핸들러 제거
  14. 이벤트 객체
  15. 이벤트 전파
728x90
반응형

드디어 이 두꺼운 책의 끝이 보인다...!

 

 

이벤트 드리븐 프로그래밍

 

브라우저는 처리해야할 사건이 발생하면 감지해 이벤트를 발생시킨다.

이벤트가 발생했을 때 호출된 함수를 이벤트 핸들러라 하고, 이벤트가 발생했을 때 브라우저에게

이벤트 핸들러의 호출을 위임하는 것을 이벤트 핸들러 등록이라 한다.

 

이벤트와 그에 대응하는 함수(이벤트 핸들러)를 통해 사용자와 애플리케이션은 상호작용이 가능하다.

이와 같이 프로그램의 흐름을 이벤트 중심으로 제어하는 프로그래밍 방식을

이벤트 드리븐 프로그래밍이라 한다.

 

 

이벤트 타입

 

마우스 이벤트

 

이벤트 타입 이벤트 발생 시점
click 마우스 버튼 클릭
dbclick 마우스 더블클릭
mousedown 마우스 버튼 눌렀을 때
mouseup 누르고 있던 마우스 버튼 놓았을 때
mousemove 마우스 커서 움직일 때
mouseenter 마우스 커서를 HTML 요소안으로 이동했을 때(버블링x)
mouseover 마우스 커서 HTML 요소안으로 이동했을 때(버블링O)

 

키보드 이벤트

 

keydown : 모든 키 눌렀을 때 (문자, 특수 문자, enter 키는 연속발생 그 외는 한번 발생)

keypress : 문자 키 눌렀을 때 연속 발생

keyup : 누르고 있던 키 놓았을 때

 

포커스 이벤트

 

focus : 포커스 받았을 때 (버블링x)

blur : 포커스 잃었을 때 (버블링x)

focusin : 포커스 받았을 때(버블링o)

focusout : 포커스 잃었을 때 (버블링o)

 

 

폼 이벤트

 

submit

reset : 최근 사용 x, reset 버튼 클릭했을 때

 

 

값 변경 이벤트

 

input : input, select, textarea 요소 값이 입력되었을 때

change : input 요소 값이 변경되었을 때

readystatechange : HTML 문서의 로드와 파싱 상태를 나타내는 document.readyState 프로퍼티값이 변경될 때

 

 

DOM 뮤테이션

 

DOMContentLoaded : DOM 생성이 완료되었을 때

 

 

 

이벤트 핸들러 등록

 

이벤트가 발생했을 때 브라우저에 이벤트 핸들러의 호출을 위임하는 것을 이벤트 핸들러 등록이라 한다.

이 방법은 3가지다.

 

 

이벤트 핸들러 어트리뷰트 방식

 

<button onclick="sayHi('Hong')">Click!</button>
<script>
	function sayHi(name) {
    	console.log(`Hi! ${name}.`);
    }
</script>

 

이벤트 핸들러 어트리뷰트의 이름은 on 접두사와 이벤트 종류를 나타내는 이벤트 타입으로 이루어져있다.

주의할 점은 이벤트 핸들러 어트리뷰트 값으로 함수 참조가 아닌 함수 호출문 등의 문을 할당한다는 것이다.

 

이벤트 핸들러 어트리뷰트 값은 사실 암묵적으로 생성될 이벤트 핸들러의 함수 몸체를 의미한다.

onclick="sayHi('Hong')" 어트리뷰트는 파싱되어 아래와 같은 함수를 암묵적으로 생성한다.

이후 이벤트 핸들러 어트리뷰트 이름과 동일한 키 onclick 이벤트 핸들러 프로퍼티에 할당한다.

 

function onclick(event) {
  sayHi('Hong');
}

 

 

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

 

window 객체와 Document, HTMLElement 타입의 DOM 노드 객체는

이벤트에 대응하는 이벤트 핸들러 프로퍼티를 가지고 있다.

 

이벤트 핸들러 프로퍼티의 키는 이벤트 핸들러 어트리뷰트와 마찬가지로 onclick 과 같이

on 접두사와 이벤트의 종류를 나타내는 이벤트 타입으로 이루어져있다.

 

<script>
	const $button = document.querySelector('button');
    
    $button.onclick = function () {
    	console.log('button click');
    };
</script>

 

이벤트 핸들러는 대부분 이벤트를 발생시킬 이벤트 타깃에 바인딩한다.

하지만 반드시 이벤트 타깃에 이벤트 핸들러를 바인딩해야 하는 것은 아니다.

이벤트 핸들러는 이벤트 타깃 또는 전파된 이벤트를 캐치할 DOM 노드 객체에 바인딩한다.

이 방식은 이벤트 핸들러 프로퍼티에 하나의 이벤트 핸들러만 바인딩할 수 있다는 단점이 있다.

 

 

 

addEventListener 메서드 방식

 

EventTarget.prototype.addEventListener 메서드를 사용해 이벤트 핸들러를 등록할 수 있다.

 

<script>
	const $button = document.querySelector('button');
    
    $button.addEventListener('click', function() {
    	console.log('btn click');
    });
</script>

 

이벤트 핸들러 제거

 

EventTarget.prototype.removeEventListener 를 사용한다.

인수는 이전에 설명한 addEventListener과 동일하다.

단, addEventListener메서드에 전달한 인수와 removeEventListener 메서드에 전달한 인수가 일치해야만 지워진다.

 

<script>
	const $button = document.querySelector('button');
    const handleClick = () => console.log('btn click');
    
    $button.addEventListener('click', handleClick);
    
    $button.removeEventListener('click', handleClick, true); // 실패
    $button.removeEventListener('click', handleClick); // 성공
</script>

 

 

무명함수를 이벤트 핸들러로 등록한 경우는 제거할 수 없다.

이벤트 핸들러 프로퍼티 방식으로 등록한 이벤트 핸들러는 null을 할당하여 지울 수 있다.

 

<script>
	const $button = document.querySelector('button');
    const handleClick = () => console.log('btn click');
    
    $button.onclick = handleClick;
    $button.onclick = null; // 삭제

</script>

 

 

이벤트 객체

 

이벤트가 발생하면 이벤트에 관련된 다양한 정보를 담고 있는 이벤트 객체가 동적으로 생성된다.

생성된 이벤트 객체는 이벤트 핸들러의 첫번째 인수로 전달된다.

 

<body>
  <p>클릭시 좌표 표시</p>
  <em class="message"></em>
  <script>
  	const $msg = document.querySelector('.message');
    
    function showCoords(e) {
    	$msg.textContent = `clientX: ${e.clientX}`;
    }
    
    document.onclick = showCoords;
  </script>
</body>

 

이벤트 핸들러 어트리뷰트 방식으로 받는다면 아래와 같이 이벤트 객체를 전달받을 수 있다.

 

<body onclick="showCoords(event)">

 

이벤트 핸들러 어트리뷰트 방식의 경우 무조건 이름이 event 여야한다.

 

 

이벤트 전파

 

DOM 트리 상에 존재하는 DOM 요소 노드에서 발생한 이벤트는 DOM 트리를 통해 전파된다.

이를 이벤트 전파라고 한다.

 

이벤트 객체는 이벤트를 발생시킨 DOM 요소인 이벤트 타깃을 중심으로 DOM 트리를 통해 전파된다.

이벤트 전파는 이벤트 객체가 전파되는 방향에 따라 3단계로 구분할 수 있다.

 

 

  • 캡처링 단계 : 이벤트가 상위 요소에서 하위 요소 방향으로 전파
  • 타킷 단계 : 이벤트가 이벤트 타깃에 도달
  • 버블링 단계 : 이벤트가 하위 요소에서 상위 요소 방향으로 전파

 

 

728x90
반응형

'Archive > Develop' 카테고리의 다른 글

[ 모던 자바스크립트 스터디 ] 비동기 프로그래밍  (0) 2022.11.05
[ 모던 자바스크립트 스터디 ] 타이머  (0) 2022.11.05
[ 모던 자바스크립트 스터디 ] DOM  (0) 2022.11.03
[ 모던 자바스크립트 스터디 ] 브라우저의 렌더링 과정  (0) 2022.11.01
[ 모던 자바스크립트 스터디 ] Map  (0) 2022.10.31
  1. 이벤트 드리븐 프로그래밍
  2. 이벤트 타입
  3. 마우스 이벤트
  4. 키보드 이벤트
  5. 포커스 이벤트
  6. 폼 이벤트
  7. 값 변경 이벤트
  8. DOM 뮤테이션
  9. 이벤트 핸들러 등록
  10. 이벤트 핸들러 어트리뷰트 방식
  11. 이벤트 핸들러 프로퍼티 방식
  12. addEventListener 메서드 방식
  13. 이벤트 핸들러 제거
  14. 이벤트 객체
  15. 이벤트 전파
'Archive/Develop' 카테고리의 다른 글
  • [ 모던 자바스크립트 스터디 ] 비동기 프로그래밍
  • [ 모던 자바스크립트 스터디 ] 타이머
  • [ 모던 자바스크립트 스터디 ] DOM
  • [ 모던 자바스크립트 스터디 ] 브라우저의 렌더링 과정
코뮤(commu)
코뮤(commu)
코딩으로 커뮤니케이션하는 코뮤입니다 😎
  • 코뮤(commu)
    코뮤(COMMU)
    코뮤(commu)
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Archive
        • Hacking
        • Develop
        • ETC
      • Algorithm
      • DB&Infra
      • ETC
      • Node
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • IT지식보따리
    • IT가 맛있다
    • IT 천재
  • 공지사항

    • 배고픕니다
  • 인기 글

  • 태그

    자바스크립트 객체
    코드업 기초
    파이썬 기초 문제
    Git
    자바스크립트
    오라클
    파이썬
    docker
    자바스크립트 API
    oracle db
    파이썬 기초
    Codeup
    파이썬 백준
    백준 풀이
    C++
    백준
    백준 문제풀이
    비박스
    장고
    카카오 100일 프로젝트
    파이썬 알고리즘
    코드업
    Python
    코드업 파이썬 기초 100제
    javascript
    Django
    파이썬 문제
    백준 파이썬
    보안뉴스
    Oracle
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
코뮤(commu)
[ 모던 자바스크립트 스터디 ] 이벤트
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.