1. MouseEvent.button
마우스 이벤트 객체의 버튼 프로퍼티를 활용하면, 마우스 버튼을 눌렀을 때 일어난 이벤트에 대해서 어떤 버튼을 눌러서 일어난 이벤트인지를 정확하게 알아낼 수 있다.
값 | 내용 | MouseEvent.type | |
0 | 마우스 왼쪽 버튼 | click | 마우스 왼쪽 버튼을 눌렀을 때 |
1 | 마우스 휠 | contextmenu | 마우스 오른쪽 버튼 눌렀을 때 |
2 | 마우스 오른쪽 버튼 | dbclick | 더블클릭 (동일 버튼 두번 누르기) |
3 | X1 (일반적으로 브라우저 뒤로 가기 버튼) | mousedown | 마우스 버튼을 누른 순간 |
4 | X2 (일반적으로 브라우저 앞으로 가기 버튼) | mouseup | 마우스 버튼을 눌렀다 뗀 순간 |
동작을 하나 하더라도 여러 이벤트가 동시에 일어날 수 있다. 예를 들어 클릭을 한번 하더라도, mousedown, mouseup, click까지 3개의 이벤트가 발생하게 된다. 이렇게 동시에 일어날땐 각각의 순서에 대해서 잘 이해하는게 중요하다. 더블클릭의 경우엔 mousedown, mouseup, click, mousedown, mouseup, click, dbclick 순으로 이벤트가 발생되기 때문에 잘 생각해보자.
+ 참고로 mouseenter, mouseleave, mouseover, mouseout, mousemove 처럼 마우스 이동과 관련된 이벤트에서는 이 값이 null이나 undefined가 아니라 0이다.
2. MouseEvent.type
이벤트 타입 | 설명 |
mousedown | 마우스 버튼을 누르는 순간 |
mouseup | 마우스 버튼을 눌렀다 떼는 순간 |
click | 왼쪽 버튼을 클릭한 순간 |
dblclick | 왼쪽 버튼을 빠르게 두 번 클릭한 순간 |
contextmenu | 오른쪽 버튼을 클릭한 순간 |
mousemove | 마우스를 움직이는 순간 |
mouseover | 마우스 포인터가 요소 위로 올라온 순간 |
mouseout | 마우스 포인터가 요소에서 벗어나는 순간 |
mouseenter | 마우스 포인터가 요소 위로 올라온 순간 (버블링이 일어나지 않음) |
mouseleave | 마우스 포인터가 요소에서 벗어나는 순간 (버블링이 일어나지 않음) |
mouseover, mouseout VS mouseenter, mouseleave
1. 버블링이 일어나지 않는다.
over에서는 해당 요소 바깥에서 안쪽으로 이동할 때도, 자식 요소 부분으로 이동할 때도 이벤트가 발생하지만, enter에서는 이벤트핸들러가 등록된 바깥 요소에서 안쪽으로 마우스가 이동할 때만 이벤트 핸들러가 동작한다.
2. 자식요소의 영역을 계산하지 않는다. (mouseenter와 mouseleave는 자식 요소의 영역을 계산하지 않는다.)
위 영상에서 mouseover는 자식요소의 영역을 구분하기 때문에 자식요소로 이동했을 때도 마우스 움직임을 카운트 했다. 반면 mouseenter는 자식요소를 구분하지 못하기 때문에 마우스를 자식요소로 움직였다 부모요소로 움직여도 움직임이 카운트 되지 않았다.
3. MouseEvent.위치프로퍼티
프로퍼티 | 설명 |
|
clientX, clientY | 마우스 포인터의 브라우저 표시 영역(이벤트가 발생한 순간에 브라우저가 콘텐츠를 표시할 수 있는 영역)에서의 위치 | client 값은 그 순간 보여지는 화면을 기준으로 계산하기 때문에 스크롤 위치와는 무관하게 항상 보여지는 화면의 좌측 상단의 모서리 위치를 (0, 0)으로 계산한다. |
pageX, pageY | 마우스 커서의 전체 문서 영역에서의 위치 | 스크롤로 인해서 보이지 않게된 화면의 영역까지 포함해서 측정한다 |
offsetX, offsetY | 마우스 포인터의 이벤트 발생한 요소(이벤트가 발생한 target이 기준)에서의 위치 | offset 값은 이벤트가 발생한 대상을 기준으로 계산하기 때문에 스크롤 위치와는 무관하게 항상 대상의 좌측 상단의 모서리 위치를 (0, 0)으로 계산한다. |
screenX, screenY | 마우스 포인터의 모니터 화면 영역에서의 위치 |
const box1 = document.querySelector('#box1');
function onMouseMove(e) {
console.log(`client: (${e.clientX}, ${e.clientY})`);
console.log(`page: (${e.pageX}, ${e.pageY})`);
console.log(`offset: (${e.offsetX}, ${e.offsetY})`);
console.log('------------------------------------');
}
box1.addEventListener('mousemove', onMouseMove);
어느 일정한 위치에 도달했을 때 이벤트를 발생시키거나, 마우스가 이동한 방향을 파악하는데 활용하거나 할 수 있다.
4. MouseEvent.relatedTarget
mouseenter, mouseleave, mouseover, mouseout 이벤트에는 relatedTarget이라는 프로퍼티가 존재하는데 target 프로퍼티가 이벤트가 발생한 요소를 담고 있다면, relatedTarget 프로퍼티는 이벤트가 발생하기 직전(또는 직후)에 마우스가 위치해 있던 요소를 담고 있다.
const box2 = document.querySelector('#box2');
function printEventData(e) {
console.log('event:', e.type);
console.log('target:', e.target);
console.log('relatedTarget:', e.relatedTarget);
console.log('------------------------------------');
if (e.target.classList.contains('cell')) {
e.target.classList.toggle('on');
}
}
box2.addEventListener('mouseover', printEventData);
box2.addEventListener('mouseout', printEventData);
console창을 보면 relatedTarget은 cell-4 target은 box2이다. event는 mouseover이니, 종합해보면 cell-4에서 box2로 마우스가 이동했다는걸 알 수 있다.
그리고 이 창을 보면, relatedTarget은 body, target은 box2이고, event는 mouseout이다. 종합해보면 box에서 body로 마우스가 이동했다는걸 알 수 있다.
event가 mouseover일때는 마우스가 이동하기 직전의 요소, mousout 일때는 마우스가 이동한 직후의 요소를 담고있는걸 확인할 수 있다.
5. KeyboardEvent.type
이벤트 타입 | 설명 |
keydown | 키보드의 버튼을 누르는 순간 |
keypress | 키보드의 버튼을 누르는 순간 ('a', '5' 등 출력이 가능한 키에서만 동작하며, Shift, Esc 등의 키에는 반응하지 않음) |
keyup | 키보드의 버튼을 눌렀다 떼는 순간 |
keypress는 웹 표준에서 권장하는 이벤트는 아니기 때문에 keypress 보다 keydown 사용을 추천한다.
6. KeyboardEvent.key vs KeyboardEvent.code
키보드 이벤트 객체에는 key와 code 프로퍼티가 자주 사용되는데 key는 사용자가 누른 키가 가지고 있는 값을 나타내고 code는 누른 키의 물리적인 위치를 나타낸다.
7. input 태그 다루기
이벤트 타입 | 설명 |
focusin | 요소에 포커스가 되는 순간 |
focusout | 요소에 포커스가 빠져나가는 순간 |
focus | 요소에 포커스가 되는 순간 (버블링이 일어나지 않음) |
blur | 요소에 포커스가 빠져나가는 순간 (버블링이 일어나지 않음) |
change | 입력된 값이 바뀌는 순간 (입력이 시작되기 전 값과 완료된 후 값 사이에 차이가 있을 때 발생, focusout될 때 입력이 완료되었다고 생각해 focusout 직전에 change 이벤트가 발생한다.) |
input | 값이 입력되는 순간 (esc나 shift 같이 값이 입력되는것이랑 상관 없는 key에는 반응하지 않는다) |
select | 입력 양식의 하나가 선택되는 순간 |
submit | 폼을 전송하는 순간 |
8. 스크롤 이벤트
scroll 이벤트는 보통 window 객체에 이벤트 핸들러를 등록하고 window 객체의 프로퍼티와 함께 자주 활용된다.
function printEvent(e) {
console.log(window.scrollY);
};
window.addEventListener('scroll', printEvent);
특히 scrollY 프로퍼티를 활용하면 스크롤된 특정한 위치를 기준으로 이벤트 핸들러가 동작하게 하거나 혹은 스크롤 방향(위로 스크롤 중인지/아래로 스크롤 중인지)을 기준으로 이벤트 핸들러가 동작하게끔 활용할 수도 있다.
'코린이 개념잡기 > JavaScript' 카테고리의 다른 글
Falsy & Truthy (1) | 2024.12.15 |
---|---|
새로운 데이터 타입과 특징 (1) | 2024.12.15 |
어떤 이벤트들이 있을까? (0) | 2024.12.14 |
자바스크립트 이벤트 (0) | 2024.12.14 |
console.log와 console.dir의 차이 (0) | 2024.12.13 |