맨위로가기

DOM 이벤트

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

DOM 이벤트는 웹 페이지에서 사용자 상호 작용 및 기타 동작을 감지하고 대응하기 위한 기술을 의미한다. 이들은 다양한 종류로 분류되며, HTML 요소에서 발생하는 일반 이벤트, 터치 스크린 장치에서 사용되는 터치 이벤트, 마우스, 펜 등 다양한 입력 장치를 통합하는 포인터 이벤트, 웹 애플리케이션 개발자가 다양한 플랫폼에서 표준 사용자 상호 작용 이벤트를 지원하도록 돕는 Indie UI 이벤트 등이 있다.

DOM 이벤트는 이벤트 흐름, 이벤트 객체, 그리고 다양한 이벤트 처리 모델을 통해 구현된다. 이벤트 흐름은 캡처링, 타겟, 버블링 단계를 거치며, 이벤트 객체는 이벤트의 세부 정보를 제공한다. DOM Level 0, DOM Level 2, 인터넷 익스플로러 고유 모델 등 다양한 이벤트 처리 모델이 존재하며, 각 모델은 이벤트 등록, 제거, 중단 및 취소 방식에 차이를 보인다.

더 읽어볼만한 페이지

  • 이벤트 (컴퓨팅) - 메시지 큐
    메시지 큐는 프로세스나 스레드 간 비동기 통신을 제공하여 송신자와 수신자가 동시에 상호 작용할 필요 없이 메시지를 교환하도록 하며, 메시지는 수신자가 검색할 때까지 저장되고 시스템 장애 시 복원력을 제공하지만 보안 취약점, 특정 기업 종속성 등의 논란도 존재한다.
  • 이벤트 (컴퓨팅) - 비동기 입출력
    비동기 입출력은 입출력 완료를 기다리지 않고 다른 작업을 처리하는 방식으로, 완료 시 콜백이나 시그널을 통해 결과를 알려주어 효율적인 자원 활용과 성능 향상을 가져다준다.
  • W3C 표준 - HTML
    HTML은 웹 페이지 제작을 위한 표준 마크업 언어로서, 팀 버너스리가 제안하고 구현한 후 인터넷 발전과 함께 널리 사용되며, SGML에 기반하여 하이퍼텍스트 기능으로 다양한 콘텐츠를 표현하고 연결하며, W3C와 WHATWG에서 표준화를 진행하고 최신 버전은 HTML Living Standard이다.
  • W3C 표준 - 타임드 텍스트
    타임드 텍스트는 영상이나 오디오 콘텐츠에 시간 정보를 담아 표현되는 텍스트로, 자막이나 캡션 등에 활용되며 TTML, WebVTT 등의 표준이 존재한다.
  • API - Tk (소프트웨어)
    Tk는 Tcl 스크립팅 언어의 크로스 플랫폼 GUI 툴킷으로, 다양한 플랫폼 이식과 여러 프로그래밍 언어 바인딩을 지원하며 사용자 정의 가능한 위젯들을 제공한다.
  • API - ASIO
    ASIO는 독일 스타인버그에서 개발한 오디오 입출력 API 규격으로, 낮은 지연 시간과 멀티 채널 I/O를 지원하며 윈도우 운영체제에서 주로 사용된다.
DOM 이벤트
개요
유형사건 (Event)
하위 유형사용자 인터랙션, 상태 변경
관련 기술DOM, JavaScript, HTML
설명DOM (Document Object Model)에서 발생하는 사건을 알리는 신호
상세 정보
목적HTML 문서 내에서 특정 사건 발생을 알려, 이에 대한 반응을 정의하고 처리할 수 있게 함
동작 원리웹 페이지에서 특정 사건(예: 클릭, 키 누름, 페이지 로드)이 발생하면, DOM은 해당 사건에 대한 정보를 담은 객체를 생성하고, 등록된 사건 처리기(Event Handler)에 전달. 사건 처리기는 해당 사건에 대해 정의된 동작을 수행
관련 인터페이스EventTarget
Event
주요 특징비동기적 동작: 사건 발생은 코드 실행 흐름과 독립적으로 발생
전파(Propagation): 특정 DOM 요소에서 발생한 사건이 DOM 트리를 따라 전파될 수 있음 (캡처링, 버블링)
활용 예시버튼 클릭 시 특정 함수 실행
폼(Form) 유효성 검사
페이지 로드 완료 후 초기화 작업 수행
장점사용자 인터랙션에 대한 동적인 반응 가능
웹 페이지의 동작 제어 및 확장 용이
단점과도한 사건 처리기 사용은 성능 저하를 유발할 수 있음
사건 전파 과정에서 의도치 않은 동작이 발생할 수 있음
주의사항메모리 누수 방지를 위해 불필요한 사건 처리기는 제거해야 함

2. 이벤트 종류

웹 브라우저에서 발생하는 이벤트는 사용자의 행동이나 브라우저의 상태 변화에 따라 다양하게 발생한다. 이러한 이벤트들은 크게 마우스, 키보드, HTML 프레임/객체, HTML 폼, 사용자 인터페이스, 변형, 진행 이벤트 등으로 분류할 수 있다.


  • 마우스 이벤트: 사용자가 마우스를 움직이거나 클릭하는 등의 행동에 따라 발생한다. 예를 들어, `click`은 요소 위에서 마우스 버튼을 클릭했을 때, `mouseover`는 마우스 포인터가 요소 위로 이동했을 때 발생한다.
  • 키보드 이벤트: 사용자가 키보드를 누르거나 뗄 때 발생한다. `keydown`, `keypress`, `keyup` 등이 있다.
  • HTML 프레임/객체 이벤트: 웹 페이지의 프레임이나 객체의 로딩 상태와 관련된 이벤트이다. `load`는 모든 콘텐츠 로딩이 완료되었을 때, `error`는 로딩 중 오류가 발생했을 때 발생한다.
  • HTML 폼 이벤트: 사용자가 폼(form) 요소를 조작할 때 발생한다. `submit`은 폼이 제출될 때, `change`는 입력 필드의 값이 변경되었을 때 발생한다.
  • 사용자 인터페이스 이벤트: `focusin`, `focusout`, `DOMActivate` 등이 있으며, 요소가 포커스를 받거나 잃을 때, 활성화될 때 발생한다.
  • 변형 이벤트: DOM(Document Object Model)의 구조가 변경될 때 발생한다. 예를 들어, `DOMNodeInserted`는 새로운 노드가 추가되었을 때 발생한다.
  • 진행 이벤트: `loadstart`, `progress`, `load` 등은 XMLHttpRequest 및 파일 API 등에서 데이터 로딩 진행 상황을 나타내는 데 사용된다.


W3C의 분류와 일치하지 않는 경우도 있으며, "DOM"으로 시작하는 이벤트는 현재 잘 지원되지 않아 W3C DOM 레벨 3에서 더 이상 사용되지 않는다.

모질라, 오페라는 ''DOMAttrModified'', ''DOMNodeInserted'', ''DOMNodeRemoved'' 및 ''DOMCharacterDataModified''를 지원한다. 크롬사파리는 ''DOMAttrModified''를 제외하고 이러한 이벤트를 지원한다.

HTML 5 사양에 추가된[13] ''DOMContentLoaded''는 이미지와 같은 관련 파일의 로딩 전에 발생하는 이벤트이다. 모질라, 오페라 9, Webkit 렌더링 엔진 빌드 500 이상[14][15], 인터넷 익스플로러 9[16] 등에서 지원하며, 구글 크롬사파리 3.1+의 모든 버전에서도 구현되었다.

오페라 9는 웹 폼 2.0 이벤트인 ''DOMControlValueChanged'', ''invalid'', ''forminput'', ''formchange''도 지원한다.

각 이벤트의 종류, 설명, 버블링 여부, 취소 가능 여부는 다음 표와 같다.

분류유형속성설명버블링취소 가능 여부
마우스clickonclick요소 위에서 포인팅 장치 버튼을 클릭했을 때 발생한다. 클릭은 동일한 화면 위치에서 mousedown과 mouseup이 발생하는 것으로 정의된다. 이러한 이벤트의 순서는 mousedown, mouseup, click 순이다.
dblclickondblclick요소 위에서 포인팅 장치 버튼을 더블클릭했을 때 발생한다.
mousedownonmousedown요소 위에서 포인팅 장치 버튼을 눌렀을 때 발생한다.
mouseuponmouseup요소 위에서 포인팅 장치 버튼을 놓았을 때 발생한다.
mouseoveronmouseover포인팅 장치가 요소 위로 이동했을 때 발생한다.
mousemove[7]onmousemove포인팅 장치가 요소 위에 있는 동안 이동했을 때 발생한다.
mouseoutonmouseout포인팅 장치가 요소에서 벗어났을 때 발생한다.
dragstartondragstart드래그가 시작될 때 요소에서 발생한다.
dragondrag이 이벤트는 드래그 작업 중에 드래그의 소스, 즉 dragstart가 발생한 요소에서 발생한다.
dragenterondragenter드래그가 진행되는 동안 마우스가 요소 위로 처음 이동했을 때 발생한다.
dragleaveondragleave드래그가 진행되는 동안 마우스가 요소에서 벗어났을 때 발생한다.아니요
dragoverondragover드래그가 진행되는 동안 마우스가 요소 위로 이동할 때 발생한다.
dropondrop드롭 이벤트는 드래그 작업이 끝날 때 드롭이 발생하는 요소에서 발생한다.
dragendondragend드래그 작업이 성공했는지 여부에 관계없이 드래그가 완료되면 드래그의 소스가 dragend 이벤트를 받는다.아니요
키보드keydownonkeydown키보드에서 키를 누르기 전에 발생한다.
keypressonkeypress키보드에서 키를 누른 후에 발생한다.
keyuponkeyup키보드에서 키를 놓았을 때 발생한다.
HTML 프레임/객체loadonload사용자 에이전트가 창, 프레임, 객체 및 이미지를 포함하여 문서 내의 모든 콘텐츠 로딩을 완료했을 때 발생한다. 요소의 경우 대상 요소와 모든 콘텐츠의 로딩이 완료되면 발생한다.아니요아니요
unloadonunload사용자 에이전트가 창 또는 프레임에서 모든 콘텐츠를 제거할 때 발생한다. 요소의 경우 대상 요소 또는 해당 콘텐츠가 제거되면 발생한다.아니요아니요
abortonabort객체/이미지가 완전히 로드되기 전에 로딩이 중지될 때 발생한다.아니요
erroronerror객체/이미지/프레임을 제대로 로드할 수 없을 때 발생한다.아니요
resizeonresize문서 보기가 크기 조정될 때 발생한다.아니요
scrollonscroll요소 또는 문서 보기가 스크롤될 때 발생한다.아니요, document의 스크롤 이벤트는 window로 버블링 되어야 한다는 예외 사항이 있다.[8]아니요
HTML 폼selectonselect사용자가 텍스트 상자를 포함하여 텍스트 필드에서 텍스트를 선택할 때 발생한다.아니요
changeonchange컨트롤이 입력 포커스를 잃고 포커스를 얻은 이후 해당 값이 수정되었을 때 발생한다.아니요
submitonsubmit폼이 제출될 때 발생한다.
resetonreset폼이 재설정될 때 발생한다.아니요
focusonfocus포인팅 장치 또는 탭 순서를 통해 요소가 포커스를 받을 때 발생한다.아니요아니요
bluronblur포인팅 장치 또는 탭 탐색을 통해 요소가 포커스를 잃을 때 발생한다.아니요아니요
사용자 인터페이스focusinHTML focus 이벤트와 유사하지만, 포커스 가능한 모든 요소에 적용될 수 있다.아니요
focusoutHTML blur 이벤트와 유사하지만, 포커스 가능한 모든 요소에 적용될 수 있다.아니요
DOMActivateXUL command 이벤트와 유사하다. 요소가 마우스 클릭 또는 키 누름과 같은 방법으로 활성화될 때 발생한다.
변형DOMSubtreeModified하위 트리가 수정될 때 발생한다.아니요
DOMNodeInserted노드가 다른 노드의 자식으로 추가되었을 때 발생한다.아니요
DOMNodeRemoved노드가 DOM 트리에서 제거되었을 때 발생한다.아니요
DOMNodeRemovedFromDocument노드가 문서에서 제거될 때 발생한다.아니요아니요
DOMNodeInsertedIntoDocument노드가 문서에 삽입될 때 발생한다.아니요아니요
DOMAttrModified속성이 수정되었을 때 발생한다.아니요
DOMCharacterDataModified문자 데이터가 수정되었을 때 발생한다.아니요
진행loadstart진행이 시작되었다.아니요아니요
progress진행 중이다. loadstart가 디스패치된 후이다.아니요아니요
error진행에 실패했다. 마지막 진행이 디스패치된 후 또는 진행이 디스패치되지 않은 경우 loadstart가 디스패치된 후이다.아니요아니요
abort진행이 종료되었다. 마지막 진행이 디스패치된 후 또는 진행이 디스패치되지 않은 경우 loadstart가 디스패치된 후이다.아니요아니요
load진행에 성공했다. 마지막 진행이 디스패치된 후 또는 진행이 디스패치되지 않은 경우 loadstart가 디스패치된 후이다.아니요아니요
loadend진행이 중지되었다. error, abort 또는 load 중 하나가 디스패치된 후이다.아니요아니요


2. 1. HTML 이벤트

터치 스크린 장치에서 실행되는 웹 브라우저는 iOS 및 안드로이드와 같은 추가 이벤트를 생성한다.[9] 이러한 터치 이벤트는 다음과 같다.

분류유형설명버블링취소 가능
터치touchstart손가락이 터치 표면/화면에 닿았을 때 발생합니다.
touchend손가락이 터치 표면/화면에서 떨어졌을 때 발생합니다.
touchmove이미 화면에 닿아 있던 손가락이 화면을 가로질러 움직일 때 발생합니다.
touchenter터치 지점이 DOM 요소로 정의된 인터랙티브 영역으로 이동할 때 발생합니다.
touchleave터치 지점이 DOM 요소로 정의된 인터랙티브 영역에서 벗어날 때 발생합니다.
touchcancel사용자 에이전트는 UA 윈도우의 경계 외부로 이동하는 등, 구현에 따라 터치 포인트가 중단되었음을 나타내기 위해 이 이벤트 유형을 디스패치해야 한다. 사용자 에이전트는 또한 사용자가 장치 또는 구현이 저장하도록 구성된 것보다 더 많은 터치 포인트를 터치 표면에 배치할 때 이 이벤트 유형을 디스패치할 수 있으며, 이 경우 TouchList에서 가장 먼저 발생한 TouchPoint 객체를 제거해야 한다.[9]아니요



W3C 권고안 초안에서 `TouchEvent`는 `TouchList`의 `Touch` 위치, 활성화된 수정 키, 대상 DOM 요소 내의 `Touch` 위치 목록 및 이전 `TouchEvent` 이후 변경된 `Touch` 위치 목록을 전달한다.[9] 애플은 이 작업 그룹에 참여하지 않았으며, 권고안 과정 후반부에 특허를 공개하여 터치 이벤트 사양의 W3C 권고를 지연시켰다.[10]

2. 1. 1. 일반 이벤트

대부분의 요소 노드에서 생성될 수 있는 다양한 종류의 이벤트가 있다.

  • 마우스 이벤트.[3][4]
  • 키보드 이벤트.
  • HTML 프레임/객체 이벤트.
  • HTML 폼 이벤트.
  • 사용자 인터페이스 이벤트.
  • 변형 이벤트(문서 구조 변경 알림).
  • 진행 이벤트[5](XMLHttpRequest 및 파일 API[6]에서 사용).


위의 이벤트 분류는 W3C의 분류와 정확히 일치하지 않는다.

분류유형속성설명버블링취소 가능 여부
마우스clickonclick요소 위에서 포인팅 장치 버튼을 클릭했을 때 발생한다. 클릭은 동일한 화면 위치에서 mousedown과 mouseup이 발생하는 것으로 정의된다. 이러한 이벤트의 순서는 mousedown, mouseup, click 순이다.
dblclickondblclick요소 위에서 포인팅 장치 버튼을 더블클릭했을 때 발생한다.
mousedownonmousedown요소 위에서 포인팅 장치 버튼을 눌렀을 때 발생한다.
mouseuponmouseup요소 위에서 포인팅 장치 버튼을 놓았을 때 발생한다.
mouseoveronmouseover포인팅 장치가 요소 위로 이동했을 때 발생한다.
mousemove[7]onmousemove포인팅 장치가 요소 위에 있는 동안 이동했을 때 발생한다.
mouseoutonmouseout포인팅 장치가 요소에서 벗어났을 때 발생한다.
dragstartondragstart드래그가 시작될 때 요소에서 발생한다.
dragondrag이 이벤트는 드래그 작업 중에 드래그의 소스, 즉 dragstart가 발생한 요소에서 발생한다.
dragenterondragenter드래그가 진행되는 동안 마우스가 요소 위로 처음 이동했을 때 발생한다.
dragleaveondragleave드래그가 진행되는 동안 마우스가 요소에서 벗어났을 때 발생한다.아니요
dragoverondragover드래그가 진행되는 동안 마우스가 요소 위로 이동할 때 발생한다.
dropondrop드롭 이벤트는 드래그 작업이 끝날 때 드롭이 발생하는 요소에서 발생한다.
dragendondragend드래그 작업이 성공했는지 여부에 관계없이 드래그가 완료되면 드래그의 소스가 dragend 이벤트를 받는다.아니요
키보드keydownonkeydown키보드에서 키를 누르기 전에 발생한다.
keypressonkeypress키보드에서 키를 누른 후에 발생한다.
keyuponkeyup키보드에서 키를 놓았을 때 발생한다.
HTML 프레임/객체loadonload사용자 에이전트가 창, 프레임, 객체 및 이미지를 포함하여 문서 내의 모든 콘텐츠 로딩을 완료했을 때 발생한다. 요소의 경우 대상 요소와 모든 콘텐츠의 로딩이 완료되면 발생한다.아니요아니요
unloadonunload사용자 에이전트가 창 또는 프레임에서 모든 콘텐츠를 제거할 때 발생한다. 요소의 경우 대상 요소 또는 해당 콘텐츠가 제거되면 발생한다.아니요아니요
abortonabort객체/이미지가 완전히 로드되기 전에 로딩이 중지될 때 발생한다.아니요
erroronerror객체/이미지/프레임을 제대로 로드할 수 없을 때 발생한다.아니요
resizeonresize문서 보기가 크기 조정될 때 발생한다.아니요
scrollonscroll요소 또는 문서 보기가 스크롤될 때 발생한다.아니요, document의 스크롤 이벤트는 window로 버블링 되어야 한다는 예외 사항이 있다.[8]아니요
HTML 폼selectonselect사용자가 텍스트 상자를 포함하여 텍스트 필드에서 텍스트를 선택할 때 발생한다.아니요
changeonchange컨트롤이 입력 포커스를 잃고 포커스를 얻은 이후 해당 값이 수정되었을 때 발생한다.아니요
submitonsubmit폼이 제출될 때 발생한다.
resetonreset폼이 재설정될 때 발생한다.아니요
focusonfocus포인팅 장치 또는 탭 순서를 통해 요소가 포커스를 받을 때 발생한다.아니요아니요
bluronblur포인팅 장치 또는 탭 탐색을 통해 요소가 포커스를 잃을 때 발생한다.아니요아니요
사용자 인터페이스focusinHTML focus 이벤트와 유사하지만, 포커스 가능한 모든 요소에 적용될 수 있다.아니요
focusoutHTML blur 이벤트와 유사하지만, 포커스 가능한 모든 요소에 적용될 수 있다.아니요
DOMActivateXUL command 이벤트와 유사하다. 요소가 마우스 클릭 또는 키 누름과 같은 방법으로 활성화될 때 발생한다.
변형DOMSubtreeModified하위 트리가 수정될 때 발생한다.아니요
DOMNodeInserted노드가 다른 노드의 자식으로 추가되었을 때 발생한다.아니요
DOMNodeRemoved노드가 DOM 트리에서 제거되었을 때 발생한다.아니요
DOMNodeRemovedFromDocument노드가 문서에서 제거될 때 발생한다.아니요아니요
DOMNodeInsertedIntoDocument노드가 문서에 삽입될 때 발생한다.아니요아니요
DOMAttrModified속성이 수정되었을 때 발생한다.아니요
DOMCharacterDataModified문자 데이터가 수정되었을 때 발생한다.아니요
진행loadstart진행이 시작되었다.아니요아니요
progress진행 중이다. loadstart가 디스패치된 후이다.아니요아니요
error진행에 실패했다. 마지막 진행이 디스패치된 후 또는 진행이 디스패치되지 않은 경우 loadstart가 디스패치된 후이다.아니요아니요
abort진행이 종료되었다. 마지막 진행이 디스패치된 후 또는 진행이 디스패치되지 않은 경우 loadstart가 디스패치된 후이다.아니요아니요
load진행에 성공했다. 마지막 진행이 디스패치된 후 또는 진행이 디스패치되지 않은 경우 loadstart가 디스패치된 후이다.아니요아니요
loadend진행이 중지되었다. error, abort 또는 load 중 하나가 디스패치된 후이다.아니요아니요



"DOM"으로 시작하는 이벤트는 현재 잘 지원되지 않으며, 이로 인해 W3C는 DOM 레벨 3에서 다른 성능상의 이유로 이를 더 이상 사용하지 않는다. 모질라오페라는 ''DOMAttrModified'', ''DOMNodeInserted'', ''DOMNodeRemoved'' 및 ''DOMCharacterDataModified''를 지원한다. 크롬사파리는 ''DOMAttrModified''를 제외하고 이러한 이벤트를 지원한다.

터치 스크린과 같은 터치 스크린 장치에서 실행되는 웹 브라우저는 iOS (Apple) 및 안드로이드(Google)와 같은 추가 이벤트를 생성한다.[9]

분류유형속성설명버블링취소 가능
터치touchstart손가락이 터치 표면/화면에 닿았을 때 발생한다.
touchend손가락이 터치 표면/화면에서 떨어졌을 때 발생한다.
touchmove이미 화면에 닿아 있던 손가락이 화면을 가로질러 움직일 때 발생한다.
touchenter터치 지점이 DOM 요소로 정의된 인터랙티브 영역으로 이동할 때 발생한다.
touchleave터치 지점이 DOM 요소로 정의된 인터랙티브 영역에서 벗어날 때 발생한다.
touchcancel사용자 에이전트는 UA 윈도우의 경계 외부로 이동하는 등, 구현에 따라 터치 포인트가 중단되었음을 나타내기 위해 이 이벤트 유형을 디스패치해야 한다. 사용자 에이전트는 또한 사용자가 장치 또는 구현이 저장하도록 구성된 것보다 더 많은 터치 포인트를 터치 표면에 배치할 때 이 이벤트 유형을 디스패치할 수 있으며, 이 경우 TouchList에서 가장 먼저 발생한 TouchPoint 객체를 제거해야 한다.[9]아니요



W3C 권고안 초안에서 `TouchEvent`는 `TouchList`의 `Touch` 위치, 활성화된 수정 키, 대상 DOM 요소 내의 `Touch` 위치 목록 및 이전 `TouchEvent` 이후 변경된 `Touch` 위치 목록을 전달한다.[9]

애플(Apple Inc.)은 이 작업 그룹에 참여하지 않았으며, 권고안 과정 후반부에 특허를 공개하여 터치 이벤트 사양의 W3C 권고를 지연시켰다.[10]

2. 1. 2. 터치 이벤트

터치 스크린 장치에서 발생하는 이벤트는 다음과 같다. 터치 이벤트는 W3C 권고안 초안에 포함되어 있다.[11]

유형설명
pointerdown포인팅 장치 버튼이 활성화되거나 요소 위에서 눌렸을 때 발생한다.
pointerup포인팅 장치 버튼이 요소 위에서 해제되었을 때 발생한다.
pointercancel포인팅 장치가 이벤트를 계속 생성할 것 같지 않을 때 발생한다. (예: pointerdown 이벤트 후 장치가 패닝/확대에 사용되는 경우)
pointermove포인팅 장치가 요소 위에 있는 동안 이동할 때 발생한다.
pointerover포인팅 장치가 요소 위로 이동할 때 발생한다.
pointerout포인팅 장치가 요소에서 멀어졌을 때 발생한다. (호버링을 지원하지 않는 포인팅 장치에 의해 pointerup 후에도 발생)
pointerenter포인팅 장치가 요소 위로 이동할 때 또는 호버링을 지원하지 않는 포인팅 장치의 버튼이 해당 자손 요소 중 하나에서 눌렸을 때 발생한다.
pointerleave포인팅 장치가 요소에서 멀어졌을 때 또는 호버링을 지원하지 않는 포인팅 장치의 버튼이 자손 요소 위에서 해제되었을 때 발생한다.
gotpointercapture포인터가 setPointerCapture 메서드에 의해 캡처될 때 발생한다.
lostpointercapture포인터가 releasePointerCapture 메서드에 의해 해제될 때 발생한다.


2. 1. 3. 포인터 이벤트

Indie UI 작업 그룹은 웹 애플리케이션 개발자가 플랫폼별 기술 이벤트 대신 표준 사용자 상호 작용 이벤트를 지원하도록 돕고 있다.[12]

사용자 인터페이스 디자인 패턴은 소프트웨어 플랫폼, 하드웨어 및 로케일에 따라 다르며, 개인의 선호도에 따라 추가로 맞춤 설정될 수 있기 때문에 스크립팅은 어려울 수 있다. 개인은 자신의 시스템에서 인터페이스 작동 방식에 익숙하며, 선호하는 인터페이스는 웹 애플리케이션 작성자가 선호하는 인터페이스와 다를 수 있다.

예를 들어, 사용자가 마지막 작업을 실행 취소하려는 경우, 웹 애플리케이션 작성자는 다음 모든 이벤트를 "수신 대기"해야 한다.

  • Windows 및 Linux: Control+Z
  • Mac OS X: Command+Z
  • 일부 모바일 장치: 흔들기 이벤트


이전 작업을 "실행 취소"하기 위한 단일 요청을 수신 대기하는 것이 더 간단하다.

분류유형설명버블링취소 가능
포커스 요청directionalfocusrequest사용자 에이전트가 웹 애플리케이션에 "방향 포커스" 요청을 보낼 때 시작된다. 웹 작성자는 표준 브라우저 포커스 및 블러 이벤트로 충분한 경우 directionalfocusrequest 이벤트를 사용하거나 등록해서는 안 된다. 이러한 이벤트를 불필요하게 사용하면 성능이 저하되거나 사용자 경험이 부정적일 수 있다.
linearfocusrequest사용자 에이전트가 웹 애플리케이션에 "선형 포커스" 요청을 보낼 때 시작된다. 웹 작성자는 표준 브라우저 포커스 및 블러 이벤트로 충분한 경우 linearfocusrequest 이벤트를 사용하거나 등록해서는 안 된다. 이 이벤트 유형은 논리적 다음 요소가 요청될 때까지 포커스 가능하지 않거나 DOM에 존재하지 않을 수 있는 데이터 그리드와 같은 특수한 제어 유형에만 필요하다. 이러한 이벤트를 불필요하게 사용하면 성능이 저하되거나 사용자 경험이 부정적일 수 있다.
palettefocusrequest사용자 에이전트가 웹 애플리케이션에 "팔레트 포커스" 요청을 보낼 때 시작된다. 이 이벤트를 수신하는 웹 앱 작성자는 포커스를 웹 애플리케이션의 첫 번째 팔레트로 이동하거나 사용 가능한 모든 팔레트 간에 포커스를 순환해야 한다. 팔레트는 비모달 대화 상자 또는 검사기 창이라고도 한다.
toolbarfocusrequest사용자 에이전트가 웹 애플리케이션에 "툴바 포커스" 요청을 보낼 때 시작된다. 이 이벤트를 수신하는 웹 앱 작성자는 포커스를 웹 애플리케이션의 기본 툴바 또는 사용 가능한 모든 툴바 간에 포커스를 순환해야 한다.


2. 2. 인터넷 익스플로러 고유 이벤트

인터넷 익스플로러는 공통(W3C) 이벤트 외에 다양한 이벤트를 추가했으며, 이 중 일부는 다른 브라우저에서도 사실상 표준으로 구현되었다.

분류유형속성설명버블링취소 가능
클립보드cutoncut선택 영역이 클립보드로 잘라내기 된 후 발생한다.
copyoncopy선택 영역이 클립보드로 복사된 후 발생한다.
pasteonpaste클립보드에서 선택 영역이 붙여넣기 된 후 발생한다.
beforecutonbeforecut선택 영역이 클립보드로 잘라내기 되기 전에 발생한다.
beforecopyonbeforecopy선택 영역이 클립보드로 복사되기 전에 발생한다.
beforepasteonbeforepaste클립보드에서 선택 영역을 붙여넣기 하기 전에 발생한다.
데이터 바인딩afterupdateonafterupdate데이터 바인딩된 개체가 업데이트된 직후에 발생한다.아니요
beforeupdateonbeforeupdate데이터 소스가 업데이트되기 전에 발생한다.
cellchangeoncellchange데이터 소스가 변경될 때 발생한다.아니요
dataavailableondataavailable데이터 소스에서 새로운 데이터를 사용할 수 있게 될 때 발생한다.아니요
datasetchangedondatasetchanged데이터 소스의 내용이 변경될 때 발생한다.아니요
datasetcompleteondatasetcomplete데이터 소스에서 데이터 전송이 완료될 때 발생한다.아니요
errorupdateonerrorupdate데이터 필드를 업데이트하는 동안 오류가 발생하면 발생한다.아니요
rowenteronrowenter데이터 소스에서 새로운 데이터 행을 사용할 수 있게 될 때 발생한다.아니요
rowexitonrowexit데이터 소스의 데이터 행이 방금 완료되었을 때 발생한다.아니요
rowsdeleteonrowsdelete데이터 소스의 데이터 행이 삭제될 때 발생한다.아니요
rowinsertedonrowinserted데이터 소스의 데이터 행이 삽입될 때 발생한다.아니요
마우스contextmenuoncontextmenu컨텍스트 메뉴가 표시될 때 발생한다.
dragondrag드래그 앤 드롭 중 발생한다(이동하는 요소에서).
dragstartondragstart마우스 드래그가 시작될 때 발생한다(이동하는 요소에서).
dragenterondragenter어떤 항목이 영역 위로 드래그될 때 발생한다(대상 요소에서).
dragoverondragover드래그가 영역 위에 있을 때 발생한다(대상 요소에서).
dragleaveondragleave어떤 항목이 영역 밖으로 드래그될 때 발생한다(대상 요소에서).
dragendondragend마우스 드래그가 끝날 때 발생한다(이동하는 요소에서).
dropondrop드래그 중 유효한 대상 위에서 마우스 버튼이 해제될 때 발생한다(대상 요소에서).
selectstartonselectstart사용자가 텍스트 선택을 시작할 때 발생한다.
키보드helponhelp사용자가 도움말을 시작할 때 발생한다.
HTML 프레임/객체beforeunloadonbeforeunload문서가 언로드되기 전에 발생한다.아니요
stoponstop사용자가 객체 로딩을 중단할 때 발생한다. (abort와 달리 stop 이벤트는 document에 첨부될 수 있다)아니요아니요
HTML 폼beforeeditfocusonbeforeeditfocus요소가 편집을 위해 포커스를 얻기 전에 발생한다.
마키startonstart마키가 새로운 루프를 시작할 때 발생한다.아니요아니요
finishonfinish마키 루핑이 완료될 때 발생한다.아니요
bounceonbounce스크롤 마키가 다른 방향으로 튕겨져 나올 때 발생한다.아니요
기타beforeprintonbeforeprint문서를 인쇄하기 전에 발생한다.아니요아니요
afterprintonafterprint문서를 인쇄한 직후에 발생한다.아니요아니요
propertychangeonpropertychange개체의 속성이 변경될 때 발생한다.아니요아니요
filterchangeonfilterchange필터가 속성을 변경하거나 전환을 완료할 때 발생한다.아니요아니요
readystatechangeonreadystatechange요소의 readyState 속성이 변경될 때 발생한다.아니요아니요
losecaptureonlosecapturereleaseCapture 메서드가 호출될 때 발생한다.아니요아니요



Mozilla, Safari, Opera는 XMLHttpRequest 객체에 대한 readystatechange 이벤트도 지원한다. Mozilla는 또한 전통적인 이벤트 등록 방법(DOM 레벨 0)을 사용하여 beforeunload 이벤트를 지원한다. Mozilla와 Safari는 또한 contextmenu를 지원하지만, Mac용 인터넷 익스플로러는 지원하지 않는다.

Firefox 6 이상은 beforeprint 및 afterprint 이벤트를 지원한다.

2. 3. XUL 이벤트

모질라에서 정의한 XUL 요소에서만 작동하는 일련의 이벤트들이 있다.

분류유형속성설명버블링취소 가능
마우스DOMMouseScrollDOMMouseScroll마우스 휠이 움직여 콘텐츠가 스크롤될 때 발생한다.
dragdropondragdrop사용자가 마우스 버튼을 놓아 드래그 중인 객체를 놓을 때 발생한다.아니요아니요
dragenterondragenter드래그하는 동안 마우스 포인터가 처음 요소 위로 이동할 때 발생한다. mouseover 이벤트와 유사하지만 드래그하는 동안 발생한다.아니요아니요
dragexitondragexit드래그하는 동안 마우스 포인터가 요소에서 벗어날 때 발생한다. 요소에서 드롭 후에도 호출된다. mouseout 이벤트와 유사하지만 드래그하는 동안 발생한다.아니요아니요
draggestureondraggesture사용자가 마우스 버튼을 누르고 마우스를 움직여 요소를 드래그하기 시작할 때 발생한다.아니요아니요
dragoverondragovermousemove 이벤트와 관련되어, 무언가가 요소 위로 드래그될 때 발생한다.아니요아니요
입력CheckboxStateChange사용자가 또는 스크립트가 체크박스를 선택하거나 선택 해제할 때 발생한다.아니요아니요
RadioStateChange사용자가 또는 스크립트가 라디오 버튼을 선택할 때 발생한다.아니요아니요
closeonclose창을 닫으라는 요청이 있을 때 발생한다.아니요
commandoncommandDOMActivate 이벤트와 유사하다. 마우스 클릭이나 키 누름과 같이 요소가 활성화될 때 발생한다.아니요아니요
inputoninput사용자가 텍스트 상자에 텍스트를 입력할 때 발생한다.아니요
사용자 인터페이스DOMMenuItemActiveDOMMenuItemActive메뉴 또는 메뉴 항목에 마우스 오버되거나 강조 표시될 때 발생한다.아니요
DOMMenuItemInactiveDOMMenuItemInactive메뉴 또는 메뉴 항목에 더 이상 마우스 오버되지 않거나 강조 표시되지 않을 때 발생한다.아니요
contextmenuoncontextmenu사용자가 요소에 대한 컨텍스트 메뉴를 열도록 요청할 때 발생한다. 이 작업을 수행하는 작업은 플랫폼에 따라 다르지만 일반적으로 마우스 오른쪽 버튼을 클릭한다.아니요
overflowonoverflow상자 또는 기타 레이아웃 요소가 전체 크기로 표시할 공간이 없을 때 발생한다.아니요아니요
overflowchangedonoverflowchanged오버플로우 상태가 변경될 때 발생한다.아니요아니요
underflowonunderflow전체 크기로 표시할 공간이 충분해질 때 요소에 발생한다.아니요아니요
popuphiddenonpopuphidden숨겨진 후 팝업에 발생한다.아니요아니요
popuphidingonpopuphiding팝업이 숨겨지기 직전에 팝업에 발생한다.아니요아니요
popupshowingonpopupshowing팝업이 열리기 직전에 팝업에 발생한다.아니요
popupshownonpopupshown창이 열릴 때 onload 이벤트가 창으로 전송되는 것과 마찬가지로 팝업이 열린 후 팝업에 발생한다.아니요아니요
명령broadcastonbroadcast옵저버에 배치된다. broadcast 이벤트는 수신 중인 브로드캐스터의 속성이 변경될 때 전송된다.아니요아니요
commandupdateoncommandupdate명령 업데이트가 발생할 때 발생한다.아니요아니요


2. 4. 기타 이벤트

HTML 5 사양에 추가된[13] ''DOMContentLoaded''는 이미지와 같은 관련 파일의 로딩 전에 발생하는 이벤트이다. 모질라, 오페라 9, Webkit 렌더링 엔진 빌드 500 이상[14][15], 인터넷 익스플로러 9[16] 등에서 지원하며, 구글 크롬사파리 3.1+의 모든 버전에서도 구현되었다.

오페라 9는 웹 폼 2.0 이벤트인 ''DOMControlValueChanged'', ''invalid'', ''forminput'', ''formchange''도 지원한다.

3. 이벤트 흐름

이벤트 흐름은 이벤트가 발생했을 때 이벤트 타겟을 찾아가는 과정을 말한다. 이 과정은 캡처링, 타겟, 버블링 단계로 나뉜다.

두 개의 이벤트 타겟이 https://dom.spec.whatwg.org/#trees 트리에 있고, 두 타겟 모두 "click"과 같은 동일한 이벤트 유형에 이벤트 리스너가 등록되어 있다고 가정해 보자. 사용자가 내부 요소를 클릭하면, 브라우저는 다음 두 가지 방법 중 하나로 이벤트를 처리할 수 있다.


  • 이벤트 캡처링: 외부 요소에서 내부 요소 순으로 이벤트를 발생시킨다. 이 방식은 넷스케이프 내비게이터에서 사용되었다.
  • 이벤트 버블링: 내부 요소에서 외부 요소 순으로 이벤트를 발생시킨다. 이 방식은 인터넷 익스플로러를 비롯한 여러 브라우저에서 사용되었다.[17]


W3C는 이 두 방식의 중간 입장을 취했다.[18] W3C에 따르면, 이벤트는 다음 세 단계를 거친다.

1. 캡처 단계: 이벤트가 루트 이벤트 타겟에서 이벤트 타겟으로 전달된다.

2. 타겟 단계: 이벤트가 이벤트 타겟에 도달한다.

3. 버블 단계 (선택 사항): 이벤트가 이벤트 타겟에서 다시 루트 이벤트 타겟으로 전달된다. 이 단계는 버블링되는 이벤트(`event.bubbles == true`)에 대해서만 발생한다.

이벤트 흐름은 [https://domevents.dev]에서 시각적으로 확인할 수 있다.

3. 1. 이벤트 중단

`event.stopPropagation()` 또는 `event.stopImmediatePropagation()` 메서드를 사용하여 이벤트가 이벤트 리스너를 통과하는 것을 중단할 수 있다.

  • `event.stopPropagation()`: 현재 이벤트 단계에서 현재 이벤트 대상에 연결된 모든 이벤트 리스너가 완료된 후 이벤트가 중단된다.
  • `event.stopImmediatePropagation()`: 이벤트가 즉시 중단되고 더 이상 이벤트 리스너가 실행되지 않는다.


이벤트가 중단되면 더 이상 이벤트 경로를 따라 이동하지 않는다. 이벤트를 중단하는 것이 이벤트를 취소하는 것은 아니다. 구형 브라우저에서는 다음과 같은 방법을 사용한다.

  • `event.cancelBubble`을 `true`로 설정 (인터넷 익스플로러)
  • `event.returnValue` 속성을 `false`로 설정

3. 2. 이벤트 취소

취소 가능한 이벤트는 `event.preventDefault()`를 호출하여 취소할 수 있다. 이벤트를 취소하면 해당 이벤트에 대한 기본 브라우저 동작을 사용하지 않게 된다. 이벤트가 취소되면 `event.defaultPrevented` 속성이 `true`로 설정된다. 이벤트를 취소해도 이벤트 경로는 계속 진행된다.[1]

4. 이벤트 객체

이벤트 객체는 대상 요소, 눌린 키, 눌린 마우스 버튼, 마우스 위치 등 특정 이벤트에 대한 다양한 정보를 제공한다. 이 문서에서는 W3C 이벤트 객체만 다룬다.[19]

이벤트 속성
이름유형설명
typeDOMString이벤트 이름 (DOM 레벨 2에서는 대소문자를 구분하지 않지만 DOM 레벨 3에서는 대소문자를 구분함).[19]
targetEventTarget이벤트가 원래 발생한 대상을 나타낸다.
currentTargetEventTarget현재 이벤트 리스너가 처리 중인 대상을 나타낸다.
eventPhaseunsigned short현재 평가 중인 이벤트 흐름의 단계를 나타낸다.
bubblesboolean이벤트가 버블링 이벤트인지 여부를 나타낸다.
cancelableboolean이벤트의 기본 동작을 막을 수 있는지 여부를 나타낸다.
timeStampDOMTimeStamp이벤트가 생성된 시간(에포크를 기준으로 밀리초)을 지정한다.



이벤트 메서드
이름인수 유형인수 이름설명
stopPropagation이벤트 흐름 동안 이벤트의 추가 전파를 방지한다.
preventDefault이벤트가 취소 가능한 경우 이벤트를 취소한다. 즉, 이벤트의 결과로 일반적으로 수행하는 기본 동작이 발생하지 않는다.
initEventDOMStringeventTypeArg이벤트 유형을 지정한다.
booleancanBubbleArg이벤트가 버블링될 수 있는지 여부를 지정한다.
booleancancelableArg이벤트의 기본 동작을 막을 수 있는지 여부를 지정한다.


5. 이벤트 처리 모델

DOM 이벤트 처리 모델은 웹 페이지에서 발생하는 이벤트를 처리하는 방식을 정의한다. 주요 모델로는 DOM Level 0, DOM Level 2, 그리고 인터넷 익스플로러 고유 모델이 있다.

DOM Level 0은 넷스케이프 내비게이터에 의해 도입된 초기 모델이며, 2005년까지 널리 사용되었다. 인라인 모델과 전통적인 모델 두 가지 유형이 있다.

DOM Level 2는 월드 와이드 웹 컨소시엄(W3C)에서 표준화한 모델로, 이벤트 리스너를 등록하고 제거하는 기능을 제공하여 유연한 이벤트 처리가 가능하다.[20]

인터넷 익스플로러 8 및 이전 버전에서는 W3C 표준 이벤트 모델과 다른 고유한 이벤트 모델을 사용했다. 이 모델은 `attachEvent`, `detachEvent`, `fireEvent` 메서드를 사용하여 이벤트를 처리했지만, W3C 표준 모델과 몇 가지 차이점이 있어 호환성 문제가 발생할 수 있었다.[21]

5. 1. DOM Level 0

이 이벤트 처리 모델은 넷스케이프 내비게이터에 의해 도입되었으며, 2005년까지 가장 크로스 브라우저 모델로 남아있다. 이 모델에는 인라인 모델과 전통적인 모델 두 가지 유형이 있다.

5. 2. DOM Level 2

DOM Level 2에서는 이벤트 처리기가 요소의 속성으로 추가된다.[20] 다음은 그 예시이다.

```html









Inline Event Handling





Inline Event Handling



Hey Joe!









```

위 예제에서 하이퍼링크를 클릭하면 "Hey Joe"라는 메시지가 있는 경고 대화 상자가 나타난다. 이벤트 처리기에서 false를 반환하면 기본 클릭 동작이 취소된다.

일반적으로 인라인 모델은 사용자 지정 인수를 사용하여 이벤트 처리기를 등록할 수 있다고 오해하는 경우가 있다. 위의 `triggerAlert` 함수의 `name`이 그러한 예로 보일 수 있다. 하지만 실제로는 브라우저의 자바스크립트 엔진이 `onclick` 속성에 있는 문을 포함하는 익명 함수를 생성한다. 요소의 `onclick` 처리기는 다음과 같은 익명 함수에 바인딩된다.

```javascript

function () {

triggerAlert('Joe');

return false;

}

```

이러한 자바스크립트 이벤트 모델의 제한 사항은 일반적으로 이벤트 처리기의 함수 객체에 속성을 할당하거나 클로저를 사용하여 해결한다.

5. 3. 인터넷 익스플로러 고유 모델

인터넷 익스플로러 8 및 이전 버전에서는 W3C 표준 이벤트 모델과 다른 고유한 이벤트 모델을 사용했다. 이 모델에서는 이벤트를 처리하기 위해 다음과 같은 메서드들을 사용했다.

  • `attachEvent`: 이벤트 핸들러를 등록한다.
  • `detachEvent`: 이벤트 핸들러를 제거한다.
  • `fireEvent`: 이벤트를 발생시킨다.


이 방식은 W3C 표준 모델과 다음과 같은 차이점이 있었다.

  • 이벤트 이름 앞에 'on' 접두사를 붙여야 한다. (예: `onclick` 대신 `on click`)
  • 이벤트 객체가 명시적으로 전달되지 않고, `window.event` 속성을 통해 접근해야 한다.
  • 이벤트 버블링만 지원하며, 캡처링 단계는 지원하지 않는다.
  • `this` 키워드의 값이 W3C 모델과 다르게 동작할 수 있다.[21]

참조

[1] 웹사이트 DOM Standard https://dom.spec.wha[...] 2021-05-25
[2] 웹사이트 JavaScript DOM Events https://www.w3school[...] 2019-08-03
[3] 웹사이트 7.8 Drag and drop — HTML5 http://www.w3.org/TR[...]
[4] 웹사이트 HTML Drag and Drop API https://developer.mo[...] 2024-03-28
[5] 웹사이트 Progress Events http://www.w3.org/TR[...]
[6] 웹사이트 File API http://www.w3.org/TR[...]
[7] 웹사이트 Element: Mousemove event - Web APIs | MDN https://developer.mo[...] 2023-12-22
[8] 웹사이트 Document Object Model (DOM) Level 3 Events Specification (working draft) http://www.w3.org/TR[...] W3C 2013-04-17
[9] 웹사이트 Touch Events version 2 - W3C Editor's Draft http://dvcs.w3.org/h[...] W3C 2011-11-14
[10] 웹사이트 Apple using patents to undermine open standards again http://my.opera.com/[...] opera.com 2011-12-09
[11] 웹사이트 Pointer Events http://www.w3.org/TR[...]
[12] 웹사이트 IndieUI: Events 1.0 http://www.w3.org/TR[...]
[13] 웹사이트 HTML Standard https://www.w3.org/T[...]
[14] webarchive https://web.archive.[...] 2010-06-11
[15] 웹사이트 Which browsers support native DOMContentLoaded event? « Perfection Labs Development Tips http://perfectionlab[...] 2011-06-29
[16] 웹사이트 Test Drive Redirect http://ie.microsoft.[...] 2010-05-06
[17] 웹사이트 Introduction to Events http://www.quirksmod[...] Quirksmode.org 2012-09-15
[18] 웹사이트 Document Object Model (DOM) Level 2 Events Specification http://www.w3.org/TR[...] W3C 2000-11-13
[19] 웹사이트 Document Object Model (DOM) Level 3 Events Specification (working draft) http://www.w3.org/TR[...] W3C 2013-04-17
[20] 웹사이트 Early event handlers http://www.quirksmod[...] Quirksmode.org 2012-09-15
[21] 웹사이트 Traditional event registration model http://www.quirksmod[...] Quirksmode.org 2012-09-15
[22] 웹사이트 DOM Level 3 Events support in IE9 http://blogs.msdn.co[...] Microsoft 2010-03-26
[23] 웹사이트 Compatibility changes in IE11 Preview http://msdn.microsof[...] Microsoft 2013-09-09
[24] 웹인용 DOM Standard https://dom.spec.wha[...] 2021-05-25
[25] 웹인용 JavaScript DOM Events https://www.w3school[...] 2019-08-03



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com