[Deep Dive] 40. 이벤트(1)

김현주·2022년 7월 22일
0

Deep Dive

목록 보기
9/10
post-thumbnail

1. 이벤트 드리븐 프로그래밍

  • 브라우저는 처리해야 할 특정 사건이 발생하면 이를 감지하여 이벤트(event)를 발생시킨다.
    예) 클릭, 키보드 입력, 마우스이동 등
  • 이벤트 핸들러(event handler) : 이벤트가 발생했을 때 호출될 함수
  • 이벤트 핸들러 등록 : 이벤트가 발생했을 때 브라우저에게 이벤트 핸들러의 호출을 위임하는 것
  • 이벤트 드리븐 프로그래밍(event-driven programming) : 프로그램의 흐름을 이벤트 중심으로 제어하는 프로그래밍 방식
    예) JQuery

2. 이벤트 타입

  • 이벤트 타입(event type) : 이벤트의 종류를 나타내는 문자열

① 마우스 이벤트

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

② 키보드 이벤트

이벤트 타입이벤트 발생 시점
keydown모든 키를 눌렀을 때 발생
keypress모든 키를 눌렀을 때 연속적으로 발생
keyup누르고 있던 키를 놓았을 때 한 번만 발생

③ 포커스 이벤트

이벤트 타입이벤트 발생 시점
focusHTML 요소가 포커스를 받았을 때(버블링X)
blurHTML 요소가 포커스를 잃었을 때(버블링X)
focusinHTML 요소가 포커스를 받았을 때(버블링O)
focusoutHTML 요소가 포커스를 받았을 때(버블링O)

④ 폼 이벤트

이벤트 타입이벤트 발생 시점
submit1. form 요소 내의 input(text, checkbox, radio), select 입력필드(textarea 제외)에서 엔터키를 눌렀을 때
2. form 요소 내의 submit 버튼(<button>, <input type="submit">)을 클릭했을 때
(단, submit이벤트는 form 요소에서 발생)
resetform 요소 내의 reset 버튼을 클릭했을 때(최근에는 사용X)

⑤ 값 변경 이벤트

이벤트 타입이벤트 발생 시점
inputinput(text, checkbox, radio), select, textarea 요소의 값이 입력되었을 때
changeinput(text, checkbox, radio), select, textarea 요소의 값이 변경되었을 때
(단, change이벤트는 input이벤트와 달리 HTML요소가 포커스를 잃었을 때 사용자 입력이 종료되었다고 인식하여 발생
사용자가 입력중 → input, 사용자입력이 종료되어 값이 변경 → change)
readystatechangeHTML 문서의 로드와 파싱 상태를 나타내는 document.readyState 프로퍼티 값('loading', 'interactive', 'complete')이 변경될 때

⑥ DOM 뮤테이션 이벤트

이벤트 타입이벤트 발생 시점
DOMContentLoadedHTML 문서의 로드와 파싱이 완료되어 DOM 생성이 완료되었을 때

⑦ 뷰 이벤트

이벤트 타입이벤트 발생 시점
resize브라우저 윈도우(window)의 크기를 리사이즈할 때 연속적으로 발생
scroll웹페이지(document) 또는 HTML 요소를 스크롤할 때 연속적으로 발생

⑧ 리소스 이벤트

이벤트 타입이벤트 발생 시점
loadDOMContentLoaded 이벤트가 발생한 이후, 모든 리소스(이미지, 폰트 등)의 로딩이 완료되었을 때 (주로 window객체에서 발생)
unload리소스가 언로드될 때(주로 새로운 웹페이지를 요청한 경우)
abort리소스 로딩이 중단되었을 때
error리소스 로딩이 실패했을 때

3. 이벤트 핸들러 등록

  • 이벤트 핸들러(event handler 또는 event listener) : 이벤트가 발생했을 때 브라우저에 호출을 위임한 함수
  • 이벤트 핸들러 등록 : 이벤트가 발생했을 때 브라우저에게 이벤트 핸들러의 호출을 위임하는 것

① 이벤드 핸들러 어트리뷰트 방식 (권장하는 방식X)

<body>
  <!-- 이벤트 핸들러에 인수를 전달하기 곤란하다. -->
  <button onclick="sayHi('Lee")">Click me!</button>
  <script>
    function sayHi(name){
      console.log(`Hi! ${name}.`);
    }
  </script>
</body>
  • 위 예제에서는 이벤트 핸들러 어트리뷰트 값으로 함수 호출문을 할당했다.
    이때 이벤트 핸들러 어트리뷰트 값은 사실 암묵적으로 생성될 이벤트 핸들러의 함수 몸체를 의미한다.
  • HTML과 자바스크립트는 관심사가 다르므로 혼재하는 것보다 분리하는 것이 좋다.

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

  • 이벤트 핸들러 프로퍼티에 함수를 바인딩하면 이벤트 핸들러가 등록된다.
  • 이벤트 핸들러 어트리뷰트 방식의 HTML과 자바스크립트가 뒤섞이는 문제를 해결할 수 있지만, 이벤트 핸들러 프로퍼티에 하나의 이벤트 핸들러만 바인딩 할 수 있다는 단점이 있다.
<body>
  <button>Click me!</button>
  <script>
    const $button = document.querySelector('button');
    
    // * 이벤트 핸들러 프로퍼티에 이벤트 핸들러를 바인딩
    // * 첫 번째로 바인딩된 이벤트 핸들러는 두 번째 바인딩된 이벤트 핸들러에 의해 
    // 재할당되어 실행되지않는다.
    $button.onclick = function() {
      console.log('button clicked 1');
    };
    // * 두번째로 바인딩된 이벤트 핸들러
    $button.onclick = function() {
      console.log('button clicked 2');
    };
  </script>
</body>

③ addEventListener 메서드 방식

  • addEventListener 메서드 방식은 이벤트 핸들러 프로퍼티에 바인딩된 이벤트 핸들러에 아무런 영향을 주지않는다.
  • addEventListener 메서드를 통해 참조가 동일한 이벤트 핸들러를 중복 등록하면 하나의 이벤트 핸들러만 등록된다.
<body>
  <button>Click me!</button>
  <script>
    const $button = document.querySelector('button');
    
    const handleClick = () => console.log('button click');

    $button.addEventListener('click', handleClick);
    $button.addEventListener('click', handleClick);
  </script>
</body>

4. 이벤트 핸들러 제거

  • addEventListener 메서드로 등록된 이벤트 핸들러를 제거하려면 EventTarget.prototype.removeEventListener 메서드를 사용한다.
  • 단, addEventListener 메서드에 전달한 인수와 removeEventListener 메서드에 전달한 인수가 일치하지 않으면 이벤트 핸들러가 제거되지 않는다.
<body>
  <button>Click me!</button>
  <script>
    const $button = document.querySelector('button');
    
    const handleClick = () => console.log('button click');

    // * 이벤트 핸들러 등록
    $button.addEventListener('click', handleClick);
    
    // * 이벤트 핸들러 제거
    $button.removeEventListener('click', handleClick, true); // 실패
    $button.removeEventListener('click', handleClick); // 성공
  </script>
</body>

5. 이벤트 객체

  • 이벤트가 발생하면 이벤트에 관련한 다양한 정보를 담고 있는 이벤트 객체가 동적으로 생성되는데 생성된 이벤트 객체는 이벤트 핸들러의 첫 번째 인수로 전달된다.
<body>
  <p>클릭하세요. 클릭한 곳의 좌표가 표시됩니다.</p>
  <em class="message"></em>
  <script>
    const $msg = document.querySelector('.message');
    
    // 매개변수 e에 암묵적으로 할당
    function showCoords(e) {
      $msg.textContent = `clientX: ${e.clientX}, clientY: ${e.clientY}`
    }
    
    document.onClick = showCoords;
  </script>
</body>

profile
✨프론트엔드 개발자가 되기 위한 독학러✨

0개의 댓글