이벤트 핸들러를 다루기 전에 알아야 할 이벤트 핸들러의 중요한 속성은, 모든 이벤트 핸들러 함수에는 첫번째 인자(parameter)로 자기 자신 Event
객체가 들어간다. 주로 사용하는 이름은 e
나 event
이다. (python의 class method와 비슷)
<[tag명] [이벤트 속성]="[js 동작 코드]">
html 문서 내부에서 이벤트 속성
을 통하여 이벤트 핸들러를 등록할 수 있으나 일반적으로 권장되는 방법은 아니다.
[요소].[이벤트 속성] = [이벤트 핸들러 함수]
DOM에서 얻어낸 요소 Node에 이벤트 속성
property에 이벤트 핸들러(함수)를 할당하여 설정할 수 있다. 다만 기존의 핸들러를 활용하기는 어렵다.
[요소].addEventListener([이벤트 이름], [이벤트 핸들러 함수])
[요소].removeEventListener([이벤트 이름], [이벤트 핸들러 함수])
주로 쓰이는 방식이며 DOM의 method를 이용하여 이벤트 핸들러(함수)를 추가하고 삭제한다.
이벤트 이름
은 문자열이다.이벤트 핸들러 함수
는 미리 선언해 둔 뒤에 이름으로 전달하라. 익명 함수의 경우엔 나중에 removeEventListener
로 삭제할 수 없다.웹 페이지에서 이벤트가 발생하면 자동적으로 Event
객체가 만들어진다.
이벤트 핸들러 함수에 자동적으로 들어가는 첫 인자(parameter)가 바로 Event
객체이다.
[이벤트 객체].[property 이름]
아래는 주로 쓰는 property를 일부 적어놓았다.
type
: 이벤트 이름 (property name) target
: (처음) 이벤트가 발생한 요소. bubbling의 영향을 받지 않는다. (DOM의 요소 Node로 반환)currentTarget
: 현재 이벤트가 발생한 요소. 정확히는 처음 이벤트 핸들러가 등록된 요소라고 생각하면 편하다. (DOM의 요소 Node로 반환)timeStamp
: 브라우저라 로드된 시간부터의 time stampbubbles
: 버블링 단계인지 나타내는 Boolean 값relatedTarget
: 마우스 이벤트의 2차 대상(이벤트가 발생하기 직전 or 직후에 위치해 있던 요소) (주로 이동 경로 파악에 사용)button
: 누른 마우스의 버튼 종류offsetX
, offsetY
: 이벤트 발생한 요소 기준 위치pageX
, pageY
: 문서 영역에서의 위치 (html 요소)clientX
, clientY
: 브라우저 창 기준 위치screenX
, screenY
: 모니터 화면 기준 위치altKey
: 이벤트 발생 시 alt
키를 누르고 있었는지 나타내는 Boolean 값ctrlKey
: 이벤트 발생 시 ctrl
키를 누르고 있었는지 나타내는 Boolean 값shiftKey
: 이벤트 발생 시 shift
키를 누르고 있었는지 나타내는 Boolean 값metaKey
: 이벤트 발생 시 meta키를 누르고 있었는지 나타내는 Boolean 값 (window는 window
, mac은 cmd
)key
: 누른 키가 가지고 있는 값code
: 누른 키의 물리적 위치 값 (qwerty 기반)altKey
: 이벤트 발생 시 alt
키를 누르고 있었는지 나타내는 Boolean 값ctrlKey
: 이벤트 발생 시 ctrl
키를 누르고 있었는지 나타내는 Boolean 값shiftKey
: 이벤트 발생 시 shift
키를 누르고 있었는지 나타내는 Boolean 값metaKey
: 이벤트 발생 시 meta키를 누르고 있었는지 나타내는 Boolean 값 (window는 window
, mac은 cmd
)아래는 주로 쓰는 method를 일부 적어놓았다.
[이벤트 객체].stopPropagation()
bubbling을 멈춘다.
[이벤트 객체].preventDefault()
태그 별 기본적인 동작을 막는다.
아래는 주로 사용되는 이벤트 일부를 작성해 두었다. 모든 이벤트가 궁금하다면 mdn 문서를 참고하라.
scroll
요소가 스크롤 되는 이벤트.
window
객체의 scrollX
, scrollY
등의 property와 자주 사용된다.
resize
창의 크기가 바뀌는 이벤트
input
input
, select
, textarea
에 요소가 입력/변경되는 이벤트
change
input
, select
, textarea
에 요소가 변경되는 이벤트. 입력이 시작되었을 때와 입력이 완료되었을 때 (focusout
, enter 등) 변화가 있으면 발생한다. 정확한 내용은 여기를 참고하라.
select
입력 양식이나 텍스트를 선택하는 이벤트.
submit
form
요소가 제출되는 이벤트.
storage
웹 스토리지(sessionStorage
, localStorage
)가 변경되는 이벤트. Web Storage에 대한 내용은 여기를 참고.
Event
객체를 상속 받는다.
UIEvent
객체를 상속 받는다.
마우스 관련 이벤트.
click
마우스의 기본 버튼(MouseEvent.button
에서 0 버튼. 주로 좌클릭)을 눌렀다 떼는 이벤트. mousedown
과 mouseup
이 둘 다 일어난 후에 발생한다. mousedown
과 mouseup
이 발생한 요소가 다를 경우 두 요소의 가장 가까운 공통 조상에서 click
이벤트가 일어난다.
dblclick
마우스의 기본 버튼(MouseEvent.button
에서 0 버튼. 주로 좌클릭)을 더블 클릭(click
)하는 이벤트
mousedown
마우스를 누르는 이벤트
mouseup
마우스를 (눌렀다) 떼는 이벤트
mousemove
마우스를 움직이는 이벤트
mouseover
마우스 포인터가 요소 위에 올라오는 이벤트 (자식 요소도 개별로 감지)
mouseout
마우스 포인터가 요소에서 벗어나는 이벤트 (자식 요소도 개별로 감지)
mouseenter
마우스 포인터가 요소 위에 올라오는 이벤트 (버블링이 일어나지 않음)
mouseleave
마우스 포인터가 요소에서 벗어나는 이벤트 (버블링이 일어나지 않음)
MouseEvent
객체를 상속 받는다.
contextmenu
UIEvent
객체를 상속 받는다.
키보드 관련 이벤트.
keydown
키보드의 키를 누르는 이벤트
keyup
키보드의 키를 (눌렀다) 떼는 이벤트
UIEvent
객체를 상속 받는다.
focusin
요소가 포커스를 받았을 때의 이벤트.
focusout
요소가 포커스를 잃을 때의 이벤트.
focus
요소가 포커스를 받았을 때의 이벤트. (버블링이 일어나지 않음)
blur
요소가 포커스를 잃을 때의 이벤트. (버블링이 일어나지 않음)
이벤트는 캡쳐링 > 타겟 > 버블링 순으로 일어난다.
간단히 말해서
한 요소에 이벤트가 발생했을 때 그 이벤트가 부모 요소들부터 타고 타겟(target)까지 전파되는 현상을 말한다.
window
객체부터 시작하여 Document
객체를 거쳐 부모 > 자식 순으로 내려간다.
[요소].addEventListener([이벤트 이름], [함수], true)
형태로 추가하면 된다.이벤트가 발생한 요소 Node.
[이벤트 객체].target
으로 접근하였을 때 반환되는 요소가 바로 이 이벤트 target이다. 후술할 bubbling이 일어나도 target은 변하지 않는다.한 요소에 이벤트가 발생했을 때 그 이벤트가 부모 요소들에게 전파(propagation)되는 현상을 말한다.
자식 > 부모 순으로 Document
객체와 window
객체까지 거슬러 올라간다.
[이벤트 객체].stopPropagation()
를 활용하면 된다.앞서 말한 이벤트 버블링(혹은 캡쳐링)을 활용하여 이벤트가 발생한 target이 아닌 상위 노드에서 이벤트를 catch해 이벤트를 핸들링하는 것을 말한다.