드디어 이 두꺼운 책의 끝이 보인다...!
이벤트 드리븐 프로그래밍
브라우저는 처리해야할 사건이 발생하면 감지해 이벤트를 발생시킨다.
이벤트가 발생했을 때 호출된 함수를 이벤트 핸들러라 하고, 이벤트가 발생했을 때 브라우저에게
이벤트 핸들러의 호출을 위임하는 것을 이벤트 핸들러 등록이라 한다.
이벤트와 그에 대응하는 함수(이벤트 핸들러)를 통해 사용자와 애플리케이션은 상호작용이 가능하다.
이와 같이 프로그램의 흐름을 이벤트 중심으로 제어하는 프로그래밍 방식을
이벤트 드리븐 프로그래밍이라 한다.
이벤트 타입
마우스 이벤트
이벤트 타입 | 이벤트 발생 시점 |
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단계로 구분할 수 있다.
- 캡처링 단계 : 이벤트가 상위 요소에서 하위 요소 방향으로 전파
- 타킷 단계 : 이벤트가 이벤트 타깃에 도달
- 버블링 단계 : 이벤트가 하위 요소에서 상위 요소 방향으로 전파
'Archive > Develop' 카테고리의 다른 글
[ 모던 자바스크립트 스터디 ] 비동기 프로그래밍 (0) | 2022.11.05 |
---|---|
[ 모던 자바스크립트 스터디 ] 타이머 (0) | 2022.11.05 |
[ 모던 자바스크립트 스터디 ] DOM (0) | 2022.11.03 |
[ 모던 자바스크립트 스터디 ] 브라우저의 렌더링 과정 (0) | 2022.11.01 |
[ 모던 자바스크립트 스터디 ] Map (0) | 2022.10.31 |