UI 이벤트

W3C 워킹드래프트,

이 문서에 대한 자세한 정보
현재 버전:
https://www.w3.org/TR/2024/WD-uievents-20240907/
최신 공개 버전:
https://www.w3.org/TR/uievents/
편집 초안:
https://w3c.github.io/uievents/
이전 버전:
히스토리:
https://www.w3.org/standards/history/uievents/
피드백:
GitHub
사양 내 인라인
편집자:
(Google)
(Microsoft)
전 편집자:
Doug Schepers (2008년 3월 - 2011년 5월)
테스트:
web-platform-tests uievents/ (진행 중 작업)

요약

이 명세는 [DOM]에서 정의된 DOM Event 객체를 확장하는 UI 이벤트를 정의합니다. UI 이벤트는 주로 시각적 사용자 에이전트가 마우스 및 키보드 입력과 같은 사용자 상호 작용을 처리하기 위해 구현합니다.

문서의 상태

이 섹션은 해당 문서가 발행된 시점의 상태를 설명합니다. 현재 W3C 출판물 및 이 기술 보고서의 최신 개정판 목록은 W3C 기술 보고서 색인에서 확인할 수 있습니다: https://www.w3.org/TR/.

이 문서는 웹 애플리케이션 작업 그룹에 의해 작업 초안으로 발행되었습니다. 이 문서는 W3C 추천 표준이 되는 것을 목표로 합니다.

이 문서는 웹 애플리케이션 작업 그룹추천 경로를 사용하여 작업 초안으로 발행하였습니다. 이 명세에 대한 피드백과 의견은 언제든 환영합니다. GitHub issues를 이용해 주세요. 역사적인 논의는 public-webapps@w3.org archives에서 확인할 수 있습니다.

작업 초안으로 발행되었다고 해서 W3C 및 그 회원들의 승인을 의미하지는 않습니다. 이는 초안 문서이며 언제든지 업데이트되거나, 대체되거나, 폐기될 수 있습니다. 이 문서를 작업 진행 중인 자료 이외의 것으로 인용하는 것은 부적절합니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 제작되었습니다. W3C는 그룹의 결과물과 관련하여 이루어진 공개된 특허 목록을 유지하고 있습니다. 해당 페이지에는 특허를 공개하는 방법도 포함되어 있습니다. 특허에 대한 실제 지식을 가진 개인이 Essential Claim(s)를 포함한다고 생각되는 정보를 알고 있다면 W3C 특허 정책의 섹션 6에 따라 정보를 공개해야 합니다.

이 문서는 2023년 11월 3일 W3C 프로세스 문서에 의해 관리됩니다.

1. 소개

1.1. 개요

UI Events는 두 가지 주요 목표로 설계되었습니다. 첫 번째 목표는 event 시스템의 설계로, event listeners 등록을 허용하고 이벤트가 트리 구조를 통해 흐르는 방식을 설명합니다. 또한 이 명세서는 사용자 인터페이스 제어 및 문서 변이 알림을 위한 표준 이벤트 모듈과 각 이벤트 모듈에 대한 정의된 컨텍스트 정보를 제공합니다.

UI Events의 두 번째 목표는 기존 브라우저에서 사용되는 현재 이벤트 시스템의 공통 부분 집합을 제공하는 것입니다. 이는 기존 스크립트와 콘텐츠의 상호운용성을 촉진하기 위함입니다. 이 목표가 완전한 하위 호환성으로 달성될 것으로 기대되지는 않으나, 명세서는 가능할 때마다 이를 달성하려고 시도합니다.

1.2. 적합성

이 섹션은 규범적입니다.

이 명세서 내에서 MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY, OPTIONAL 등의 핵심 용어는 [RFC2119]에서 설명된 대로 해석되어야 합니다.

이 명세서는 DOM Level 3 Core 명세의 맥락에서 이해되어야 하며 [DOM-Level-3-Core] 및 DOM 구현에 대한 일반적인 고려사항이 적용됩니다. 예를 들어, namespace URIs의 처리는 XML Namespaces에서 논의됩니다. 적합성에 대한 추가 정보는 DOM Level 3 Core 명세의 [DOM-Level-3-Core]에서 확인할 수 있습니다. user agent는 이 명세서에 적합하기 위해 반드시 다른 명세서 전체에 적합할 필요는 없으나, 이 명세서에서 언급된 특정 부분에는 반드시 적합해야 합니다 (예: 적합한 UI Events user agentDOMString 데이터 타입을 [WebIDL]에서 정의한 대로 지원해야 하지만, UI Events에 적합하기 위해 [WebIDL]에서 정의된 모든 메서드나 데이터 타입을 지원할 필요는 없습니다).

이 명세서는 다양한 user agent, 명세, 콘텐츠 작성자를 위한 여러 적합성 클래스를 정의합니다:

1.2.1. 웹 브라우저 및 기타 동적 또는 상호작용 user agent

동적 또는 상호작용 user agent는 여기서 브라우저로 언급되며 (웹 브라우저, AT(접근성 기술) 애플리케이션, 기타 유사한 프로그램 포함), 다음을 지원하는 경우 UI Events에 적합합니다:

적합한 브라우저는 dispatch 메커니즘을 이용하여 해당 EventTarget 에 대해 정의된 조건이 충족되었을 때 적절한 이벤트를 발생시켜야 합니다.

브라우저는 이 문서에서 명시된 인터페이스 및 관련 event types를 구현하는 경우 UI Events에 명확히 적합합니다.

적합한 브라우저는 스크립팅, 선언적 상호작용 또는 이 명세서에서 설명한 방식으로 이벤트를 감지하고 발생시킬 수 있는 다른 수단을 지원해야 하며, 해당 event type에 대해 명시된 API를 반드시 지원해야 합니다.

모든 적합성 기준을 충족하는 것 이외에도, 적합한 브라우저는 기존 콘텐츠의 하위 호환성을 위해 deprecated로 표시된 기능을 구현할 수 있으나, 이러한 구현은 권장되지 않습니다.

적합한 브라우저는 이 명세서에 없는 기능도 지원할 수 있으나, 인터페이스, 이벤트 또는 이 명세서에서 정의된 기타 기능을 사용할 수 있으며, 구현에 적합한 추가 인터페이스 및 event types도 구현할 수 있습니다. 이러한 기능은 향후 명세에서 표준화될 수 있습니다.

이 명세서의 필수 부분을 모두 준수하지 않은 브라우저는 UI Events에 대한 적합성을 주장해서는 안 됩니다. 이 명세서의 일부만 준수하는 구현은 해당 부분에 대해서만 적합성을 주장할 수 있습니다.

적합한 브라우저는 또한 Web IDL 명세서 [WebIDL]에 따라 이 명세서의 IDL 조각에 대한 적합한 구현이어야 합니다.

1.2.2. 저작 도구

콘텐츠 저작 도구는 event types를 이 명세서에서 정의된 방식과 일관되게 사용하는 콘텐츠를 생성하는 경우 UI Events에 적합합니다.

콘텐츠 저작 도구는 이 명세서에서 deprecated로 표시된 기능을 사용하는 콘텐츠에 대해 UI Events 적합성을 주장해서는 안 됩니다.

적합한 콘텐츠 저작 도구는 콘텐츠 작성자가 해당 콘텐츠 문서에 적합한 모든 event types 및 인터페이스를 사용할 수 있도록 해야 하며, 모든 host languages에 대해 적합한 기능을 제공해야 합니다.

1.2.3. 콘텐츠 작성자 및 콘텐츠

콘텐츠 author는 해당 콘텐츠가 이 명세서에서 정의된 방식과 일관되게 event types를 사용하는 경우 UI Events 적합 콘텐츠를 생성한 것입니다.

콘텐츠 작성자는 이 명세서에서 deprecated로 표시된 기능을 사용하지 않는 것이 좋으며, 대신 이 명세서 및 기타에서 정의된 대체 메커니즘을 사용하는 것이 바람직합니다.

적합한 콘텐츠는 이 명세서에서 설명하는 인터페이스 및 event types의 의미를 반드시 따라야 합니다.

콘텐츠 작성자는 접근성국제화 가이드라인 명세에서 설명하는 모범 사례를 따르는 것이 좋습니다.

1.2.4. 명세 및 호스트 언어

명세 또는 host language[DOM]에서 정의된 이벤트 흐름 메커니즘, 인터페이스, 이벤트 또는 기타 기능을 참조하고 사용하며, 이러한 기능을 호환되지 않는 방식으로 확장하지 않는 경우 UI Events에 적합합니다.

명세 또는 host language는 이 문서에서 명시된 인터페이스 및 관련 event types를 참조하고 사용하는 경우 UI Events에 명확히 적합합니다. 적합한 명세는 그 명세에 맞는 추가 인터페이스와 event types를 정의하거나, UI Events 인터페이스 및 event types를 이 명세서에서 정의한 내용을 모순하거나 충돌하지 않는 방식으로 확장할 수 있습니다.

UI Events를 참조하는 명세 또는 host languages는 이 명세서에서 deprecated로 표시된 기능을 사용하거나 권장해서는 안 되며, 해당 기능에 대해 대체 기법(있는 경우)을 사용하거나 권장해야 합니다.

2. 스타일 관례

이 명세서는 제안된 W3C 명세 관례를 따르며, 다음과 같은 추가 사항이 있습니다:

또한, 이 명세서에서 특정 용어는 특별한 의미로 사용됩니다. 구현(implementation)은 브라우저, 콘텐츠 저작 도구 또는 이 명세서를 구현하는 기타 user agent를 의미하며, 콘텐츠 작성자(content author)는 이 명세서에서 설명된 인터페이스, 메서드, 속성, 이벤트 및 기타 기능을 활용하여 웹 애플리케이션을 작성하는 사람입니다. 사용자는 해당 웹 애플리케이션을 구현(implementation)에서 사용하는 사람을 의미합니다.

마지막으로:

이것은 참고 사항입니다.

이것은 열린 이슈입니다.

이것은 경고입니다.

interface Example {
    // This is an IDL definition.
};

3. 기본 이벤트 인터페이스

[DOM]에서 정의된 기본 이벤트 인터페이스는 UI Events의 근간이 됩니다. 이러한 기본 이벤트 인터페이스는 구현에서 반드시 항상 지원되어야 합니다:

이 명세서에서 정의된 이벤트 타입들은 이러한 기본 인터페이스에서 파생되며, 반드시 해당 인터페이스에서 파생된 모든 속성, 메서드, 상수를 상속받아야 합니다.

다음 도표는 이 명세서에서 설명된 인터페이스의 상속 구조를 나타냅니다.

이 명세서에서 정의된 인터페이스의 상속 구조를 그래픽으로 나타낸 것
이 명세서에서 정의된 인터페이스의 상속 구조를 그래픽으로 나타냅니다.

3.1. 이벤트 타입 목록

각 이벤트는 이벤트 타입이라 불리는 타입과 연결되어야 하며, 이벤트 객체의 type 속성으로 제공됩니다. 이벤트 타입은 DOMString 타입이어야 합니다.

DOM 지원 수준이나 디스플레이(예: 화면) 또는 상호작용(예: 마우스, 키보드, 터치스크린, 음성)에 사용되는 장치에 따라 구현에서 이러한 이벤트 타입이 생성될 수 있습니다. [XML] 또는 [HTML5] 애플리케이션에서 사용할 때, 해당 언어의 명세가 이벤트 타입과 관련된 의미와 범위(특히 가능한 이벤트 타겟)를 제한할 수 있습니다. 사용 중인 언어를 정의하는 명세를 참조하여 이러한 제한 사항이나 이 문서에 정의되지 않은 이벤트 타입을 확인하세요.

다음 표는 이 명세서에서 설명된 이벤트 타입의 정보를 요약하여 제공합니다.

이벤트 타입 동기 / 비동기 버블링 단계 신뢰할 수 있는 이벤트 타겟 타입 DOM 인터페이스 취소 가능 기본 동작
abort 동기 아니오 Window, Element Event 아니오 없음
auxclick 동기 Element PointerEvent 상황에 따라 다름
beforeinput 동기 Element InputEvent DOM 요소 업데이트
blur 동기 아니오 Window, Element FocusEvent 아니오 없음
click 동기 Element PointerEvent 상황에 따라 다름: 타겟에 활성화 동작이 연결되어 있는 경우, 활성화 동작을 실행; 포커스 가능한 타겟에는 요소에 포커스를 부여
compositionstart 동기 Element CompositionEvent 텍스트 조합 시스템 후보 창 표시
compositionupdate 동기 Element CompositionEvent 아니오 없음
compositionend 동기 Element CompositionEvent 아니오 없음
contextmenu 동기 Element PointerEvent 지원되는 경우 컨텍스트 메뉴 호출
dblclick 동기 Element MouseEvent 아니오 상황에 따라 다름: 타겟에 활성화 동작이 연결되어 있는 경우, 활성화 동작을 실행; 포커스 가능한 타겟에는 요소에 포커스를 부여
error 비동기 아니오 Window, Element Event 아니오 없음
focus 동기 아니오 Window, Element FocusEvent 아니오 없음
focusin 동기 Window, Element FocusEvent 아니오 없음
focusout 동기 Window, Element FocusEvent 아니오 없음
input 동기 Element InputEvent 아니오 없음
keydown 동기 Element KeyboardEvent 상황에 따라 다름: beforeinputinput 이벤트 트리거; 텍스트 조합 시스템 실행; blurfocus 이벤트; keypress 이벤트(지원되는 경우); 활성화 동작; 기타 이벤트
keyup 동기 Element KeyboardEvent 없음
load 비동기 아니오 Window, Document, Element Event 아니오 없음
mousedown 동기 Element MouseEvent 상황에 따라 다름: 드래그/드롭 작업 시작; 텍스트 선택 시작; 스크롤/팬 상호작용 시작(중간 마우스 버튼과 함께 사용할 경우, 지원되는 경우)
mouseenter 동기 아니오 Element MouseEvent 아니오 없음
mouseleave 동기 아니오 Element MouseEvent 아니오 없음
mousemove 동기 Element MouseEvent 없음
mouseout 동기 Element MouseEvent 없음
mouseover 동기 Element MouseEvent 없음
mouseup 동기 Element MouseEvent 없음
select 동기 Element Event 아니오 없음
unload 동기 아니오 Window, Document, Element Event 아니오 없음
wheel 비동기 Element WheelEvent 문서 스크롤(또는 확대/축소)

이 명세서에서 deprecated로 지정된 이벤트 목록은 문서 마지막의 레거시 이벤트 타입 부록을 참조하세요.

위 표를 해석하는 한 가지 방법: load 이벤트는 해당 이벤트에 대해 Element 노드에 연결된 이벤트 리스너를 캡처 및 타겟 단계에서 트리거합니다. 이 이벤트는 취소할 수 없습니다. 이벤트 리스너load 이벤트에 대해 Window, Document, 또는 Element 노드가 아닌 노드에 연결되어 있거나 버블링 단계에만 연결되어 있는 경우, 해당 이벤트 리스너는 트리거되지 않습니다.

위 표를 나열된 이벤트 타입에 대한 결정적인 것으로 해석하지 마세요. 예를 들어, load 이벤트는 다른 명세서(예: XMLHttpRequest)에서도 사용됩니다. 마찬가지로, dispatchEvent()모든 EventTarget을 구현하는 객체의 리스너에 신뢰할 수 없는 이벤트도 발생시킬 수 있습니다.

위에서 설명한 이벤트 타입과 관련된 이벤트 객체에는 추가적인 컨텍스트 정보가 포함되어 있습니다. 자세한 내용은 DOM 인터페이스 설명을 참조하세요.

3.2. 사용자 인터페이스 이벤트

사용자 인터페이스 이벤트 모듈은 사용자 인터페이스 및 문서 조작과 관련된 기본 이벤트 타입을 포함합니다.

3.2.1. UIEvent 인터페이스

DOM Level 2에서 도입됨

UIEvent 인터페이스는 사용자 인터페이스 이벤트와 관련된 특정 컨텍스트 정보를 제공합니다.

UIEvent 인터페이스의 인스턴스를 생성하려면, 선택적으로 UIEventInit 딕셔너리를 UIEvent 생성자에 전달하세요.

새로 정의된 이벤트의 경우, 단순히 사용자 인터페이스와 관련이 있다고 해서 UIEvent 인터페이스를 상속할 필요는 없습니다. UIEventInit 멤버가 해당 이벤트에 유효할 때만 상속하세요.

3.2.1.1. UIEvent
[Exposed=Window]
interface UIEvent : Event {
  constructor(DOMString type, optional UIEventInit eventInitDict = {});
  readonly attribute Window? view;
  readonly attribute long detail;
};
UIEvent . view
view 속성은 이벤트가 생성된 Window를 식별합니다.

이 속성의 초기화되지 않은 값null이어야 합니다.

UIEvent . detail
이벤트 타입에 따라 Event 에 대한 상세 정보를 지정합니다.

이 속성의 초기화되지 않은 값0이어야 합니다.

3.2.1.2. UIEventInit
dictionary UIEventInit : EventInit {
  Window? view = null;
  long detail = 0;
};
UIEventInit . view
이 이벤트가 디스패치될 글로벌 환경의 Window 객체로 초기화되어야 합니다. 만약 이 이벤트가 요소에 디스패치될 경우, view 속성은 해당 요소의 ownerDocument를 포함하는 Window 객체로 설정되어야 합니다.
UIEventInit . detail
이 값은 애플리케이션마다 다르게 초기화되는 숫자값입니다.

3.2.2. UIEvent 알고리즘

3.2.2.1. UIEvent 초기화
입력

event: 초기화할 UIEvent

eventType: 이벤트 타입을 담고 있는 DOMString

eventTarget: 이벤트의 EventTarget

bubbles: 이 이벤트가 버블링되는 경우 true

cancelable: 이 이벤트가 취소 가능한 경우 true

출력

없음

  1. 기본 Event 속성을 초기화합니다:

    1. 이벤트 초기화event, eventType, bubbles, cancelable로 수행

    2. event.target = eventTarget

  2. 다음 공개 속성을 초기화합니다:

    1. event.view = eventTarget노드 문서Window 객체로 설정

    2. event.detail = 0

  3. 다음 과거 속성을 초기화합니다:

    1. event.which = 0 (MouseEventKeyboardEvent 모두에서 사용됨)

3.2.3. UIEvent 타입

사용자 인터페이스 이벤트 타입들은 아래에 나열되어 있습니다. 이들 중 일부 이벤트는 사용자 인터페이스에서 생성된 경우 UIEvent 인터페이스를 사용하지만, 그렇지 않은 경우 각 이벤트 설명대로 Event 인터페이스를 사용합니다.

3.2.3.1. load
타입 load
인터페이스 UIEvent (사용자 인터페이스에서 생성된 경우), Event (그 외)
동기 / 비동기 비동기
버블링 아니오
신뢰할 수 있는 타겟 Window, Document, Element
취소 가능 아니오
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

user agent는 DOM 구현이 리소스(예: 문서)와 종속 리소스(이미지, 스타일시트, 스크립트 등)를 모두 로드 완료했을 때 이 이벤트를 반드시 디스패치해야 합니다. 종속 리소스가 로드에 실패하더라도, 해당 리소스를 로드한 객체가 DOM에서 접근 가능하다면 이 이벤트가 발생되는 것을 막아서는 안 됩니다. 이 이벤트 타입이 디스패치될 경우, 구현체는 반드시 Document 노드에서 최소한 이 이벤트를 디스패치해야 합니다.

레거시 이유로, 문서 내부 리소스(예: 이미지)에 대한 load 이벤트는 HTML 구현에서 Window가 전파 경로에 포함되지 않습니다. 자세한 내용은 [HTML5]를 참조하세요.

3.2.3.2. unload
타입 unload
인터페이스 UIEvent (사용자 인터페이스에서 생성된 경우), Event (그 외)
동기 / 비동기 동기
버블링 아니오
신뢰할 수 있는 타겟 Window, Document, Element
취소 가능 아니오
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

user agent는 DOM 구현이 환경에서 리소스(예: 문서) 또는 종속 리소스(이미지, 스타일시트, 스크립트 등)를 제거할 때 이 이벤트를 반드시 디스패치해야 합니다. 문서는 이 이벤트 타입이 디스패치된 후 반드시 언로드되어야 합니다. 이 이벤트 타입이 디스패치될 경우, 구현체는 반드시 Document 노드에서 최소한 이 이벤트를 디스패치해야 합니다.

3.2.3.3. abort
타입 abort
인터페이스 UIEvent (사용자 인터페이스에서 생성된 경우), Event (그 외)
동기 / 비동기 동기
버블링 아니오
신뢰할 수 있는 타겟 Window, Element
취소 가능 아니오
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

user agent는 리소스 로딩이 중단된 경우(예: 사용자가 로딩 중에 취소한 경우) 이 이벤트를 반드시 디스패치해야 합니다.

3.2.3.4. error
타입 error
인터페이스 UIEvent (사용자 인터페이스에서 생성된 경우), Event (그 외)
동기 / 비동기 비동기
버블링 아니오
신뢰할 수 있는 타겟 Window, Element
취소 가능 아니오
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

user agent는 리소스가 로드에 실패했거나, 로드되었지만 해당 의미에 따라 해석할 수 없는 경우(예: 잘못된 이미지, 스크립트 실행 오류, 비정형 XML 등) 이 이벤트를 반드시 디스패치해야 합니다.

3.2.3.5. select
타입 select
인터페이스 UIEvent (사용자 인터페이스에서 생성된 경우), Event (그 외)
동기 / 비동기 동기
버블링
신뢰할 수 있는 타겟 Element
취소 가능 아니오
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

user agent는 사용자가 텍스트를 선택할 때 반드시 이 이벤트를 디스패치해야 합니다. 이 이벤트는 선택이 완료된 다음에 디스패치됩니다.

이 명세서는 선택된 텍스트를 접근할 수 있는 컨텍스트 정보를 제공하지 않습니다. 해당되는 경우 호스트 언어는 사용자가 콘텐츠를 선택하는 방법(국제 언어 관례를 고려), select 이벤트가 언제 디스패치되는지, 콘텐츠 작성자가 선택된 콘텐츠에 어떻게 접근할 수 있는지에 대한 규칙을 정의해야 합니다.

콘텐츠 작성자는 사용자가 선택한 콘텐츠에 접근하기 위해 호스트 언어의 고유 기능(예: HTML Editing APIs의 Document.getSelection() 메서드 [Editing])을 사용할 수 있습니다.

select 이벤트는 모든 요소와 모든 언어에서 항상 사용 가능한 것은 아닙니다. 예를 들어, [HTML5]에서는 select 이벤트가 폼 inputtextarea 요소에서만 디스패치될 수 있습니다. 구현체는 폼 컨트롤 외부의 텍스트 선택, 이미지 또는 SVG와 같은 마크업 선택 등 적절하다고 판단되는 모든 컨텍스트에서 select 이벤트를 디스패치할 수 있습니다.

3.3. 포커스 이벤트

이 인터페이스와 관련된 이벤트 타입 및 § 3.3.2 포커스 이벤트 순서User Agent Accessibility Guidelines 2.0 [UAAG20]의 개념과 지침에 따라 설계되었으며, 특히 포커스 메커니즘포커스에 대한 용어집 항목에 주목하였습니다.

3.3.1. FocusEvent 인터페이스

이 명세에서 도입됨

FocusEvent 인터페이스는 포커스 이벤트와 관련된 특정 컨텍스트 정보를 제공합니다.

FocusEvent 인터페이스의 인스턴스를 생성하려면, FocusEvent 생성자에 선택적으로 FocusEventInit 딕셔너리를 전달하세요.

3.3.1.1. FocusEvent
[Exposed=Window]
interface FocusEvent : UIEvent {
  constructor(DOMString type, optional FocusEventInit eventInitDict = {});
  readonly attribute EventTarget? relatedTarget;
};
FocusEvent . relatedTarget
Focus 이벤트와 관련된 두 번째 EventTarget 을 식별할 때 사용되며, 이벤트 타입에 따라 달라집니다.

중첩된 브라우징 컨텍스트에서 탭 이동 시 보안상의 이유로, 관련 EventTargetnull이어야 합니다.

이 속성의 초기화되지 않은 값null이어야 합니다.

3.3.1.2. FocusEventInit
dictionary FocusEventInit : UIEventInit {
  EventTarget? relatedTarget = null;
};
FocusEventInit . relatedTarget
relatedTarget 은 포커스가 사라지는 요소(focusfocusin 이벤트의 경우) 또는 포커스가 생기는 요소(blurfocusout 이벤트의 경우)로 초기화되어야 합니다.

3.3.2. 포커스 이벤트 순서

이 명세에서 정의된 포커스 이벤트는 서로 일정한 순서로 발생합니다. 포커스가 요소 간에 이동할 때(초기에는 포커스된 요소가 없는 것으로 가정), 일반적인 이벤트 순서는 다음과 같습니다:

이벤트 타입 설명
사용자가 포커스를 이동
1 focus 첫 번째 타겟 요소가 포커스를 받을 때 전송됨
2 focusin focus 이벤트 이후 발생
사용자가 포커스를 이동
3 blur 첫 번째 타겟 요소가 포커스를 잃을 때 전송됨
4 focusout blur 이벤트 이후 발생
5 focus 두 번째 타겟 요소가 포커스를 받을 때 전송됨
6 focusin focus 이벤트 이후 발생

이 명세서는 focus() 혹은 blur()와 같은 메서드로 상호작용할 때의 포커스 이벤트 동작을 정의하지 않습니다. 해당 메서드가 정의된 관련 명세를 참조하세요.

3.3.3. 문서 포커스와 포커스 컨텍스트

이 이벤트 모듈에는 문서 포커스 변경 알림을 위한 이벤트 타입이 포함되어 있습니다. 이와 관련하여 세 가지 구분되는 포커스 컨텍스트가 있습니다:

이 명세에서 정의된 이벤트 타입은 오직 문서 포커스만 다루며, 이벤트 세부 정보에서 식별된 event target은 반드시 문서나 해당 창의 문서 내의 일부여야 하며, 브라우저나 운영체제의 일부가 되어서는 안 됩니다. 포커스 컨텍스트 간 전환 시에도 마찬가지입니다.

일반적으로 문서에는 항상 포커스된 요소(문서 요소 자체일 수도 있음)와 지속적인 포커스 링이 존재합니다. 포커스 컨텍스트를 전환해도 문서의 현재 포커스된 요소와 포커스 링은 보통 유지됩니다. 예를 들어, 문서에 포커스 가능한 요소가 3개 있고 두 번째 요소에 포커스가 있을 때, 사용자가 운영체제 포커스를 다른 애플리케이션으로 옮겼다가 다시 브라우저로 돌아오면, 두 번째 요소가 여전히 문서 내에서 포커스를 유지하며, 탭 키로 세 번째 요소로 포커스를 이동할 수 있습니다. 호스트 언어는 포커스를 받을 수 있는 요소, 포커스를 받을 수 있는 조건, 포커스를 변경하는 방법, 포커스 변경 순서 등을 구체적으로 정의할 수 있습니다. 예를 들어, 어떤 경우에는 포인터를 이동하여 포커스를 줄 수 있고, 다른 경우에는 마우스 클릭이 필요할 수 있습니다. 일부 요소는 포커스를 받을 수 없으며, 일부는 특정 방법(요소 클릭)으로만 포커스를 받을 수 있고, 탭 키로는 불가능할 수도 있습니다. 문서는 여러 개의 포커스 링을 가질 수 있습니다. 다른 명세에서는 이 명세보다 더 복잡한 포커스 모델(예: 여러 요소가 동시에 현재 포커스를 가질 수 있음)을 정의할 수 있습니다.

3.3.4. 포커스 이벤트 타입

포커스 이벤트 타입은 아래에 나열되어 있습니다.

3.3.4.1. blur
타입 blur
인터페이스 FocusEvent
동기 / 비동기 동기
버블링 아니오
신뢰할 수 있는 타겟 Window, Element
취소 가능 아니오
Composed
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

user agentevent target이 포커스를 잃을 때 반드시 이 이벤트를 디스패치해야 합니다. 이 이벤트 타입이 디스패치되기 전에 해당 요소에서 포커스를 제거해야 합니다. 이 이벤트 타입은 focusout과 유사하지만 버블링되지 않습니다.

3.3.4.2. focus
타입 focus
인터페이스 FocusEvent
동기 / 비동기 동기
버블링 아니오
신뢰할 수 있는 타겟 Window, Element
취소 가능 아니오
Composed
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

user agentevent target이 포커스를 받을 때 반드시 이 이벤트를 디스패치해야 합니다. 이 이벤트 타입이 디스패치되기 전에 해당 요소에 포커스를 부여해야 합니다. 이 이벤트 타입은 focusin과 유사하지만 버블링되지 않습니다.

3.3.4.3. focusin
타입 focusin
인터페이스 FocusEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 타겟 Window, Element
취소 가능 아니오
Composed
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

user agentevent target이 포커스를 받을 때 반드시 이 이벤트를 디스패치해야 합니다. event target은 포커스를 받은 요소여야 합니다. focus 이벤트가 이 이벤트 타입보다 먼저 발생해야 합니다. 이 이벤트 타입은 focus와 유사하지만 버블링됩니다.

3.3.4.4. focusout
타입 focusout
인터페이스 FocusEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 타겟 Window, Element
취소 가능 아니오
Composed
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

user agentevent target이 포커스를 잃을 때 반드시 이 이벤트를 디스패치해야 합니다. event target은 포커스를 잃은 요소여야 합니다. blur 이벤트가 이 이벤트 타입보다 먼저 발생해야 합니다. 이 이벤트 타입은 blur와 유사하지만 버블링됩니다.

3.4. 마우스 이벤트

마우스 이벤트 모듈은 [HTML401]onclick, ondblclick, onmousedown, onmouseup, onmouseover, onmousemove, onmouseout 속성에서 기원합니다. 이 이벤트 모듈은 마우스나 트랙볼 같은 포인팅 입력 장치와 함께 사용하도록 특별히 설계되었습니다.

3.4.1. MouseEvent 인터페이스

DOM Level 2에서 도입, 이 명세에서 수정됨

MouseEvent 인터페이스는 마우스 이벤트와 관련된 특정 컨텍스트 정보를 제공합니다.

중첩된 요소의 경우, 마우스 이벤트는 항상 가장 깊이 중첩된 요소를 타겟으로 합니다.

타겟이 된 요소의 상위 요소들은 이벤트 버블링을 통해 그 하위 요소에서 발생한 마우스 이벤트 알림을 받을 수 있습니다.

MouseEvent 인터페이스의 인스턴스를 생성하려면, MouseEvent 생성자에 선택적으로 MouseEventInit 딕셔너리를 전달하세요.

MouseEvent 객체를 initMouseEvent로 초기화할 때, 구현체는 clientXclientY 를 사용하여 다른 좌표(예: DOM Level 0 구현이나 기타 독점적 속성에서 노출하는 target 좌표, pageX 등)를 계산할 수 있습니다.

3.4.1.1. MouseEvent
[Exposed=Window]
interface MouseEvent : UIEvent {
  constructor(DOMString type, optional MouseEventInit eventInitDict = {});
  readonly attribute long screenX;
  readonly attribute long screenY;
  readonly attribute long clientX;
  readonly attribute long clientY;
  readonly attribute long layerX;
  readonly attribute long layerY;

  readonly attribute boolean ctrlKey;
  readonly attribute boolean shiftKey;
  readonly attribute boolean altKey;
  readonly attribute boolean metaKey;

  readonly attribute short button;
  readonly attribute unsigned short buttons;

  readonly attribute EventTarget? relatedTarget;

  boolean getModifierState(DOMString keyArg);
};
screenX, 타입 long, readonly
이벤트가 발생한 스크린 좌표 원점 기준의 수평 좌표입니다.

이 속성의 초기화되지 않은 값0이어야 합니다.

screenY, 타입 long, readonly
이벤트가 발생한 스크린 좌표 원점 기준의 수직 좌표입니다.

이 속성의 초기화되지 않은 값0이어야 합니다.

clientX, 타입 long, readonly
이벤트가 발생한 뷰포트 기준의 수평 좌표입니다.

이 속성의 초기화되지 않은 값0이어야 합니다.

clientY, 타입 long, readonly
이벤트가 발생한 뷰포트 기준의 수직 좌표입니다.

이 속성의 초기화되지 않은 값0이어야 합니다.

layerX, 타입 long, readonly
가장 가까운 조상 요소(예: 스태킹 컨텍스트, 포지셔닝된 박스, 스태킹 컨텍스트 페인팅 시 포지셔닝 단계에서 페인팅하는 요소) 기준의 수평 오프셋입니다.

이 속성의 초기화되지 않은 값0이어야 합니다.

layerY, 타입 long, readonly
가장 가까운 조상 요소(예: 스태킹 컨텍스트, 포지셔닝된 박스, 스태킹 컨텍스트 페인팅 시 포지셔닝 단계에서 페인팅하는 요소) 기준의 수직 오프셋입니다.

이 속성의 초기화되지 않은 값0이어야 합니다.

ctrlKey, 타입 boolean, readonly
KeyboardEventctrlKey 속성을 참고하세요.

이 속성의 초기화되지 않은 값false이어야 합니다.

shiftKey, 타입 boolean, readonly
KeyboardEventshiftKey 속성을 참고하세요.

이 속성의 초기화되지 않은 값false이어야 합니다.

altKey, 타입 boolean, readonly
KeyboardEventaltKey 속성을 참고하세요.

이 속성의 초기화되지 않은 값false이어야 합니다.

metaKey, 타입 boolean, readonly
KeyboardEventmetaKey 속성을 참고하세요.

이 속성의 초기화되지 않은 값false이어야 합니다.

button, 타입 short, readonly
마우스 버튼의 눌림이나 해제에 의해 발생하는 마우스 이벤트 동안 button 은 어떤 포인터 장치의 버튼이 상태가 변경되었는지 나타내는 데 사용되어야 합니다.

button 속성의 값은 다음과 같아야 합니다:

  • 0: 장치의 기본 버튼(일반적으로 왼쪽 버튼 또는 단일 버튼 장치의 유일한 버튼, UI 컨트롤 활성화 또는 텍스트 선택에 사용) 또는 초기화되지 않은 값

  • 1: 보조 버튼(일반적으로 가운데 버튼, 종종 마우스 휠과 함께)

  • 2: 보조 버튼(일반적으로 오른쪽 버튼, 컨텍스트 메뉴 표시에 사용)

  • 3: X1(뒤로) 버튼

  • 4: X2(앞으로) 버튼

일부 포인팅 장치는 더 많은 버튼 상태를 제공하거나 시뮬레이션하며, 2보다 큰 값 또는 0보다 작은 값이 해당 버튼을 나타내는 데 사용될 수 있습니다.

button 값은 마우스 버튼의 눌림/해제에 의해 발생하지 않은 이벤트에서는 갱신되지 않습니다. 이런 경우 0 값을 왼쪽 버튼으로 해석하지 말고 초기화되지 않은 값으로 해석해야 합니다.

mousedownmouseup과 같은 이벤트의 기본 동작은 사용 중인 특정 마우스 버튼에 따라 달라집니다.

이 속성의 초기화되지 않은 값0이어야 합니다.

buttons, 타입 unsigned short, readonly
모든 마우스 이벤트 동안 buttons 는 현재 눌린 마우스 버튼 조합을 비트마스크로 나타내는 데 사용되어야 합니다.

buttons 속성의 값과 button 속성의 값은 매우 다릅니다. button 값은 mousedown / mouseup 이벤트 핸들러에서 유효하며, buttons 속성은 신뢰된 MouseEvent 객체가 디스패치되는 동안 마우스 버튼의 상태를 반영합니다(현재 활성 버튼 없음(0)도 나타낼 수 있음).

buttons 속성의 값은 다음과 같아야 합니다:

  • 0: 현재 활성 버튼 없음

  • 1: 장치의 기본 버튼(일반적으로 왼쪽 버튼 또는 단일 버튼 장치의 유일한 버튼, UI 컨트롤 활성화 또는 텍스트 선택에 사용)

  • 2: 보조 버튼(일반적으로 오른쪽 버튼, 컨텍스트 메뉴 표시에 사용, 있을 경우)

  • 4: 보조 버튼(일반적으로 가운데 버튼, 종종 마우스 휠과 함께)

일부 포인팅 장치는 더 많은 버튼을 제공하거나 시뮬레이션하며, 각 버튼마다 값은 2배씩 증가해야 합니다(8, 16, 32, ... 와 같이 이진수 시리즈).

버튼 값의 합은 항상 고유한 숫자이므로, 콘텐츠 작성자는 비트 연산으로 현재 몇 개의 버튼이 눌려 있는지와 어떤 버튼이 눌려 있는지 임의의 개수의 마우스 버튼에 대해 판별할 수 있습니다. 예를 들어, 3은 왼쪽과 오른쪽 버튼이 동시에 눌려 있음을, 5는 왼쪽과 가운데 버튼이 동시에 눌려 있음을 나타냅니다.

mousedownmouseup과 같은 이벤트의 기본 동작은 사용 중인 특정 마우스 버튼에 따라 달라집니다.

이 속성의 초기화되지 않은 값0이어야 합니다.

relatedTarget, 타입 EventTarget, readonly, nullable
UI 이벤트와 관련된 두 번째 EventTarget 을 식별할 때 사용됩니다. 이벤트 타입에 따라 달라집니다.

이 속성의 초기화되지 않은 값null이어야 합니다.

getModifierState(keyArg)

이 명세에서 도입됨

키 값으로 modifier의 상태를 질의합니다.

modifier 키이고 modifier가 활성화된 경우 true를, 그렇지 않으면 false를 반환합니다.

DOMString keyArg
KeyboardEventgetModifierState() 메서드의 해당 파라미터 설명을 참고하세요.
3.4.1.2. MouseEventInit
dictionary MouseEventInit : EventModifierInit {
  long screenX = 0;
  long screenY = 0;
  long clientX = 0;
  long clientY = 0;

  short button = 0;
  unsigned short buttons = 0;
  EventTarget? relatedTarget = null;
};
screenX, 타입 long, 기본값 0
screenX 속성을 MouseEvent 객체의 마우스 포인터가 사용자의 화면에서 원하는 수평 상대 위치로 초기화합니다.

이벤트 객체를 지정한 마우스 위치로 초기화해도 사용자의 마우스 포인터가 그 위치로 이동되어서는 안 됩니다.

screenY, 타입 long, 기본값 0
screenY 속성을 MouseEvent 객체의 마우스 포인터가 사용자의 화면에서 원하는 수직 상대 위치로 초기화합니다.

이벤트 객체를 지정한 마우스 위치로 초기화해도 사용자의 마우스 포인터가 그 위치로 이동되어서는 안 됩니다.

clientX, 타입 long, 기본값 0
clientX 속성을 MouseEvent 객체의 마우스 포인터가 사용자의 브라우저 클라이언트 창 기준으로 원하는 수평 위치로 초기화합니다.

이벤트 객체를 지정한 마우스 위치로 초기화해도 사용자의 마우스 포인터가 그 위치로 이동되어서는 안 됩니다.

clientY, 타입 long, 기본값 0
clientY 속성을 MouseEvent 객체의 마우스 포인터가 사용자의 브라우저 클라이언트 창 기준으로 원하는 수직 위치로 초기화합니다.

이벤트 객체를 지정한 마우스 위치로 초기화해도 사용자의 마우스 포인터가 그 위치로 이동되어서는 안 됩니다.

button, 타입 short, 기본값 0
button 속성을 MouseEvent 객체의 마우스 버튼 상태를 나타내는 숫자로 초기화합니다.

값 0은 주 마우스 버튼, 1은 보조/가운데 마우스 버튼, 2는 오른쪽 마우스 버튼을 나타냅니다. 2보다 큰 숫자도 사용될 수 있지만, 이 문서에서는 명시되지 않습니다.

buttons, 타입 unsigned short, 기본값 0
buttons 속성을 MouseEvent 객체의 하나 이상의 마우스 버튼이 활성 상태임을 나타내는 숫자로 초기화합니다.

buttons 속성은 비트필드입니다. 마스크 값 1을 비트필드 값에 적용했을 때 true라면 주 마우스 버튼이 눌려 있는 것이고, 마스크 값 2가 true이면 오른쪽 마우스 버튼이 눌려 있는 것이며, 마스크 값 4가 true이면 보조/가운데 버튼이 눌려 있는 것입니다.

JavaScript에서 buttons 속성을 오른쪽(2)과 가운데(4) 버튼이 동시에 눌린 것처럼 초기화하려면, buttons 값을 다음과 같이 할당할 수 있습니다:
{ buttons: 2 | 4 }
또는:
{ buttons: 6 }

relatedTarget, 타입 EventTarget, nullable, 기본값 null
relatedTarget은 마우스 포인터가 막 벗어난 요소(mouseover 또는 mouseenter 이벤트의 경우) 또는 마우스 포인터가 막 진입하는 요소(mouseout, mouseleave, focusout 이벤트의 경우)로 초기화되어야 합니다. 다른 이벤트인 경우 이 값은 할당하지 않아도 되며 기본값은 null입니다.

구현체는 마우스 이벤트를 생성할 때 현재 클릭 횟수를 반드시 유지해야 합니다. 이는 특정 시간 내에 포인팅 장치 버튼이 연속으로 클릭된 횟수를 나타내는 0 이상의 정수여야 합니다. 클릭 횟수 리셋 딜레이는 환경 설정에 따라 다릅니다.

3.4.2. 이벤트 수정자 초기화자

MouseEventKeyboardEvent 인터페이스는 키보드 수정자 속성 집합을 공유하며, 추가 수정자 상태를 가져오는 메커니즘을 지원합니다. 다음 딕셔너리는 MouseEventKeyboardEvent 인터페이스의 키보드 수정자 속성을 초기화하고, getModifierState() 를 통해 질의되는 추가 수정자 상태도 초기화할 수 있게 해줍니다. 이 딕셔너리를 사용한 이벤트 생성 단계는 MouseEvent 생성자 섹션에 정의되어 있습니다.

dictionary EventModifierInit : UIEventInit {
  boolean ctrlKey = false;
  boolean shiftKey = false;
  boolean altKey = false;
  boolean metaKey = false;

  boolean modifierAltGraph = false;
  boolean modifierCapsLock = false;
  boolean modifierFn = false;
  boolean modifierFnLock = false;
  boolean modifierHyper = false;
  boolean modifierNumLock = false;
  boolean modifierScrollLock = false;
  boolean modifierSuper = false;
  boolean modifierSymbol = false;
  boolean modifierSymbolLock = false;
};
ctrlKey, 타입 boolean, 기본값 false
ctrlKey 속성을 MouseEvent 또는 KeyboardEvent 객체에 Control 키 수정자가 활성 상태일 때 true, 그렇지 않으면 false로 초기화합니다.

true인 경우, 구현체는 이벤트 객체의 키 수정자 상태도 getModifierState() 또는 getModifierState()Control을 파라미터로 넘겼을 때 true를 반환하도록 초기화해야 합니다.

shiftKey, 타입 boolean, 기본값 false
shiftKey 속성을 MouseEvent 또는 KeyboardEvent 객체에 Shift 키 수정자가 활성 상태일 때 true, 그렇지 않으면 false로 초기화합니다.

true인 경우, 구현체는 이벤트 객체의 키 수정자 상태도 getModifierState() 또는 getModifierState()Shift를 파라미터로 넘겼을 때 true를 반환하도록 초기화해야 합니다.

altKey, 타입 boolean, 기본값 false
altKey 속성을 MouseEvent 또는 KeyboardEvent 객체에 Alt(대체) 또는 Option 키 수정자가 활성 상태일 때 true, 그렇지 않으면 false로 초기화합니다.

true인 경우, 구현체는 이벤트 객체의 키 수정자 상태도 getModifierState() 또는 getModifierState()Alt를 파라미터로 넘겼을 때 true를 반환하도록 초기화해야 합니다.

metaKey, 타입 boolean, 기본값 false
metaKey 속성을 MouseEvent 또는 KeyboardEvent 객체에 Meta 키 수정자가 활성 상태일 때 true, 그렇지 않으면 false로 초기화합니다.

true인 경우, 구현체는 이벤트 객체의 키 수정자 상태도 getModifierState() 또는 getModifierState()Meta를 파라미터로 넘겼을 때 true를 반환하도록 초기화해야 합니다.

modifierAltGraph, 타입 boolean, 기본값 false
이벤트 객체의 키 수정자 상태를 getModifierState() 또는 getModifierState()AltGraph를 파라미터로 넘겼을 때 true를 반환하도록 초기화합니다.
modifierCapsLock, 타입 boolean, 기본값 false
이벤트 객체의 키 수정자 상태를 getModifierState() 또는 getModifierState()CapsLock를 파라미터로 넘겼을 때 true를 반환하도록 초기화합니다.
modifierFn, 타입 boolean, 기본값 false
이벤트 객체의 키 수정자 상태를 getModifierState() 또는 getModifierState()Fn를 파라미터로 넘겼을 때 true를 반환하도록 초기화합니다.
modifierFnLock, 타입 boolean, 기본값 false
이벤트 객체의 키 수정자 상태를 getModifierState() 또는 getModifierState()FnLock를 파라미터로 넘겼을 때 true를 반환하도록 초기화합니다.
modifierHyper, 타입 boolean, 기본값 false
이벤트 객체의 키 수정자 상태를 getModifierState() 또는 getModifierState()Hyper를 파라미터로 넘겼을 때 true를 반환하도록 초기화합니다.
modifierNumLock, 타입 boolean, 기본값 false
이벤트 객체의 키 수정자 상태를 getModifierState() 또는 getModifierState()NumLock를 파라미터로 넘겼을 때 true를 반환하도록 초기화합니다.
modifierScrollLock, 타입 boolean, 기본값 false
이벤트 객체의 키 수정자 상태를 getModifierState() 또는 getModifierState()ScrollLock를 파라미터로 넘겼을 때 true를 반환하도록 초기화합니다.
modifierSuper, 타입 boolean, 기본값 false
이벤트 객체의 키 수정자 상태를 getModifierState() 또는 getModifierState()Super를 파라미터로 넘겼을 때 true를 반환하도록 초기화합니다.
modifierSymbol, 타입 boolean, 기본값 false
이벤트 객체의 키 수정자 상태를 getModifierState() 또는 getModifierState()Symbol를 파라미터로 넘겼을 때 true를 반환하도록 초기화합니다.
modifierSymbolLock, 타입 boolean, 기본값 false
이벤트 객체의 키 수정자 상태를 getModifierState() 또는 getModifierState()SymbolLock를 파라미터로 넘겼을 때 true를 반환하도록 초기화합니다.
3.4.2.1. 마우스 이벤트 생성

일반적으로 Event 인터페이스 또는 Event 인터페이스에서 상속된 인터페이스의 생성자가 호출될 때, [DOM]에 설명된 절차를 따라야 합니다. 그러나 MouseEvent 인터페이스는 Event 객체의 키 수정자 내부 상태를 초기화하는 데 사용할 수 있는 추가 딕셔너리 멤버를 제공합니다. 즉, getModifierState() 메서드로 질의되는 내부 상태입니다. 이 섹션은 새로운 MouseEvent 객체를 초기화할 때 DOM4의 절차를 보완하여 이러한 선택적 수정자 상태를 포함합니다.

MouseEvent 또는 아래 알고리즘을 사용하여 이들 객체에서 파생된 객체를 생성할 때, 모든 MouseEvent 및 파생 객체는 내부 키 수정자 상태를 가지며, 키 수정자 이름을 사용해서 Modifier Keys 표([UIEvents-Key] 참조)에 따라 설정 및 조회할 수 있습니다.

다음 단계는 DOM4에서 이벤트를 생성하는 알고리즘을 보완합니다:

3.4.3. MouseEvent 알고리즘

3.4.3.1. 네이티브 OS 요구사항

이 섹션의 알고리즘은 네이티브 플랫폼 OS가 다음을 제공한다고 가정합니다:

이러한 이벤트에 대해 OS는 다음 정보를 제공할 수 있습니다:

3.4.3.2. MouseEvent의 전역 상태
3.4.3.2.1. User Agent 수준 상태

UA는 전체 User Agent에 대해 공유되는 다음 값을 유지해야 합니다.

마우스 버튼의 현재 상태를 추적하는 마우스 버튼 비트마스크가 있습니다.

3.4.3.2.2. Window 수준 상태

UA는 각 Window에 대해 공유되는 다음 값을 유지해야 합니다.

마지막으로 Element 에 마우스 이벤트를 전송한 기록을 담는 마지막 마우스 요소 값(초기값 undefined)이 있습니다.

가장 최근 마우스 이벤트가 전송된 시점의 마지막 마우스 요소의 조상 Element들을 스냅샷으로 담는 마지막 마우스 DOM 경로 값(초기값 빈 값)이 있습니다.

3.4.3.3. MouseEvent의 내부 상태

MouseEvent 는 다양한 수정자 키의 상태를 추적하기 위한 다음 내부 플래그를 가집니다: shift 플래그, control 플래그, alt 플래그, altgraph 플래그, 그리고 meta 플래그. 해당 마우스 이벤트 시점에 해당 수정자 키가 눌린 경우 이 플래그가 설정됩니다.

3.4.3.4. MouseEvent 초기화
입력

event: 초기화할 MouseEvent

eventType: 이벤트 타입을 담고 있는 DOMString

eventTarget: 이벤트의 EventTarget

bubbles: 이 이벤트가 버블링되는 경우 true

cancelable: 이 이벤트가 취소 가능한 경우 true

출력

없음

  1. UIEvent 초기화event, eventType, eventTarget, bubbles, cancelable로 수행

  2. 다음 공개 속성을 초기화합니다:

    1. event.screenX = 이벤트가 발생한 위치의 x좌표(데스크톱 원점 기준)

    2. event.screenY = 이벤트가 발생한 위치의 y좌표(데스크톱 원점 기준)

    3. event.clientX = 이벤트가 발생한 위치의 x좌표(뷰포트 원점 기준)

    4. event.clientY = 이벤트가 발생한 위치의 y좌표(뷰포트 원점 기준)

    5. 마우스 이벤트 수정자 설정event로 수행

    6. event.button = 0

    7. event.buttons = 마우스 버튼 비트마스크

  3. MouseEvent에 대한 PointerLock 속성 초기화event로 수행

3.4.3.5. 마우스 이벤트 수정자 설정
입력

event, 업데이트할 MouseEvent

출력

없음

  1. 키 수정자 상태에 "Shift"가 포함되어 있으면 eventshift flag를 설정하고, 그렇지 않으면 해제한다.

  2. 키 수정자 상태에 "Control"이 포함되어 있으면 eventcontrol flag를 설정하고, 그렇지 않으면 해제한다.

  3. 키 수정자 상태에 "Alt"가 포함되어 있으면 eventalt flag를 설정하고, 그렇지 않으면 해제한다.

  4. 키 수정자 상태에 "AltGraph"가 포함되어 있으면 eventaltgraph flag를 설정하고, 그렇지 않으면 해제한다.

  5. 키 수정자 상태에 "Meta"가 포함되어 있으면 eventmeta flag를 설정하고, 그렇지 않으면 해제한다.

  6. event의 shift flag가 설정되어 있으면 event.shiftKey = true, 아니면 false로 설정한다.

  7. event의 control flag가 설정되어 있으면 event.ctrlKey = true, 아니면 false로 설정한다.

  8. event의 alt flag 또는 altgraph flag가 설정되어 있으면 event.altKey = true, 아니면 false로 설정한다.

  9. event의 meta flag가 설정되어 있으면 event.metaKey = true, 아니면 false로 설정한다.

3.4.3.6. 취소 가능한 MouseEvent 생성
입력

eventType, 유효한 MouseEvent 타입을 포함하는 DOMString

eventTarget, 이벤트의 EventTarget

출력

없음

  1. bubbles를 "true"로 한다.

  2. cancelable를 "true"로 한다.

  3. event = 새 이벤트 생성의 결과로 MouseEvent를 사용한다.

  4. MouseEvent를 초기화한다. 인자로 event, eventType, eventTarget, bubbles, cancelable를 전달한다.

  5. event를 반환한다.

3.4.3.7. 취소 불가능한 MouseEvent 생성
입력

eventType, 유효한 MouseEvent 타입을 포함하는 DOMString

eventTarget, 이벤트의 EventTarget

출력

없음

  1. bubbles를 "false"로 한다.

  2. cancelable를 "false"로 한다.

  3. event = 새 이벤트 생성의 결과로 MouseEvent를 사용한다.

  4. MouseEvent를 초기화한다. 인자로 event, eventType, eventTarget, bubbles, cancelable를 전달한다.

  5. event를 반환한다.

3.4.3.8. MouseEvent 버튼 속성 계산
입력

mbutton, 마우스 버튼을 식별하는 ID

출력

MouseEventbutton 속성에 저장하기 적합한 버튼 ID

  1. mbutton이 기본 마우스 버튼이면 0을 반환한다.

  2. mbutton이 보조(가운데) 마우스 버튼이면 1을 반환한다.

  3. mbutton이 보조 마우스 버튼이면 2를 반환한다.

  4. mbutton이 X1(뒤로가기) 버튼이면 3을 반환한다.

  5. mbutton이 X2(앞으로가기) 버튼이면 4를 반환한다.

3.4.3.9. 네이티브로부터 MouseEvent 속성 설정
입력

event, 초기화할 MouseEvent

native, 네이티브 마우스 이벤트

출력

없음

TODO

  1. event.type 이 [ mousedown, mouseup ] 중 하나라면,

    1. mbuttonnative에서 어떤 마우스 버튼이 눌렸는지 식별하는 ID로 한다.

    2. event.button = MouseEvent 버튼 속성 계산 결과를 mbutton으로 한다.

3.4.3.10. 네이티브 마우스 다운 처리
입력

native, 네이티브 mousedown

출력

없음

  1. mbuttonnative에서 어떤 마우스 버튼이 눌렸는지 식별하는 ID로 한다.

  2. 마우스 버튼 비트마스크를 다음과 같이 업데이트한다:

    1. mbutton이 기본 마우스 버튼이면 0x01 비트를 설정한다.

    2. mbutton이 보조 마우스 버튼이면 0x02 비트를 설정한다.

    3. mbutton이 보조(가운데) 마우스 버튼이면 0x04 비트를 설정한다.

    다른 버튼은 0x08부터 추가할 수 있다.

  3. target = hit testnative의 뷰포트 상대 좌표로 실행한 결과로 한다.

  4. event = 취소 가능한 MouseEvent 생성에서 "mousedown", target을 인자로 한다.

  5. 네이티브로부터 MouseEvent 속성 설정native로 실행한다.

  6. 포인터다운 이벤트 전송 여부 결정event로 실행한다.

  7. result = dispatch event at target

  8. result가 true이고 target포커스 가능한 영역이며 클릭으로 포커스 가능하다면,

    1. 포커스 단계target에서 실행한다.

  9. mbutton이 보조 마우스 버튼이면,

    1. 컨텍스트 메뉴 표시 여부 결정native, target으로 실행한다.

3.4.3.11. 네이티브 마우스 업 처리
입력

native, 네이티브 mouseup

출력

없음

마우스 다운과 업 사이에 다른 마우스 이벤트가 발생할 수 있다.

  1. mbuttonnative에서 어떤 마우스 버튼이 눌렸는지 식별하는 ID로 한다.

  2. 마우스 버튼 비트마스크를 다음과 같이 업데이트한다:

    1. mbutton이 기본 마우스 버튼이면 0x01 비트를 클리어한다.

    2. mbutton이 보조 마우스 버튼이면 0x02 비트를 클리어한다.

    3. mbutton이 보조(가운데) 마우스 버튼이면 0x04 비트를 클리어한다.

  3. target = hit testnative의 뷰포트 상대 좌표로 실행한 결과로 한다.

  4. event = 취소 가능한 MouseEvent 생성에서 "mouseup", target을 인자로 한다.

  5. 네이티브로부터 MouseEvent 속성 설정native로 실행한다.

  6. 포인터업 이벤트 전송 여부 결정event로 실행한다.

  7. dispatch event at target

3.4.3.12. 네이티브 마우스 클릭 처리
입력

native, 네이티브 마우스 클릭

출력

없음

플랫폼은 네이티브 마우스 업 처리 직후, 클릭을 생성하는 mouseup에 대해 이 알고리즘을 즉시 호출해야 한다.

  1. target = hit testnative의 뷰포트 상대 좌표로 실행한 결과로 한다.

  2. 클릭 이벤트 전송nativetarget으로 실행한다.

3.4.3.13. 클릭 이벤트 전송
입력

native, 네이티브 mousedown

target, 이벤트의 EventTarget

출력

없음

  1. mbutton = 1 (기본 마우스 버튼이 기본값)

  2. native가 유효하면,

    1. mbuttonnative에서 어떤 마우스 버튼이 눌렸는지 식별하는 ID로 한다.

  3. eventType = mbutton이 기본 마우스 버튼이면 "click", 아니면 "auxclick"로 설정한다.

  4. event = PointerEvent 생성에서 eventTypetarget을 인자로 한다.

  5. native가 유효하면,

    1. 네이티브로부터 MouseEvent 속성 설정event, native로 실행한다.

    2. event.screenX가 정수값이 아니면 반올림한다.

    3. event.screenY가 정수값이 아니면 반올림한다.

  6. dispatch event at target

PointerEvents와 반올림된 좌표에 대한 정보는 pointerevents/100 참고.

모든 "기본 동작"은 dispatch 중 activation behavior 알고리즘 실행으로 처리되므로, 여기서 따로 처리할 필요 없다. 단, 기존 명세가 disabled/css-pointer-events/inert/...를 제대로 처리하는지 검증 필요.

`HTMLelement.click()`을 처리하려면 이 알고리즘을 native = null, target = `HTMLelement`로 호출한다.

키보드로 시작된 클릭을 처리하려면 이 알고리즘을 native = null, target = 현재 포커스된 요소로 호출한다.

3.4.3.14. 네이티브 마우스 더블 클릭 처리
입력

native, 네이티브 마우스 더블 클릭

출력

없음

더블 클릭을 생성하는 마우스 클릭에 대해 네이티브 마우스 클릭 처리 직후 호출해야 한다.

  1. mbuttonnative에서 어떤 마우스 버튼이 눌렸는지 식별하는 ID로 한다.

  2. mbutton이 기본 마우스 버튼이 아니면 return한다.

  3. target = hit testnative의 뷰포트 상대 좌표로 실행한 결과로 한다.

  4. event = PointerEvent 생성에서 "dblclick"과 target을 인자로 한다.

  5. 네이티브로부터 MouseEvent 속성 설정event, native로 실행한다.

  6. event.screenX가 정수값이 아니면 반올림한다.

  7. event.screenY가 정수값이 아니면 반올림한다.

  8. dispatch event at target

3.4.3.15. 네이티브 마우스 이동 처리
입력

native, 네이티브 마우스 이동

출력

없음

이 알고리즘은 PointerEvent의 dispatch에 대해 명시적으로 정의되지 않았기 때문에 가정을 한다. pointerevents/285가 해결되면 업데이트가 필요할 수 있다.

  1. target = hit testnative의 뷰포트 상대 좌표로 실행한 결과로 한다.

  2. targetDomPath = DOM 경로 계산을 실행한다.

  3. 현재 요소를 떠나는 이벤트를 생성한다:

    1. last mouse element가 정의되어 있고 target과 다르다면,

      1. mouseout = 취소 가능한 MouseEvent 생성을 "mouseout"과 last mouse element로 실행한다.

      TODO: mouseout의 속성을 native에서 설정. +CSSOM 속성

      1. 포인터 out 이벤트 전송 여부 결정mouseout으로 실행한다.

      2. Dispatch mouseouttarget에 실행한다.

        취소될 때의 동작을 확인 필요(영향 없는 것으로 보임).

      3. leaveElementslast mouse DOM path의 복사본에서 targetDomPath와 공통된 모든 요소를 제거한 값으로 한다.

      4. leaveElements의 각 element에 대해:

        element가 삭제된 경우, 이동한 경우 처리 필요. DOM 변이가 mouseleave 이벤트를 트리거해야 할지, 지금 보내야 할지, 버려야 할지 등 현재 브라우저 동작을 확인 필요.

        1. mouseleave = 취소 불가능한 MouseEvent 생성을 "mouseleave"와 element로 실행한다.

        2. mouseleave.composed = false로 설정한다.

          event.composed 값 호환성 확인. 명세는 false. Chrome/Linux = true. Firefox/Linux = false.

        3. 포인터 leave 이벤트 전송 여부 결정mouseleave로 실행한다.

        4. result = dispatch mouseleaveelement에 실행한다.

  4. 새 요소로 진입하는 이벤트를 생성한다:

    1. targetlast mouse element가 아니면,

      1. mouseover = 취소 가능한 MouseEvent 생성을 "mouseover"와 target으로 실행한다.

      TODO: mouseout의 속성을 native에서 설정. +CSSOM 속성

      1. 포인터 over 이벤트 전송 여부 결정mouseover로 실행한다.

      2. Dispatch mouseouttarget에 실행한다.

        취소될 때의 동작을 확인 필요(영향 없는 것으로 보임).

      3. enterElementstargetDomPath의 복사본에서 last mouse DOM path와 공통된 모든 요소를 제거한 값으로 한다.

      4. enterElements의 각 element에 대해:

        element가 삭제되거나 이동된 경우 처리 필요.

        1. mouseenter = 취소 불가능한 MouseEvent 생성을 "mouseenter"와 element로 실행한다.

        2. mouseenter.composed = false로 설정한다.

          event.composed 값 호환성 확인. 명세는 false. Chrome/Linux = true. Firefox/Linux = false.

        3. 포인터 enter 이벤트 전송 여부 결정mouseenter로 실행한다.

        shadow DOM 요소 호환성 확인. Chrome/Linux는 이 이벤트를 요소와 shadow root에 모두 발생시킴.

        1. result = dispatch mouseenterelement에 실행한다.

      5. last mouse elementtarget으로 설정한다.

      6. last mouse DOM pathtargetDomPath로 설정한다.

  5. mousemove = 취소 가능한 MouseEvent 생성을 "mousemove"와 element로 실행한다.

  6. 마우스 이동에 대한 PointerLock 속성 설정

  7. 포인터 move 이벤트 전송 여부 결정mousemove로 실행한다.

  8. Dispatch mousemoveelement에 실행한다.

3.4.3.16. 컨텍스트 메뉴 표시 여부 결정
입력

native, 네이티브 mousedown 또는 포인터 이벤트

target, 이벤트의 EventTarget

출력

없음

  1. menuevent = PointerEvent 생성을 "contextmenu"와 target으로 실행한다.

  2. native가 유효하면,

    1. 네이티브로부터 MouseEvent 속성 설정native로 실행한다.

  3. result = dispatch menueventtarget에 실행한다.

  4. result가 true이면 UA 컨텍스트 메뉴를 표시한다.

키보드로 트리거된 컨텍스트 메뉴를 처리하려면 이 알고리즘을 native = null, target = 현재 포커스된 요소로 호출한다.

3.4.4. 마우스 이벤트 순서

이 명세에서 정의된 특정 마우스 이벤트는 반드시 서로에 대해 정해진 순서대로 발생해야 한다. 아래는 포인팅 장치의 커서가 요소 위로 이동할 때 반드시 발생해야 하는 이벤트 시퀀스를 보여준다:

이벤트 유형 요소 비고
1 mousemove
포인팅 장치가 요소 A로 이동...
2 mouseover A
3 mouseenter A
4 mousemove A 여러 번의 mousemove 이벤트 발생
포인팅 장치가 요소 A를 벗어남...
5 mouseout A
6 mouseleave A

포인팅 장치가 요소 A로 이동한 다음, 중첩된 요소 B로 이동했다가 다시 밖으로 나가면 다음 시퀀스의 이벤트가 반드시 발생해야 한다:

이벤트 유형 요소 비고
1 mousemove
포인팅 장치가 요소 A로 이동...
2 mouseover A
3 mouseenter A
4 mousemove A 여러 번의 mousemove 이벤트 발생
포인팅 장치가 중첩된 요소 B로 이동...
5 mouseout A
6 mouseover B
7 mouseenter B
8 mousemove B 여러 번의 mousemove 이벤트 발생
포인팅 장치가 요소 B에서 A로 이동...
9 mouseout B
10 mouseleave B
11 mouseover A
12 mousemove A 여러 번의 mousemove 이벤트 발생
포인팅 장치가 요소 A를 벗어남...
13 mouseout A
14 mouseleave A

요소가 CSS를 이용해 시각적으로 겹칠 수도 있다. 아래 예시에서는 A, B, C로 표시된 세 요소가 웹 페이지에서 동일한 크기와 절대 위치를 가진다. 요소 C는 B의 자식, B는 A의 자식이다:

그래픽: 세 개의 요소가 모두 겹쳐져 있고, 가장 아래가 A, 가장 위가 C
세 개의 요소가 모두 겹쳐진 상태에서 포인팅 장치가 스택 위를 이동하는 그래픽 표현.

포인팅 장치가 요소 스택 외부에서 C(스택의 최상단 요소)로 이동한 뒤 다시 벗어나면 다음 이벤트 시퀀스가 반드시 발생해야 한다:

이벤트 유형 요소 비고
1 mousemove
포인팅 장치가 요소 C(스택의 최상단)로 이동
2 mouseover C
3 mouseenter A
4 mouseenter B
5 mouseenter C
6 mousemove C 여러 번의 mousemove 이벤트 발생
포인팅 장치가 요소 C를 벗어남...
7 mouseout C
8 mouseleave C
9 mouseleave B
10 mouseleave A

mouseover/mouseout 이벤트는 한 번만 발생하며, mouseenter/mouseleave 이벤트는 세 번(각 요소마다 한 번씩) 발생한다.

포인팅 장치(마우스, 트랙패드 등)와 연결된 버튼을 요소 위에서 누르고 놓을 때의 일반적인 이벤트 시퀀스는 다음과 같다:

이벤트 유형 비고
1 mousedown
2 mousemove 선택적, 여러 번 발생, 일부 제한 있음
3 mouseup
4 click
5 mousemove 선택적, 여러 번 발생, 일부 제한 있음
6 mousedown
7 mousemove 선택적, 여러 번 발생, 일부 제한 있음
8 mouseup
9 click
10 dblclick

mousedownmouseup 사이에 허용되는 mousemove 이벤트의 지연 시간, 정도, 거리, 횟수는 구현, 장치, 플랫폼별로 다르다. 이 허용치는 불안정한 손 등 신체적 장애를 가진 사용자가 포인팅 장치로 상호작용할 때 도움을 줄 수 있다.

각 구현체는 적절한 히스테리시스 허용치를 결정하며, 일반적으로 mousedownmouseup 이벤트의 대상이 같은 요소이고 그 사이에 mouseout 또는 mouseleave 이벤트가 없으면 clickdblclick 이벤트를 발생시켜야 하며, mousedownmouseup 이벤트 대상이 다르면 가장 가까운 공통 포함 조상에서 clickdblclick 이벤트를 발생시켜야 한다.

만약 mousedown 이벤트가 HTML 문서의 body 요소에서 발생하고, 해당 mouseup 이벤트가 루트 요소에서 발생한다면, click 이벤트는 루트 요소에 디스패치된다. 이는 가장 가까운 공통 포함 조상이기 때문이다.

만약 이벤트 대상(예: 타깃 요소)이 마우스 이벤트 시퀀스 중에 DOM에서 제거된다면, 해당 시퀀스의 나머지 이벤트는 해당 요소에 대해 발생하지 않아야 한다.

만약 mousedown 이벤트 결과로 타깃 요소가 DOM에서 제거되면, 해당 요소에 대해 mouseup, click, dblclick 및 기본 활성화 이벤트가 디스패치되지 않는다. 그러나 mouseup 이벤트는 초기 타깃 요소가 제거된 후 마우스에 노출된 요소에 대해 여전히 발생한다. 마찬가지로 mouseup 이벤트 디스패치 중에 타깃 요소가 제거되면 click 및 이후 이벤트는 디스패치되지 않는다.

3.4.5. 마우스 이벤트 유형

마우스 이벤트 유형은 아래에 나열되어 있습니다. 중첩된 요소의 경우, 마우스 이벤트 유형은 항상 가장 깊게 중첩된 요소를 대상으로 합니다. 대상 요소의 조상은 버블링을 통해 그 자손 요소에서 발생한 마우스 이벤트를 통지받을 수 있습니다.

3.4.5.1. auxclick
유형 auxclick
인터페이스 PointerEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 타깃 Element
취소 가능
Composed
기본 동작 상황에 따라 다름
컨텍스트
(trusted events)

auxclick 이벤트 유형은 포인터가 가리키는 최상위 이벤트 타깃에서, 사용자가 주 포인터 버튼이 아닌 버튼을 눌렀다가 놓거나 그와 유사한 동작을 했을 때 반드시 디스패치되어야 합니다. 마우스 버튼의 동작 방식은 포인터 장치 및 환경 설정에 따라 달라질 수 있으며, 화면 위치나 버튼 누름/해제 사이의 지연에 따라 달라질 수 있습니다.

auxclick 이벤트는 주 포인터 버튼이 아닌 경우에만 발생해야 합니다 (즉, button 값이 0이 아니고, buttons 값이 1보다 큰 경우). 주 버튼(예: 표준 마우스의 왼쪽 버튼)은 auxclick 이벤트를 발생시키면 안 됩니다. 주 버튼에 대응하는 이벤트는 click을 참고하세요.

auxclick 이벤트는 같은 요소에서 mousedownmouseup 이벤트가 발생한 뒤에 이어질 수 있으며, 노드 종류(예: 텍스트 노드) 변화는 무시합니다. 환경 설정에 따라 auxclick 이벤트는 mouseover, mousemove, mouseout 등의 이벤트가 버튼을 누르고 놓는 사이에 발생하더라도 디스패치될 수 있습니다.

auxclick 이벤트 유형의 기본 동작은 이벤트의 이벤트 타깃button 또는 buttons 속성값에 따라 달라질 수 있습니다. auxclick 이벤트 유형의 대표적인 기본 동작은 다음과 같습니다:

가운데 버튼에 대해 auxclick을 수신 및 처리하는 예시.
myLink.addEventListener("auxclick", function(e) { if (e.button === 1) { // 예를 들어, 링크에서 가운데 클릭 시 새 탭이 열리는 기본 동작을 막는다. e.preventDefault(); // 앱에 맞게 링크나 버튼을 새 탭에서 열거나, 탭 스트립의 탭을 닫는 동작 등 // 가운데 버튼 클릭에 대한 동작을 여기서 처리할 수 있다. } });

오른쪽 버튼의 경우 auxclick 이벤트는 contextmenu 이벤트 이후에 디스패치됩니다. 일부 사용자 에이전트는 컨텍스트 메뉴가 표시되는 동안 모든 입력 이벤트를 삼키기 때문에, 이런 경우 auxclick 이벤트를 앱에서 받을 수 없을 수도 있습니다. 자세한 설명은 이 예시를 참고하세요.

오른쪽 버튼에 대해 auxclick을 수신 및 처리하는 예시
myDiv.addEventListener("contextmenu", function(e) { // 이 호출로 페이지가 이벤트를 받을 수 있도록 컨텍스트 메뉴가 표시되지 않게 함 e.preventDefault(); }); myDiv.addEventListener("auxclick", function(e) { if (e.button === 2) { // 앱 내에서 커스텀 컨텍스트 메뉴를 표시하는 등 오른쪽 버튼 클릭에 대한 동작을 처리한다. } });

3.4.5.2. click
유형 click
인터페이스 PointerEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 타깃 Element
취소 가능
Composed
기본 동작 상황에 따라 다름
컨텍스트
(trusted events)

click 이벤트 유형은 포인터가 가리키는 최상위 이벤트 타깃에서, 사용자가 주 포인터 버튼을 눌렀다가 놓거나 그와 유사한 동작을 했을 때 반드시 디스패치되어야 합니다. 마우스 버튼의 동작 방식은 포인터 장치 및 환경 설정에 따라 달라질 수 있으며, 화면 위치나 버튼 누름/해제 사이의 지연에 따라 달라질 수 있습니다.

click 이벤트는 주 포인터 버튼(즉, button 값이 0, buttons 값이 1일 때)에서만 발생해야 합니다. 보조 버튼(표준 마우스의 가운데 또는 오른쪽 버튼 등)은 click 이벤트를 발생시키면 안 됩니다. 보조 버튼에 대응하는 이벤트는 auxclick을 참고하세요.

click 이벤트는 같은 요소에서 mousedownmouseup 이벤트가 발생한 뒤에 이어질 수 있으며, 노드 종류(예: 텍스트 노드) 변화는 무시합니다. 환경 설정에 따라 click 이벤트는 mouseover, mousemove, mouseout 등의 이벤트가 버튼을 누르고 놓는 사이에 발생하더라도 디스패치될 수 있습니다. click 이벤트는 dblclick 이벤트의 앞에 발생할 수도 있습니다.

사용자가 큰 line-height로 스타일링된 <p> 요소의 자식 텍스트 노드 위에서 마우스를 다운한 후, 마우스를 약간 움직여 더 이상 텍스트가 있는 영역에 있지 않지만 해당 <p> 요소의 블록 내(즉, 같은 텍스트 블록의 줄 사이에 위치하며, 텍스트 노드 위는 아님)에 머무르고 있다가 마우스 업을 하면, 보통 click 이벤트가 발생합니다(일반적인 히스테리시스 내라면), 사용자가 같은 요소 범위 내에 머물렀기 때문입니다. 참고로, 사용자 에이전트가 생성하는 마우스 이벤트는 텍스트 노드에 디스패치되지 않습니다.

포인터 장치와 연관된 것 외에도, click 이벤트 유형은 요소 활성화의 일부로 반드시 디스패치되어야 합니다.

접근성을 최대화하려면, 콘텐츠 저자는 커스텀 컨트롤에 대한 활성화 동작을 정의할 때 click 이벤트 유형을 사용하는 것이 좋으며, mousedown 또는 mouseup 과 같은 포인터 장치별 이벤트를 사용하는 것보다 권장됩니다. click 이벤트 유형은 포인터 장치(예: 마우스)에서 시작됐지만, 이후 구현 개선으로 장치 독립적인 요소 활성화 이벤트로 확장되었습니다.

click 이벤트 유형의 기본 동작은 이벤트의 이벤트 타깃button 또는 buttons 속성값에 따라 달라질 수 있습니다. click 이벤트 유형의 대표적인 기본 동작은 다음과 같습니다:

3.4.5.3. contextmenu
유형 contextmenu
인터페이스 PointerEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 타깃 Element
취소 가능
Composed
기본 동작 지원되는 경우 컨텍스트 메뉴 호출
컨텍스트
(trusted events)

사용자 에이전트는 컨텍스트 메뉴를 호출하기 전에 반드시 이 이벤트를 디스패치해야 한다.

contextmenu 이벤트가 오른쪽 마우스 버튼에 의해 트리거되는 경우, contextmenu 이벤트는 반드시 mousedown 이벤트 이후에 디스패치되어야 한다.

플랫폼에 따라 contextmenu 이벤트는 mouseup 이벤트보다 먼저 또는 나중에 디스패치될 수 있다.

3.4.5.4. dblclick
유형 dblclick
인터페이스 MouseEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 타깃 Element
취소 가능
Composed
기본 동작 없음
컨텍스트
(trusted events)

사용자 에이전트는 포인팅 장치의 기본 버튼이 요소에서 두 번 클릭되면 반드시 이 이벤트를 디스패치해야 합니다. 더블 클릭의 정의는 환경 설정에 따라 달라지지만, 이벤트 타겟은 mousedown, mouseup, dblclick 모두에서 동일해야 합니다. 이 이벤트 타입은 클릭과 더블 클릭이 동시에 발생한 경우 click 이벤트 타입 이후에, 그렇지 않으면 mouseup 이벤트 타입 이후에 반드시 디스패치되어야 합니다.

click 이벤트와 마찬가지로, dblclick 이벤트는 주 포인터 버튼에서만 발생해야 하며, 보조 버튼에서는 dblclick 이벤트를 발생시키면 안 된다.

click 이벤트를 취소해도 dblclick 이벤트 발생에는 영향을 주지 않는다.

click 이벤트 유형과 마찬가지로, dblclick 이벤트 유형의 기본 동작은 이벤트의 이벤트 타깃button 또는 buttons 속성값에 따라 달라질 수 있다. dblclick 이벤트 유형의 대표적인 기본 동작click 이벤트 유형과 동일하다.

3.4.5.5. mousedown
유형 mousedown
인터페이스 MouseEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 타깃 Element
취소 가능
Composed
기본 동작 상황에 따라 다름: 드래그/드롭 작업 시작; 텍스트 선택 시작; 스크롤/팬 상호작용 시작(가운데 마우스 버튼 지원 시)
컨텍스트
(trusted events)

사용자 에이전트는 포인팅 장치 버튼이 요소 위에서 눌릴 때 반드시 이 이벤트를 디스패치해야 한다.

많은 구현체는 mousedown 이벤트를 다양한 상황별 기본 동작을 시작하는 데 사용한다. 이 이벤트가 취소되면 이러한 기본 동작을 막을 수 있다. 예를 들어: 이미지나 링크의 드래그/드롭, 텍스트 선택 시작 등. 또한, 일부 구현체는 가운데 마우스 버튼이 눌릴 때 마우스 기반 팬 기능을 제공하며, 이 기능은 mousedown 이벤트가 디스패치될 때 활성화된다.

3.4.5.6. mouseenter
유형 mouseenter
인터페이스 MouseEvent
동기 / 비동기 동기
버블링 아니오
신뢰할 수 있는 타깃 Element
취소 가능 아니오
Composed 아니오
기본 동작 없음
컨텍스트
(trusted events)

사용자 에이전트는 포인팅 장치가 요소 또는 그 자손의 경계로 이동할 때 반드시 이 이벤트를 디스패치해야 한다. 사용자 에이전트는 또한 요소 또는 그 자손이 주 포인팅 장치 아래로 이동할 때도 반드시 이 이벤트를 디스패치해야 한다. 이 이벤트 유형은 mouseover와 유사하지만, 버블링되지 않으며 포인터 장치가 요소에서 그 자손의 경계로 이동할 때는 디스패치되면 안 된다.

이 이벤트 유형과 CSS :hover 의사 클래스 [CSS2] 사이에는 유사점이 있다. mouseleave 이벤트 유형도 참고.

3.4.5.7. mouseleave
유형 mouseleave
인터페이스 MouseEvent
동기 / 비동기 동기
버블링 아니오
신뢰할 수 있는 대상 Element
취소 가능 아니오
합성 여부 아니오
기본 동작 없음
컨텍스트
(신뢰할 수 있는 이벤트)

사용자 에이전트는 포인팅 장치가 요소와 그 모든 하위 요소의 경계를 벗어날 때 반드시 이 이벤트를 발생시켜야 한다. 또한 사용자 에이전트는 요소 또는 그 하위 요소가 더 이상 주요 포인팅 장치 아래에 위치하지 않게 될 때도 이 이벤트를 발생시켜야 한다. 이 이벤트 유형은 mouseout과 유사하지만, 버블링되지 않으며 포인팅 장치가 요소와 모든 자식의 경계를 완전히 벗어나기 전까지 발생하지 않는다는 점에서 다르다.

이 이벤트 유형과 CSS :hover 의사 클래스 [CSS2]와의 유사점이 있다. mouseenter 이벤트 유형도 참고하라.

3.4.5.8. mousemove
유형 mousemove
인터페이스 MouseEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Element
취소 가능
합성 여부
기본 동작 없음
컨텍스트
(신뢰할 수 있는 이벤트)

사용자 에이전트는 포인팅 장치가 요소 위에 있을 때 장치가 움직이면 반드시 이 이벤트를 발생시켜야 한다. 포인터 장치가 움직이는 동안 이벤트가 발생하는 빈도는 구현, 장치, 플랫폼에 따라 다르지만, 지속적인 포인터 장치 이동에는 여러 번의 연속 mousemove 이벤트가 발생해야 하며, 마우스 이동이 있을 때마다 단일 이벤트만 발생해서는 안 된다. 구현체는 응답성과 성능의 균형을 고려하여 최적의 빈도를 결정할 것을 권장한다.

일부 구현 환경(예: 브라우저)에서는 사용자가 드래그 작업(예: 마우스 버튼을 누름)을 시작한 경우 포인팅 장치가 사용자 에이전트의 경계를 벗어나더라도 mousemove 이벤트가 계속 발생할 수 있다.

이 이벤트는 이전에는 DOM Level 2 Events에서 취소 불가로 명시되었으나, 사용자 에이전트 간의 상호운용성을 반영하여 변경되었다.

3.4.5.9. mouseout
유형 mouseout
인터페이스 MouseEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Element
취소 가능
합성 여부
기본 동작 없음
컨텍스트
(신뢰할 수 있는 이벤트)

사용자 에이전트는 포인팅 장치가 요소의 경계를 벗어나거나 요소가 더 이상 주요 포인팅 장치 아래에 위치하지 않게 될 때 반드시 이 이벤트를 발생시켜야 한다. 이 이벤트 유형은 mouseleave와 유사하지만, 버블링되며 포인터 장치가 요소에서 그 하위 요소의 경계로 이동할 때 반드시 발생한다는 점에서 다르다.

mouseover 이벤트 유형도 참고하라.

3.4.5.10. mouseover
유형 mouseover
인터페이스 MouseEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Element
취소 가능
합성 여부
기본 동작 없음
컨텍스트
(신뢰할 수 있는 이벤트)

사용자 에이전트는 포인팅 장치가 요소의 경계로 진입하거나 요소가 주요 포인팅 장치 아래에 위치하게 될 때 반드시 이 이벤트를 발생시켜야 한다. 이 이벤트 유형은 mouseenter와 유사하지만, 버블링되며 포인터 장치가 동일한 이벤트 대상에 대한 동일한 이벤트 리스너 인스턴스의 조상 요소의 경계로 이동할 때 반드시 발생한다는 점에서 다르다.

mouseout 이벤트 유형도 참고하라.

3.4.5.11. mouseup
유형 mouseup
인터페이스 MouseEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Element
취소 가능
합성 여부
기본 동작 없음
컨텍스트
(신뢰할 수 있는 이벤트)

사용자 에이전트는 포인팅 장치 버튼이 요소 위에서 해제될 때 반드시 이 이벤트를 발생시켜야 한다.

일부 구현 환경(예: 브라우저)에서는 포인팅 장치가 사용자 에이전트의 경계를 벗어나더라도 mouseup 이벤트가 발생할 수 있다. 예를 들어 사용자가 마우스 버튼을 누른 채 드래그 작업을 시작한 경우 등이다.

3.5. 휠 이벤트

휠은 하나 이상의 공간 차원에서 회전할 수 있는 장치이며 포인팅 장치와 연관될 수 있습니다. 좌표계는 환경 구성에 따라 달라집니다.

사용자의 환경은 수직 스크롤을 y축 회전에, 수평 스크롤을 x축 회전에, 그리고 줌을 z축 회전에 연관시키도록 구성될 수 있습니다.

WheelEvent 객체의 deltaX, deltaY, deltaZ 속성은 해당 축을 따라 픽셀, 줄 또는 페이지 단위의 측정값을 나타냅니다. 보고되는 측정값은 환경별 알고리즘에 의해 실제 휠 장치의 회전/이동을 적절한 값과 단위로 변환한 후 제공됩니다.

사용자의 환경 설정에 따라 실제 휠 장치의 회전/이동을 다르게 해석할 수 있습니다. 일반적인 덴트(dented) 마우스 휠의 한 번 움직임은 162픽셀 측정값을 만들 수 있습니다(162는 예시값이며 실제 값은 사용자 에이전트의 현재 화면 크기에 따라 달라집니다). 하지만 사용자는 기본 환경 설정을 변경해 마우스 휠 속도를 높여 이 숫자를 증가시킬 수 있습니다. 더 나아가 일부 마우스 휠 소프트웨어는 가속(휠을 더 빠르게 돌릴수록 각 측정의 delta가 커짐) 또는 서브픽셀 회전 측정을 지원할 수 있습니다. 따라서 작성자는 한 사용자 에이전트에서의 회전 양이 모든 사용자 에이전트에서 동일한 delta 값을 생성한다고 가정할 수 없습니다.

deltaX, deltaY, deltaZ 속성 값의 부호(양수/음수)는 실제 휠 장치가 동일 방향으로 회전/이동하는 동안 여러 번 wheel 이벤트가 발생해도 일관되어야 합니다. 만약 사용자 에이전트가 wheel 이벤트의 기본 동작으로 스크롤을 수행한다면, delta의 부호는 오른손 좌표계에 따라 X, Y, Z축의 양수 방향이 각각 문서의 가장 오른쪽, 가장 아래쪽, 그리고 가장 깊은(사용자와 멀어지는) 방향임을 나타내야 합니다.

개별 사용자 에이전트는(환경 및 하드웨어 구성에 따라) 동일한 휠 물리적 동작을 다르게 해석할 수 있습니다. 예를 들어 트랙패드의 가장자리에서 위에서 아래로 수직 스와이프하면 휠 동작으로 해석되어 페이지를 아래로 스크롤하거나 페이지를 위로 팬(즉, 각각 양수 또는 음수 deltaY 값)할 수 있습니다.

사용자 에이전트는 첫 번째 휠 이벤트가 발생하면 휠 이벤트 트랜잭션을 생성해야 하며, 이후 구현별 시간 내의 모든 휠 이벤트가 동일 요소에 대상으로 지정될 수 있습니다. 휠 이벤트 트랜잭션은 단일 사용자 제스처와 연관된 일련의 휠 이벤트입니다. 휠 이벤트 트랜잭션은 첫 번째 휠 이벤트가 발생한 시점의 최상위 이벤트 대상을 이벤트 대상으로 가져야 합니다.

스크롤 가능한 요소에서 시작된 일련의 휠 이벤트가 자식 요소 위에서 시작된다면, 동일 사용자 제스처의 이후 이벤트는 자식 요소 위에서 발생할 수 있습니다.

3.5.1. 인터페이스 WheelEvent

이 명세서에서 도입됨

WheelEvent 인터페이스는 wheel 이벤트와 연관된 구체적 컨텍스트 정보를 제공합니다.

WheelEvent 인터페이스의 인스턴스를 생성하려면, WheelEvent 생성자에 선택적 WheelEventInit 딕셔너리를 전달하세요.

3.5.1.1. WheelEvent
[Exposed=Window]
interface WheelEvent : MouseEvent {
  constructor(DOMString type, optional WheelEventInit eventInitDict = {});
  // DeltaModeCode
  const unsigned long DOM_DELTA_PIXEL = 0x00;
  const unsigned long DOM_DELTA_LINE  = 0x01;
  const unsigned long DOM_DELTA_PAGE  = 0x02;

  readonly attribute double deltaX;
  readonly attribute double deltaY;
  readonly attribute double deltaZ;
  readonly attribute unsigned long deltaMode;
};
DOM_DELTA_PIXEL
delta의 측정 단위는 반드시 픽셀이어야 합니다. 이는 대부분의 운영체제 및 구현 환경에서 가장 일반적인 경우입니다.
DOM_DELTA_LINE
delta의 측정 단위는 반드시 개별 텍스트 줄이어야 합니다. 이는 많은 폼 컨트롤에서 해당됩니다.
DOM_DELTA_PAGE
delta의 측정 단위는 반드시 페이지이어야 하며, 한 화면 또는 구분된 페이지로 정의될 수 있습니다.
deltaX, 타입 double, 읽기 전용
wheel 이벤트의 기본 동작이 스크롤인 사용자 에이전트에서는, 이 값은 이벤트가 취소되지 않은 경우 x축(픽셀, 줄, 페이지)의 스크롤 양이어야 합니다. 그렇지 않으면 휠 장치의 x축 이동(픽셀, 줄, 페이지)의 구현별 측정값입니다.

이 속성의 초기화되지 않은 값0.0이어야 합니다.

deltaY, 타입 double, 읽기 전용
wheel 이벤트의 기본 동작이 스크롤인 사용자 에이전트에서는, 이 값은 이벤트가 취소되지 않은 경우 y축(픽셀, 줄, 페이지)의 스크롤 양이어야 합니다. 그렇지 않으면 휠 장치의 y축 이동(픽셀, 줄, 페이지)의 구현별 측정값입니다.

이 속성의 초기화되지 않은 값0.0이어야 합니다.

deltaZ, 타입 double, 읽기 전용
wheel 이벤트의 기본 동작이 스크롤인 사용자 에이전트에서는, 이 값은 이벤트가 취소되지 않은 경우 z축(픽셀, 줄, 페이지)의 스크롤 양이어야 합니다. 그렇지 않으면 휠 장치의 z축 이동(픽셀, 줄, 페이지)의 구현별 측정값입니다.

이 속성의 초기화되지 않은 값0.0이어야 합니다.

deltaMode, 타입 unsigned long, 읽기 전용
deltaMode 속성은 delta 값의 측정 단위를 나타냅니다. 기본값은 DOM_DELTA_PIXEL (픽셀)입니다.

이 속성은 반드시 delta 값의 단위를 나타내는 DOM_DELTA 상수 중 하나로 설정되어야 합니다. 정확한 측정 단위는 장치, 운영체제, 애플리케이션 구성에 따라 다릅니다.

이 속성의 초기화되지 않은 값0이어야 합니다.

3.5.1.2. WheelEventInit
dictionary WheelEventInit : MouseEventInit {
  double deltaX = 0.0;
  double deltaY = 0.0;
  double deltaZ = 0.0;
  unsigned long deltaMode = 0;
};
deltaX, 타입 double, 기본값 0.0
deltaZ 속성 참조.
deltaY, 타입 double, 기본값 0.0
deltaZ 속성 참조.
deltaZ, 타입 double, 기본값 0.0
deltaZ 속성의 초기화에 사용됩니다. 이 속성(그리고 deltaX, deltaY 속성 포함)은 오른손 좌표계에서 X, Y, Z축이 각각 문서의 가장 오른쪽, 아래쪽, 가장 깊은(사용자와 멀어지는) 방향임을 기준으로 양수 값을 가집니다. 음수 값은 반대 방향입니다.
deltaMode, 타입 unsigned long, 기본값 0
deltaMode 속성을 0, 1, 2 중 하나의 열거값으로 초기화합니다. 각각은 휠의 회전이 스크롤을 야기한 경우 픽셀(DOM_DELTA_PIXEL), 줄(DOM_DELTA_LINE), 페이지(DOM_DELTA_PAGE) 단위의 스크롤 양을 나타냅니다.

3.5.2. 휠 이벤트 유형

3.5.2.1. wheel
유형 wheel
인터페이스 WheelEvent
동기 / 비동기 비동기
버블링
신뢰할 수 있는 대상 Element
취소 가능 상황에 따라 다름
합성 여부
기본 동작 문서 스크롤(또는 줌)
컨텍스트
(신뢰할 수 있는 이벤트)
  • Event.target : 현재 휠 이벤트 트랜잭션의 요소 대상
  • UIEvent.view : Window
  • UIEvent.detail : 0
  • MouseEvent.screenX : 휠이 포인팅 장치와 연관된 경우 화면상의 포인터 위치에 기반한 값, 아니면 0
  • MouseEvent.screenY : 휠이 포인팅 장치와 연관된 경우 화면상의 포인터 위치에 기반한 값, 아니면 0
  • MouseEvent.clientX : 휠이 포인팅 장치와 연관된 경우 뷰포트 내 포인터 위치에 기반한 값, 아니면 0
  • MouseEvent.clientY : 휠이 포인팅 장치와 연관된 경우 뷰포트 내 포인터 위치에 기반한 값, 아니면 0
  • MouseEvent.altKey : true일 때 Alt 수정키가 활성화됨, 아니면 false
  • MouseEvent.ctrlKey : true일 때 Control 수정키가 활성화됨, 아니면 false
  • MouseEvent.shiftKey : true일 때 Shift 수정키가 활성화됨, 아니면 false
  • MouseEvent.metaKey : true일 때 Meta 수정키가 활성화됨, 아니면 false
  • MouseEvent.button : 휠이 포인팅 장치와 연관된 경우 현재 눌린 버튼에 기반한 값, 아니면 0
  • MouseEvent.buttons : 휠이 포인팅 장치와 연관된 경우 현재 눌려진 모든 버튼에 기반한 값, 버튼이 없으면 0
  • MouseEvent.relatedTarget : 포인팅 장치가 가리키고 있는 이벤트 대상(있다면)
  • WheelEvent.deltaX : deltaMode 단위에 따라 페이지가 x축으로 스크롤될 예상 양, 또는 휠의 x축 이동의 구현별 값
  • WheelEvent.deltaY : deltaMode 단위에 따라 페이지가 y축으로 스크롤될 예상 양, 또는 휠의 y축 이동의 구현별 값
  • WheelEvent.deltaZ : deltaMode 단위에 따라 페이지가 z축으로 스크롤될 예상 양, 또는 휠의 z축 이동의 구현별 값
  • WheelEvent.deltaMode : deltaX, deltaY, deltaZ 속성의 단위(픽셀, 줄, 페이지)

사용자 에이전트는 마우스 휠이 어떤 축으로든 회전되었을 때, 또는 동등한 입력장치(마우스볼, 특정 태블릿 또는 터치패드 등)가 그러한 동작을 에뮬레이션한 경우 반드시 이 이벤트를 발생시켜야 합니다. 플랫폼 및 입력 장치에 따라, 대각선 휠 delta는 하나의 wheel 이벤트에 여러 축에 대해 모두 비영(0이 아닌) 값을 제공하거나, 각 축마다 별도의 wheel 이벤트로 전달될 수 있습니다.

일반적으로 wheel 이벤트 유형의 기본 동작은 문서를 지정된 양만큼 스크롤(또는 경우에 따라 줌)하는 것입니다. 이 이벤트가 취소되면 구현체는 문서를 스크롤하거나 줌하지 말아야 하며(또는 이 이벤트 유형에 연관된 기타 구현별 기본 동작 수행 금지),

일부 사용자 에이전트나 입력장치에서는 휠이 빨리 회전될수록 delta 값이 커질 수 있습니다.

3.5.2.2. 휠 이벤트의 취소 가능성

휠 이벤트에서 preventDefault를 호출하면 스크롤을 방지하거나 중단시킬 수 있습니다. 최대 스크롤 성능을 위해, 사용자 에이전트는 스크롤과 연관된 각 휠 이벤트가 취소될지 확인하기 위해 처리될 때까지 기다리지 않을 수 있습니다. 이런 경우 사용자 에이전트는 cancelable 속성이 falsewheel 이벤트를 생성해야 하며, 이는 preventDefault로 스크롤을 방지하거나 중단할 수 없음을 의미합니다. 그렇지 않은 경우 cancelabletrue입니다.

특히, 사용자 에이전트는 비수동(non-passive) 리스너가 없는 것을 관찰하면 오직 취소 불가 wheel 이벤트만 생성해야 합니다.

3.6. 입력 이벤트

입력 이벤트는 사용자의 직접적인 동작(예: 편집 가능한 영역에서 키보드 입력, 텍스트 삭제 또는 서식 변경 등)으로 인해 DOM이 업데이트될 때(혹은 업데이트 직전) 알림으로 전송됩니다.

3.6.1. 인터페이스 InputEvent

3.6.1.1. InputEvent

DOM Level 3에서 도입됨

[Exposed=Window]
interface InputEvent : UIEvent {
  constructor(DOMString type, optional InputEventInit eventInitDict = {});
  readonly attribute USVString? data;
  readonly attribute boolean isComposing;
  readonly attribute DOMString inputType;
};
data, 타입 USVString, 읽기 전용, nullable
data는 입력 방법에 의해 생성된 문자의 값을 담고 있습니다. 이는 단일 유니코드 문자 또는 비어 있지 않은 유니코드 문자 시퀀스일 수 있습니다 [Unicode]. 문자는 [UAX15]에서 정의된 유니코드 정규화 형식 NFC로 정규화되어야 합니다. 이 속성은 빈 문자열을 포함할 수 있습니다.

이 속성의 초기화되지 않은 값null이어야 합니다.

isComposing, 타입 boolean, 읽기 전용
입력 이벤트가 합성 세션의 일부로 발생한 경우(즉, compositionstart 이벤트 이후, 해당 compositionend 이벤트 이전) true입니다.

이 속성의 초기화되지 않은 값false여야 합니다.

inputType, 타입 DOMString, 읽기 전용
inputType은 이벤트와 연관된 입력의 종류를 식별하는 문자열을 포함합니다.

이 속성의 올바른 값 목록은 [Input-Events] 명세를 참조하세요.

이 속성의 초기화되지 않은 값은 빈 문자열 ""이어야 합니다.

3.6.1.2. InputEventInit
dictionary InputEventInit : UIEventInit {
  DOMString? data = null;
  boolean isComposing = false;
  DOMString inputType = "";
};
data, 타입 DOMString, nullable, 기본값 null
InputEvent 객체의 data 속성을 초기화합니다.
isComposing, 타입 boolean, 기본값 false
InputEvent 객체의 isComposing 속성을 초기화합니다.
inputType, 타입 DOMString, 기본값 ""
InputEvent 객체의 inputType 속성을 초기화합니다.

3.6.2. 입력 이벤트 순서

이 명세에서 정의된 입력 이벤트는 서로에 대해 반드시 정해진 순서로 발생해야 합니다.

이벤트 유형 비고
1 beforeinput
DOM 요소가 업데이트됨
2 input

3.6.3. 입력 이벤트 유형

3.6.3.1. beforeinput
유형 beforeinput
인터페이스 InputEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Element (구체적으로는 HTMLInputElement와 같은 컨트롤 유형 또는 contenteditable 속성이 활성화된 Element)
취소 가능
합성 여부
기본 동작 DOM 요소 업데이트
컨텍스트
(신뢰할 수 있는 이벤트)

사용자 에이전트는 DOM이 곧 업데이트될 때 반드시 이 이벤트를 발생시켜야 합니다.

3.6.3.2. input
유형 input
인터페이스 InputEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Element (구체적으로는 HTMLInputElement와 같은 컨트롤 유형 또는 contenteditable 속성이 활성화된 Element)
취소 가능 아니오
합성 여부
기본 동작 없음
컨텍스트
(신뢰할 수 있는 이벤트)

사용자 에이전트는 DOM이 업데이트된 직후 반드시 이 이벤트를 발생시켜야 합니다.

3.7. 키보드 이벤트

키보드 이벤트는 장치 의존적입니다. 즉, 입력 장치의 기능과 운영체제에서의 매핑 방식에 따라 달라집니다. 자세한 내용과 키보드 이벤트와 조합 이벤트의 사용 예시 등은 키보드 이벤트 및 키 값을 참고하세요. 문자 생성 장치에 따라 키보드 이벤트가 생성되지 않을 수도 있습니다.

키보드 이벤트는 텍스트 입력을 제공하는 방식 중 하나에 불과합니다. 편집 시나리오에서는 InputEvent를 키보드 이벤트의 대안 또는 보완으로 사용하는 것도 고려하세요.

3.7.1. 인터페이스 KeyboardEvent

이 명세서에서 도입됨

KeyboardEvent 인터페이스는 키보드 장치와 연관된 구체적 컨텍스트 정보를 제공합니다. 각 키보드 이벤트는 키 값을 참조합니다. 키보드 이벤트는 일반적으로 포커스를 가진 요소에 전달됩니다.

KeyboardEvent 인터페이스는 ctrlKey, shiftKey, altKey, metaKey와 같은 일반적인 수정키에 대한 편리한 속성을 제공합니다. 이들 속성은 getModifierState() 메서드에서 각각 Control, Shift, Alt, Meta 값을 사용하는 것과 같습니다.

KeyboardEvent 인터페이스의 인스턴스를 생성하려면, KeyboardEvent 생성자에 선택적 KeyboardEventInit 딕셔너리를 전달하세요.

3.7.1.1. KeyboardEvent
[Exposed=Window]
interface KeyboardEvent : UIEvent {
  constructor(DOMString type, optional KeyboardEventInit eventInitDict = {});
  // KeyLocationCode
  const unsigned long DOM_KEY_LOCATION_STANDARD = 0x00;
  const unsigned long DOM_KEY_LOCATION_LEFT = 0x01;
  const unsigned long DOM_KEY_LOCATION_RIGHT = 0x02;
  const unsigned long DOM_KEY_LOCATION_NUMPAD = 0x03;

  readonly attribute DOMString key;
  readonly attribute DOMString code;
  readonly attribute unsigned long location;

  readonly attribute boolean ctrlKey;
  readonly attribute boolean shiftKey;
  readonly attribute boolean altKey;
  readonly attribute boolean metaKey;

  readonly attribute boolean repeat;
  readonly attribute boolean isComposing;

  boolean getModifierState(DOMString keyArg);
};
DOM_KEY_LOCATION_STANDARD
키 활성화가 왼쪽 또는 오른쪽 키 버전으로 구분되지 않으며(NumLock 키를 제외), 숫자 키패드에서 비롯되지 않았거나(혹은 숫자 키패드에 대응하는 가상 키에서 비롯되지 않음) 합니다.

PC 101키 US 키보드의 Q 키.
PC 101키 US 키보드의 NumLock 키.
키보드 본체에 위치한 1 키.

DOM_KEY_LOCATION_LEFT
키 활성화가 해당 키의 여러 위치 중 왼쪽 위치에서 발생함을 나타냅니다.

PC 101키 US 키보드의 왼쪽 Control 키.

DOM_KEY_LOCATION_RIGHT
키 활성화가 해당 키의 여러 위치 중 오른쪽 위치에서 발생함을 나타냅니다.

PC 101키 US 키보드의 오른쪽 Shift 키.

DOM_KEY_LOCATION_NUMPAD
키 활성화가 숫자 키패드 또는 숫자 키패드에 대응하는 가상 키에서 발생함을 나타냅니다(해당 키에 여러 위치가 있을 때). NumLock 키는 항상 location 값으로 DOM_KEY_LOCATION_STANDARD을 사용해야 합니다.

PC 101키 US 키보드의 숫자 키패드에 위치한 1 키.

key, 타입 DOMString, 읽기 전용
key는 눌린 키에 해당하는 key attribute value를 담습니다.

key 속성은 레거시 keyCode 속성과 관련이 없으며 동일한 값 집합을 가지지 않습니다.

이 속성의 초기화되지 않은 값""(빈 문자열)이어야 합니다.

code, 타입 DOMString, 읽기 전용
code는 눌리고 있는 실제 물리적 키를 식별하는 문자열입니다. 이 값은 현재 키보드 레이아웃이나 수정키 상태에 영향을 받지 않으므로 특정 키는 항상 동일한 값을 반환합니다.

이 속성의 초기화되지 않은 값""(빈 문자열)이어야 합니다.

location, 타입 unsigned long, 읽기 전용
location 속성은 장치에서 키의 논리적 위치를 나타냅니다.

이 속성은 반드시 DOM_KEY_LOCATION 상수 중 하나로 설정되어 키의 장치 내 위치를 나타내야 합니다.

만약 사용자 에이전트가 키를 재매핑할 수 있다면, 재매핑된 키의 location 값은 새로운 키에 적합한 값으로 설정해야 합니다. 예를 들어, "ControlLeft" 키가 "KeyQ" 키로 매핑되면 location 속성은 DOM_KEY_LOCATION_STANDARD이어야 합니다. 반대로 "KeyQ" 키가 Control 키 중 하나로 매핑된다면, location 속성은 DOM_KEY_LOCATION_LEFT 또는 DOM_KEY_LOCATION_RIGHT이어야 합니다.

이 속성의 초기화되지 않은 값0입니다.

ctrlKey, 타입 boolean, 읽기 전용
true일 때 Control(컨트롤) 키 수정자가 활성화됨.

이 속성의 초기화되지 않은 값false입니다.

shiftKey, 타입 boolean, 읽기 전용
true일 때 Shift(쉬프트) 키 수정자가 활성화됨.

이 속성의 초기화되지 않은 값false입니다.

altKey, 타입 boolean, 읽기 전용
true일 때 Alt(대체) 키 수정자("Option" 포함)가 활성화됨.

이 속성의 초기화되지 않은 값false입니다.

metaKey, 타입 boolean, 읽기 전용
true일 때 Meta(메타) 키 수정자가 활성화됨.

맥 시스템에서는 "Command"("⌘") 키가 이 수정자로 표현됩니다.

이 속성의 초기화되지 않은 값false입니다.

repeat, 타입 boolean, 읽기 전용
true일 때 키가 지속적으로 눌려진 상태임을 나타냅니다. 키를 계속 누르면 keydown, beforeinput, input 이벤트가 이 순서대로 시스템 설정에 따라 반복적으로 발생해야 합니다. 모바일 장치에서 장기 키 누름(long-key-press)이 있다면, repeat 값이 true인 첫 번째 키 이벤트가 장기 키 누름의 신호가 됩니다. 반복을 시작하는 데 필요한 키 누름 시간은 환경에 따라 다릅니다.

이 속성의 초기화되지 않은 값false입니다.

isComposing, 타입 boolean, 읽기 전용
키 이벤트가 합성 세션의 일부로 발생한 경우(즉, compositionstart 이벤트 이후, 해당 compositionend 이벤트 이전) true입니다.

이 속성의 초기화되지 않은 값false입니다.

getModifierState(keyArg)
키 값으로 수정키의 상태를 질의합니다.

수정키이면서 활성화되어 있으면 true, 그렇지 않으면 false를 반환합니다.

DOMString keyArg
수정키 값입니다. 올바른 수정키Modifier Keys table([UIEvents-Key])에서 정의되어 있습니다.

애플리케이션이 오른쪽/왼쪽 수정키를 구분하고 싶다면, 키보드 이벤트와 location을 통해 추론할 수 있습니다.

3.7.1.2. KeyboardEventInit
dictionary KeyboardEventInit : EventModifierInit {
  DOMString key = "";
  DOMString code = "";
  unsigned long location = 0;
  boolean repeat = false;
  boolean isComposing = false;
};
key, 타입 DOMString, 기본값 ""
KeyboardEvent 객체의 key 속성을 키의 의미를 나타내는 유니코드 문자열로 초기화합니다. 이 값은 모든 키보드 수정키(쉬프트 상태 등)를 고려한 최종 효과 값입니다. 만약 키가 출력 가능한 문자가 아니라면, [UIEvents-Key]에 정의된 키 값 중 하나여야 합니다.
code, 타입 DOMString, 기본값 ""
KeyboardEvent 객체의 code 속성을 눌린 키를 나타내는 유니코드 문자열로 초기화합니다. 키보드 레이아웃 등 수정사항은 무시하고 실제 물리적 키를 나타냅니다. 이 값은 [UIEvents-Code]에 정의된 코드 값 중 하나여야 합니다.
location, 타입 unsigned long, 기본값 0
KeyboardEvent 객체의 location 속성을 다음의 위치 상수 중 하나로 초기화합니다:
repeat, 타입 boolean, 기본값 false
KeyboardEvent 객체의 repeat 속성을 초기화합니다. 이 속성은 현재 KeyboardEvent가 하나의 키가 길게 눌려 반복적으로 발생한 이벤트 시퀀스의 일부일 때 true로, 아니면 false로 설정해야 합니다.
isComposing, 타입 boolean, 기본값 false
KeyboardEvent 객체의 isComposing 속성을 초기화합니다. 이 속성은 생성되는 이벤트가 조합 입력 시퀀스의 일부일 때 true, 그렇지 않으면 false로 설정해야 합니다.
레거시 키보드 이벤트 구현에는 keyCode, charCode, which라는 세 가지 추가 속성이 있습니다. keyCode는 컴퓨터 키보드의 특정 키와 연관된 숫자 값을 나타내며, charCode는 해당 키와 연관된 ASCII 문자 값(이는 keyCode 값과 같을 수도 있음)을 나타내며, 문자 값을 생성하는 키에만 적용됩니다.

실제로 keyCodecharCode는 플랫폼마다, 심지어 동일 구현체에서 OS나 로케일에 따라 일관되지 않습니다. 본 명세는 keyCodecharCode의 값이나 charCode의 동작을 정의하지 않습니다. 현행 표준 UI Events 구현에서 콘텐츠 작성자는 대신 keycode를 사용할 수 있습니다.

자세한 내용은 레거시 키 속성의 참고 부록을 참조하세요.

기존 콘텐츠와의 호환성을 위해, 소프트웨어 키보드와 같은 가상 키보드는 실제 키가 없더라도 일반적인 키보드 이벤트를 생성해야 합니다.

일부 구현이나 시스템 설정에서는 사용 중인 IME에 의해 일부 키 이벤트 또는 값이 억제될 수 있습니다.

3.7.2. 키보드 이벤트 키 위치

location 속성은 키보드의 서로 다른 물리적 키(예: 왼쪽/오른쪽 Shift 키, 물리적 화살표 키와 숫자패드 화살표 키(NumLock이 꺼진 경우 등))에서 생성되는 key 값을 구분하는 데 사용할 수 있습니다.

아래 표는 키보드에서 위치가 둘 이상인 특수키에 대해 location 속성의 유효 값을 정의합니다:

KeyboardEvent . key 유효한 location
"Shift", "Control", "Alt", "Meta" DOM_KEY_LOCATION_LEFT, DOM_KEY_LOCATION_RIGHT
"ArrowDown", "ArrowLeft", "ArrowRight", "ArrowUp" DOM_KEY_LOCATION_STANDARD, DOM_KEY_LOCATION_NUMPAD
"End", "Home", "PageDown", "PageUp" DOM_KEY_LOCATION_STANDARD, DOM_KEY_LOCATION_NUMPAD
"0", "1", "2", "2", "4", "5", "6", "7", "8", "9", ".", "Enter", "+", "-", "*", "/" DOM_KEY_LOCATION_STANDARD, DOM_KEY_LOCATION_NUMPAD

위 표에 없는 모든 키에 대해서는 location 속성은 항상 DOM_KEY_LOCATION_STANDARD로 설정되어야 합니다.

3.7.3. KeyboardEvent 알고리즘

3.7.3.1. KeyboardEvent의 전역 상태
3.7.3.1.1. User Agent 수준 상태

UA는 전체 User Agent에서 공유되는 다음 값을 유지해야 합니다.

시스템에서 사용 가능한 각 수정키의 현재 상태를 추적하는 키 수정자 상태(초기값은 비어 있음)을 유지해야 합니다.

3.7.4. 키보드 이벤트 순서

이 명세에서 정의된 키보드 이벤트는 특정 키에 대해 반드시 서로 정해진 순서대로 발생합니다:

이벤트 유형 비고
1 keydown
2 beforeinput (문자 값을 생성하는 키에만 해당 character value)
이 키와 관련된 기본 동작 (예: DOM에 문자 삽입)
3 input (DOM이 업데이트된 키에만 해당)
키가 오래 눌려진 경우 발생하는 모든 이벤트(아래 참조)
4 keyup

키가 일정 시간 이상 눌려지면, 다음 이벤트들이 환경에 따라 반복적으로 발생할 수 있습니다:

이벤트 유형 비고
1 keydown (repeat 속성이 true일 때)
2 beforeinput (문자 값을 생성하는 키에만 해당 character value)
이 키와 관련된 기본 동작 (예: DOM에 문자 삽입)
3 input (DOM이 업데이트된 키에만 해당)

일반적으로 특정 키와 연관된 기본 동작keyup 이벤트가 디스패치되기 전에 완료됩니다. 이로 인해 keyup 이벤트가 약간 지연될 수 있지만(감지할 정도는 아님)

키 이벤트의 이벤트 대상은 현재 키보드 입력을 처리하는 포커스된 요소입니다. 이는 보통 HTML input 요소나 편집 가능한 텍스트 요소이지만, 호스트 언어가 텍스트 이외의 목적으로 키보드 입력을 받을 수 있도록 정의한 요소(예: 단축키, 기타 동작 트리거)일 수 있습니다. 적합한 요소가 포커스되지 않았다면, 이벤트 대상은 가능하면 HTML body 요소, 그렇지 않으면 루트 요소입니다.

이벤트 대상은 키 이벤트마다 달라질 수 있습니다. 예를 들어 Tab 키의 keydown 이벤트와 같은 키 입력에서의 keyup 이벤트는 서로 다른 이벤트 대상을 가질 수 있습니다.

3.7.5. 키보드 이벤트 유형

3.7.5.1. keydown
유형 keydown
인터페이스 KeyboardEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Element
취소 가능
합성 여부
기본 동작 상황에 따라 다름: beforeinput, input 이벤트; 텍스트 조합 시스템 실행; blur, focus 이벤트; keypress 이벤트(지원되는 경우); activation behavior; 기타 이벤트
컨텍스트
(신뢰할 수 있는 이벤트)

사용자 에이전트는 키가 눌렸을 때 반드시 이 이벤트를 발생시켜야 합니다. keydown 이벤트 유형은 장치 의존적이며 입력 장치의 기능과 운영체제에서의 매핑 방식에 따라 달라집니다. 이 이벤트 유형은 키 매핑 이후에 반드시 생성되어야 하며, 동일 키에 대한 beforeinput, input, keyup 이벤트보다 먼저 디스패치되어야 합니다.

keydown 이벤트의 기본 동작은 키에 따라 다릅니다:

이 이벤트가 취소되면, 연관된 이벤트 유형은 디스패치되지 말아야 하며, 연관된 동작도 수행되어서는 안 됩니다.

keydownkeyup 이벤트는 전통적으로 문자 값을 생성하는 키뿐 아니라 모든 키 감지에 사용됩니다.

3.7.5.2. keyup
유형 keyup
인터페이스 KeyboardEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Element
취소 가능
합성 여부
기본 동작 없음
컨텍스트
(신뢰할 수 있는 이벤트)

사용자 에이전트는 키가 해제될 때 반드시 이 이벤트를 발생시켜야 합니다. keyup 이벤트 유형은 장치 의존적이며 입력 장치의 기능과 운영체제에서의 매핑 방식에 따라 달라집니다. 이 이벤트 유형은 키 매핑 이후에 반드시 생성되어야 하며, 동일 키에 대한 keydown, beforeinput, input 이벤트 이후에 디스패치되어야 합니다.

keydownkeyup 이벤트는 문자 값을 생성하는 키뿐 아니라 모든 키 감지에 전통적으로 사용됩니다.

3.8. 조합 이벤트

조합 이벤트는 키보드 이벤트와는 보완적이거나 대체적인 방식으로 텍스트를 입력할 수 있게 하여, 키보드에 일반적으로 없는 문자를 사용할 수 있도록 합니다. 예를 들어, 조합 이벤트는 표준 미국 키보드에 없는 악센트를 문자에 추가하거나, 많은 아시아 언어의 한자를 기본 구성 요소나 범주에서 조합하여 만들거나, 모바일 기기 키보드에서 여러 키 조합으로 단어 선택을 하거나, 음성 인식 프로세서를 사용해 음성 명령을 텍스트로 변환하는 데 사용할 수 있습니다. 조합 이벤트와 키보드 이벤트의 조합 사용 예시는 § 4 키보드 이벤트 및 키 값을 참고하세요.

개념적으로, 조합 세션은 하나의 compositionstart 이벤트, 하나 이상의 compositionupdate 이벤트, 그리고 하나의 compositionend 이벤트로 이루어지며, 각 세션 동안 이 이벤트 체인의 각 단계에서는 data 속성의 값이 유지됩니다.

참고: 조합 세션이 활성화된 동안 키보드가 조합 세션의 입력 장치로 사용된다면 키보드 이벤트가 DOM으로 디스패치될 수 있습니다. 관련 이벤트 순서에 대해서는 compositionstart 이벤트 상세와 IME 섹션을 참고하세요.

모든 IME 시스템이나 장치가 DOM에 필요한 데이터를 노출하는 것은 아니므로, 활성 조합 문자열(예: 읽기 창 또는 후보 선택 메뉴 옵션)이 이 인터페이스를 통해 제공되지 않을 수 있으며, 이 경우 선택은 빈 문자열로 표현될 수 있습니다.

3.8.1. 인터페이스 CompositionEvent

현행 표준에서 도입됨

CompositionEvent 인터페이스는 조합 이벤트와 관련된 구체적 컨텍스트 정보를 제공합니다.

CompositionEvent 인터페이스의 인스턴스를 생성하려면, CompositionEvent 생성자에 선택적 CompositionEventInit 딕셔너리를 전달하세요.

3.8.1.1. CompositionEvent
[Exposed=Window]
interface CompositionEvent : UIEvent {
  constructor(DOMString type, optional CompositionEventInit eventInitDict = {});
  readonly attribute USVString data;
};
data, 타입 USVString, 읽기 전용
data는 입력 방법에 의해 생성된 문자의 값을 담고 있습니다. 이는 단일 유니코드 문자 또는 비어 있지 않은 유니코드 문자 시퀀스일 수 있습니다 [Unicode]. 문자는 [UAX15]에서 정의된 유니코드 정규화 형식 NFC로 정규화해야 합니다. 이 속성은 빈 문자열일 수 있습니다.

이 속성의 초기화되지 않은 값""(빈 문자열)이어야 합니다.

3.8.1.2. CompositionEventInit
dictionary CompositionEventInit : UIEventInit {
  DOMString data = "";
};
data, 타입 DOMString, 기본값 ""
IME 조합에 의해 생성된 문자를 CompositionEvent 객체의 data 속성에 초기화합니다.

3.8.2. 조합 이벤트 순서

이 명세에서 정의된 조합 이벤트는 반드시 다음의 순서대로 서로 발생해야 합니다:

이벤트 유형 비고
1 compositionstart
2 compositionupdate 여러 번 발생 가능
3 compositionend

3.8.3. 필기 인식 시스템

다음 예시는 펜 태블릿과 같은 필기 인식 시스템에서 text라는 텍스트를 작성할 때의 조합 이벤트 시퀀스를 설명합니다.

이벤트 유형 CompositionEvent
data
비고
1 compositionstart ""
사용자가 태블릿 표면에 단어를 씀
2 compositionupdate "test"
사용자가 첫 번째 단어 제안(match)을 거부하고 다른 매칭 선택
3 compositionupdate "text"
4 compositionend "text"

3.8.4. 조합 이벤트 취소

keydown 이벤트가 취소되면 해당 keydown에서 발생할 조합 이벤트는 디스패치되지 않아야 합니다:

이벤트 유형 비고
1 keydown 기본 동작이 방지됨, 예: preventDefault() 호출 등
조합 이벤트가 디스패치되지 않음
2 keyup

최초 compositionstart 이벤트가 취소되면 텍스트 조합 세션은 종료되어야 합니다. 세션이 종료되든 아니든 compositionend 이벤트는 반드시 전송되어야 합니다.

이벤트 유형 비고
1 keydown
2 compositionstart 기본 동작이 방지됨, 예: preventDefault() 호출 등
조합 이벤트가 디스패치되지 않음
3 compositionend
4 keyup

3.8.5. 조합 중 키 이벤트

조합 세션 중에는 keydownkeyup 이벤트가 반드시 전송되어야 하며, 이 이벤트의 isComposing 속성은 true로 설정되어야 합니다.

이벤트 유형 KeyboardEvent
isComposing
비고
1 keydown false 조합을 시작하는 키 이벤트입니다.
2 compositionstart
3 compositionupdate
4 keyup true
... 조합 세션 중 전송되는 모든 키 이벤트는 isComposingtrue여야 함.
5 keydown true 조합을 끝내는 키 이벤트입니다.
6 compositionend
7 keyup false

3.8.6. 조합 중 입력 이벤트

조합 세션 중에는 compositionupdate가 반드시 beforeinput이 전송된 후, input 이벤트가 전송되기 전에 디스패치되어야 합니다.

이벤트 유형 비고
1 beforeinput
2 compositionupdate
이 시점에 DOM 업데이트가 발생함.
3 input

대부분의 IME는 조합 세션 중에는 업데이트 취소를 지원하지 않습니다.

beforeinputinput 이벤트는 조합 과정에서 DOM이 업데이트될 때마다 compositionupdate 이벤트와 함께 전송됩니다. compositionend 이벤트에는 DOM 업데이트가 없으므로, 그 시점에는 beforeinputinput 이벤트를 전송하지 않아야 합니다.

이벤트 유형 비고
1 beforeinput 이를 취소하면 DOM 업데이트와 input 이벤트가 방지됨.
2 compositionupdate
이 시점에 DOM 업데이트가 발생함.
3 input DOM이 업데이트된 경우에만 전송됨.
4 compositionend

3.8.7. 조합 이벤트 유형

3.8.7.1. compositionstart
유형 compositionstart
인터페이스 CompositionEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Element
취소 가능
합성 여부
기본 동작 텍스트 조합 시스템이 활성화될 때 새 조합 세션 시작
컨텍스트
(신뢰할 수 있는 이벤트)

사용자 에이전트텍스트 조합 시스템이 활성화되고, 새 조합 세션이 시작되려 하거나(또는 텍스트 조합 시스템에 따라 이미 시작된 경우), 텍스트 조합을 준비할 때 반드시 이 이벤트를 디스패치해야 합니다. 이 이벤트 타입은 장치에 따라 달라질 수 있으며, 텍스트 변환 시스템의 기능과 운영체제에서의 매핑 방식에 따라 달라질 수 있습니다. 키보드를 이용해 입력기를 사용하는 경우, 이 이벤트 타입은 keydown 이벤트 이후에 발생하지만, 음성 또는 필기 인식 시스템은 키보드 이벤트 없이 이 이벤트 타입을 보낼 수 있습니다. 일부 구현체는 data 속성에 현재 문서에서 선택된 텍스트(편집 및 대체용)를 채우기도 합니다. 그렇지 않은 경우 data 속성의 값은 반드시 빈 문자열이어야 합니다.

이 이벤트는 텍스트 조합 시스템이 새 조합 세션을 시작하기 직전, 그리고 조합 과정에서 DOM이 수정되기 직전에 반드시 디스패치되어야 합니다. 이 이벤트의 기본 동작은 텍스트 조합 시스템이 새 조합 세션을 시작하는 것입니다. 이 이벤트가 취소되면, 텍스트 조합 시스템은 현재 조합 세션을 폐기해야 합니다.

compositionstart 이벤트 유형을 취소하는 것은 실제 텍스트 조합 시스템 자체를 취소(예: 취소 버튼 클릭, IME 창 종료 등)하는 것과는 다릅니다.

일부 IME는 진행 중인 조합 세션 취소를 지원하지 않습니다(예: GTK 등은 해당 API 없음). 이런 경우 preventDefault() 호출로도 이 이벤트의 기본 동작을 중단할 수 없습니다.

3.8.7.2. compositionupdate
유형 compositionupdate
인터페이스 CompositionEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Element
취소 가능 아니오
합성 여부
기본 동작 없음
컨텍스트
(신뢰할 수 있는 이벤트)

사용자 에이전트는 조합 세션 중에 텍스트 조합 시스템이 활성 텍스트에 새 문자를 추가하면, data 속성의 문자열에 이를 반영하여 이 이벤트를 디스패치해야 합니다.

텍스트 조합 시스템이 입력 컨트롤과 조합 내용을 동기화하는 경우, compositionupdate 이벤트는 반드시 컨트롤이 업데이트되기 전에 디스패치되어야 합니다.

일부 텍스트 조합 시스템은 이 정보를 DOM에 노출하지 않을 수 있으므로, 이 경우 조합 과정에서 이 이벤트가 발생하지 않습니다.

조합 세션이 취소되면, 이 이벤트는 compositionend 이벤트 직전에 발생하며, data 속성은 빈 문자열로 설정됩니다.

3.8.7.3. compositionend
유형 compositionend
인터페이스 CompositionEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Element
취소 가능 아니오
합성 여부
기본 동작 없음
컨텍스트
(신뢰할 수 있는 이벤트)

사용자 에이전트텍스트 조합 시스템이 현재 조합 세션을 완료하거나 취소할 때 반드시 이 이벤트를 발생시켜야 하며, compositionend 이벤트는 컨트롤이 업데이트된 직후에 반드시 디스패치되어야 합니다.

이 이벤트는 텍스트 조합 시스템이 조합 세션을 완료한 직후(예: IME가 닫히거나, 최소화되거나, 포커스가 해제되거나, 기타 방식으로 종료되고 포커스가 다시 사용자 에이전트로 돌아올 때)에 디스패치됩니다.

4. 키보드 이벤트와 키 값

이 절에는 키보드 이벤트에 관한 필수 정보가 포함되어 있습니다:

이 절에서는 세르비아 문자와 한자를 사용하므로, PDF 버전이나 인쇄 버전에서는 잘못 표시되거나 표시되지 않을 수 있습니다.

4.1. 키보드 입력

이 절은 규범적이지 않습니다

각 키와 전체 키보드의 관계는 세 가지 측면이 있으며, 각각은 키보드의 모델과 구성, 특히 로케일(국가/언어)별로 다릅니다:

현행 표준에서는 key 값 및 code 값과 관련된 기능적 매핑만 정의하며, 키 레전드에 대해서는 간략히 설명합니다.

4.1.1. 키 레전드

이 절은 참고용입니다

키 레전드는 키캡(물리적 키의 사각형 뚜껑)에 인쇄되거나 각인된 시각적 표시입니다. 이 표시는 보통 해당 키를 누르면 생성될 하나 이상의 문자(예: "G", "8", "ш") 또는 해당 키의 기능을 나타내는 이름이나 기호(예: 위쪽 화살표 "⇧"Shift를 의미하거나, "Enter" 문자열)로 구성됩니다. 키는 종종 이 표시로 불립니다(예: "Shift""G" 키를 누르세요.). 하지만 키의 시각적 모습은 디지털 표현에 아무런 영향을 주지 않으며, 실제로는 완전히 부정확할 수도 있습니다. Enter와 같은 컨트롤/기능키도 다른 기능이나 문자키로 매핑될 수 있습니다.

많은 키보드에는 일반적으로 문자를 생성하지 않는 키가 포함되어 있습니다. 심볼에 유니코드가 있을 수 있지만, 예를 들어 Shift 키에는 "⇧"라는 기호가 있지만 유니코드 코드포인트 U+21E7가 존재해도 실제 Shift 키를 누르면 이 문자가 생성되지 않으며, Shift 자체에 대한 유니코드 코드포인트도 없습니다.

4.2. 키 코드

code 는 키보드 이벤트의 속성으로, 해당 이벤트와 연관된 물리적 키를 식별하는 데 사용됩니다. 이는 USB Usage ID와 유사하며, 벤더(제조사)와 무관한 저수준 값(스캔코드와 유사)을 제공합니다.

code 속성의 주요 목적은 키의 물리적 위치를 기반으로 키를 일관되고 명확하게 식별하는 방법을 제공하는 것입니다. 또한 현재 키보드 상태에 영향을 받지 않는, 각 키를 고유하게 식별하는 안정적인 이름도 제공합니다.

유효한 code 값의 목록은 [UIEvents-Code]에서 정의합니다.

4.2.1. code 속성의 도입 이유

표준 PC 키보드에는 문자 시스템 키라고 하는 키 집합이 있으며, 이는 사용자가 선택한 현재 키보드 레이아웃에 따라 서로 다른 key 값을 생성합니다. 이로 인해 코드에서 물리적 위치로 키를 감지하려면 어떤 레이아웃이 적용 중인지 알아야 하므로 key 값을 예측해야 하는 문제가 생깁니다. 예를 들어 게임에서 "W", "A", "S", "D" 키로 플레이어 이동을 제어하려는 경우가 있습니다. code 속성은 현재 키보드 레이아웃에 영향을 받지 않는 안정적인 체크 값을 제공하여 이 문제를 해결합니다.

또한 key 속성 값은 현재 키보드 상태에도 영향을 받습니다. 즉, 수정키의 누름/해제 순서에 따라 key 값이 달라질 수 있습니다. code 속성은 이러한 문제를 현재 키보드 상태에 영향을 받지 않는 안정적 값으로 해결합니다.

4.2.2. keycode의 관계

key
key 속성은 현재 키보드 레이아웃(및 IME, 죽은 키에는 고유 key 값이 있음)을 고려한, 눌린 키의 의미에 관심 있는 사용자를 위한 속성입니다. 예시: 수정키가 눌린 상태/단일 수정키 감지(예: 단축키 동작).
code
code 속성은 레이아웃 변경 없이 사용자가 실제로 누른 키에 관심 있는 사용자를 위한 속성입니다. 예시: 게임에서 WASD 키 감지, 원격 데스크톱에서 모든 키 전송 등.

4.2.3. code 예시

왼쪽/오른쪽 Alt 키 처리 예시
키보드 레이아웃 KeyboardEvent
key
KeyboardEvent
code
비고
US "Alt" "AltLeft" DOM_KEY_LOCATION_LEFT
French "Alt" "AltLeft" DOM_KEY_LOCATION_LEFT
US "Alt" "AltRight" DOM_KEY_LOCATION_RIGHT
French "AltGraph" "AltRight" DOM_KEY_LOCATION_RIGHT

이 예시에서 key 속성으로 Alt 키를 체크하면 어느 Alt 키(왼쪽/오른쪽)인지 신경 쓰지 않아도 일치시킬 수 있습니다. code 속성으로 체크하면 레이아웃이 무엇이든 오른쪽 Alt 키("AltRight") 만을 일치시킬 수 있습니다.

프랑스어 키보드 예시에서 AltAltGraph 키는 각각 하나만 있어도 왼쪽/오른쪽 위치 정보를 유지합니다.

단일 인용부호 키 처리 예시
키보드 레이아웃 KeyboardEvent
key
KeyboardEvent
code
비고
US "'" "Quote"
Japanese ":" "Quote"
US Intl "Dead" "Quote"

이 예시는 죽은 키 값이 속성에 어떻게 인코딩되는지 보여줍니다. key 값은 현재 로케일에 따라 다르지만, code 속성은 항상 일정한 값을 반환합니다.

"2" 키 처리 예시(Shift 키와 함께 및 없이, 다양한 키보드 레이아웃)
키보드 레이아웃 KeyboardEvent
key
KeyboardEvent
code
비고
US "2" "Digit2"
US "@" "Digit2" shiftKey
UK "2" "Digit2"
UK """ "Digit2" shiftKey
French "é" "Digit2"
French "2" "Digit2" shiftKey

현재 로케일이나 수정키 상태와 상관없이, US 키보드에서 "2" 라고 표시된 키를 누르면 "Digit2"code 속성에 항상 들어갑니다.

키보드 이벤트 시퀀스 : Shift2

아래 두 키 이벤트 시퀀스의 속성 값을 비교하세요. 둘 다 US 키보드에서 "@" 문자를 생성하지만, 키 해제 순서가 다릅니다. 첫 번째 시퀀스에서는 Shift(누름), 2(누름), 2(뗌), Shift(뗌) 순서입니다.

이벤트 유형 KeyboardEvent
key
KeyboardEvent
code
비고
1 keydown "Shift" "ShiftLeft" DOM_KEY_LOCATION_LEFT
2 keydown "@" "Digit2" shiftKey
3 keypress "@" "Digit2" (지원되는 경우)
4 keyup "@" "Digit2" shiftKey
5 keyup "Shift" "ShiftLeft" DOM_KEY_LOCATION_LEFT

두 번째 시퀀스에서는 Shift가 2보다 먼저 해제되어 Shift(누름), 2(누름), Shift(뗌), 2(뗌) 순서가 됩니다.

이벤트 유형 KeyboardEvent
key
KeyboardEvent
code
비고
1 keydown "Shift" "ShiftLeft" DOM_KEY_LOCATION_LEFT
2 keydown "@" "Digit2" shiftKey
3 keypress "@" "Digit2" (지원되는 경우)
4 keyup "Shift" "ShiftLeft" DOM_KEY_LOCATION_LEFT
5 keyup "2" "Digit2"

key 속성의 값은 "2" 키에 대해 keydown/keyup 이벤트마다 일치하지 않을 수 있습니다. code 속성은 수정키 상태에 영향을 받지 않는 일관된 값을 제공합니다.

4.2.4. code 및 가상 키보드

code 속성은 가상 키보드(및 리모컨, 코드 입력 키보드 등)에서는 그 유용성이 덜 명확합니다. 일반적으로, 가상(혹은 리모컨) 키보드가 표준 키보드의 레이아웃과 기능을 모방한다면, 반드시 code 속성을 적절하게 설정해야 합니다. 표준 키보드의 레이아웃을 모방하지 않는 키보드의 경우, code 속성은 표준 키보드에서 가장 가까운 값을 설정하거나, 설정하지 않을 수 있습니다.

가상 키보드에서 키가 수정키 상태에 따라 다른 값을 생성하는 경우, code 값은 장치가 공장 초기화 상태일 때 해당 버튼을 눌렀을 때 생성되는 key 값이어야 합니다.

4.3. 키보드 이벤트 key

키 값은 키보드의 어느 키든, 위치나 상태와 관계없이 해당 키가 생성하는 값을 나타내는 DOMString입니다. 이 키 값은 구현체가 생성하는 키보드 이벤트의 반환값으로 사용될 수도 있고, 콘텐츠 작성자가 원하는 입력을 명시(예: 단축키 등)할 때 입력값으로 사용할 수도 있습니다.

유효한 key 값 목록은 [UIEvents-Key]에서 정의합니다.

키 값은 key 속성을 통해 눌린 키의 값을 감지하는 데 사용할 수 있습니다. 콘텐츠 작성자는 대소문자, 숫자, 기호, 기타 문자 생성 키의 문자 값뿐만 아니라, 제어 키, 수정키, 기능 키, 문자를 생성하지 않는 기타 키의 키 값도 감지할 수 있습니다. 이러한 값은 특정 입력 문자열 감지, 마우스 등과 조합된 수정키 입력 처리, 가상 키보드 생성 등 다양한 용도로 사용할 수 있습니다.

키 값은 콘텐츠 작성자가 문자열 비교를 하거나, 규범적 호스트 언어에서 HTML accesskey와 같은 마크업 속성의 값으로, 또는 관련 용도로도 사용할 수 있습니다. 규범적 호스트 언어는 키 값의 두 동등한 문자열 값(즉 문자 값 또는 키 값) 중 어느 것을 사용해도 허용해야 합니다.

구현체는 플랫폼이나 키보드 레이아웃 맵핑과 무관하게 가장 관련성 높은 값을 키에 대해 사용하지만, 콘텐츠 작성자는 모든 키보드 장치가 그 값을 생성할 수 있다고 가정해서는 안 됩니다. 단축키 조합에 키보드 이벤트와 키 값을 사용할 경우, 대부분의 키보드 레이아웃에서 해당 키가 존재하므로 숫자 및 기능키(F4, F5 등)를 문자 대신 사용하는 것을 고려할 수 있습니다 ([DWW95]).

키 값은 물리적 키 자체나 키에 인쇄된 문자와 직접적으로 일치하지 않습니다. 키 값은 모든 활성 키와 키 입력 모드(Shift 등)의 현재 상태, 그리고 운영체제의 키보드 매핑에 따라 이벤트의 현재 값을 나타냅니다. 즉, QWERTY 키보드에서 O 라벨이 붙은 키는 쉬프트가 안 눌린 상태에서는 "o", 쉬프트가 눌린 상태에서는 "O" 키 값을 가집니다. 사용자는 키보드를 임의로 커스텀 매핑할 수 있으므로, 콘텐츠 작성자는 키의 쉬프트/언쉬프트 상태와 문자의 대/소문자 사이의 관계를 가정하지 말고 key 속성의 값을 사용하는 것이 바람직합니다. 예를 들어 [UIEvents-Code]의 Standard "102" 키보드 레이아웃은 한 가지 키 매핑 사례를 보여줍니다. 표준 및 특이한 매핑은 매우 다양합니다.

죽은 키 지원을 단순화하기 위해, 운영체제가 죽은 키 상태를 처리할 때, 죽은 키 시퀀스의 현재 상태는 key 속성으로 보고되지 않습니다. 대신 "Dead" 키 값이 보고됩니다. 구현체는 조합 이벤트를 생성하여, 죽은 키 시퀀스의 중간 상태를 data 속성으로 보고합니다. 앞의 예시와 같이, QWERTY 키보드에서 O 키에 대해 죽은 키 조작으로 움라우트(¨)를 추가할 때 언쉬프트 상태에서는 "ö", 쉬프트 상태에서는 "Ö"data 값이 됩니다.

또한, 키 이벤트 상태와 키 값은 일대일 관계가 아니라는 점도 중요합니다. 특정 키 값은 여러 키와 연관될 수 있습니다. 예를 들어, 대부분의 표준 키보드에는 Shift 키 값이 두 개 이상 있으며(보통 locationDOM_KEY_LOCATION_LEFTDOM_KEY_LOCATION_RIGHT로 구분), 8 키 값도 두 개 이상이며(보통 locationDOM_KEY_LOCATION_STANDARDDOM_KEY_LOCATION_NUMPAD로 구분), 사용자가 커스텀 키보드 레이아웃을 구성할 경우 여러 키 상태에 동일한 키 값이 중복될 수 있습니다(location 은 표준 키보드 레이아웃을 위한 것이며, 항상 의미 있는 구분이 가능한 것은 아님).

마지막으로, 문자 표현의 의미는 맥락에 따라 복잡합니다. 예를 들어 별표("*") 기호는 일부 맥락에서는 각주나 강조(텍스트를 괄호로 감쌀 때 등)를 나타내지만, 문서나 프로그램에 따라서는 곱셈 연산을 의미할 수도 있습니다. 또 다른 문서/프로그램에서는 곱셈 기호("×", 유니코드 U+00D7)나 라틴 소문자 "x"가 사용되기도 합니다(많은 키보드에 곱셈 키가 없고, "×""x"가 시각적으로 비슷하기 때문). 문자 표현의 의미/기능은 이 명세서의 범위를 벗어납니다.

4.3.1. 수정키

키보드 입력은 수정키를 사용하여 키의 일반 동작을 변경합니다. 다른 키들과 마찬가지로, 수정키도 아래 예시처럼 keydownkeyup 이벤트를 발생시킵니다. 일부 수정키(Alt, Control, Shift, AltGraph, Meta)는 키가 눌려 있거나 유지되는 동안 활성화됩니다. 다른 수정키(CapsLock, NumLock, ScrollLock)는 상태에 따라 활성화되며, 수정키가 눌릴 때 상태가 변경됩니다. KeyboardEvent 인터페이스는 일반적인 수정키에 대해 편리한 속성을 제공합니다: ctrlKey, shiftKey, altKey, metaKey. 일부 운영체제에서는 AltGraph 수정키를 AltControl 수정키 조합으로 에뮬레이션하기도 합니다. 구현체에서는 AltGraph 수정키를 사용하는 것이 권장됩니다.

이 예시는 US 키보드에서 US 매핑을 사용하여 유니코드 문자 Q(라틴 대문자 Q, 유니코드 U+0051)를 생성할 때의 이벤트 시퀀스를 보여줍니다:
이벤트 유형 KeyboardEvent
key
수정키 비고
1 keydown "Shift" shiftKey
2 keydown "Q" shiftKey 라틴 대문자 Q
3 beforeinput
4 input
5 keyup "Q" shiftKey
6 keyup "Shift"
이 예시는 위의 예시와 달리 Shift 키가 Q 키보다 먼저 해제된 경우의 이벤트 시퀀스를 보여줍니다. Q 키의 key 값은 keyup 이벤트에서 언쉬프트 값으로 돌아갑니다:
이벤트 유형 KeyboardEvent
key
수정키 비고
1 keydown "Shift" shiftKey
2 keydown "Q" shiftKey 라틴 대문자 Q
3 beforeinput
4 input
5 keyup "Shift"
6 keyup "q" 라틴 소문자 Q
다음 예시는 유니코드 문자를 생성하지 않는 키 시퀀스(같은 설정)를 보여줍니다:
이벤트 유형 KeyboardEvent
key
수정키 비고
1 keydown "Control" ctrlKey
2 keydown "v" ctrlKey 라틴 소문자 V
beforeinput 또는 input 이벤트는 생성되지 않음.
3 keyup "v" ctrlKey 라틴 소문자 V
4 keyup "Control"
다음 예시는 ShiftControl을 동시에 누를 때의 이벤트 시퀀스를 보여줍니다:
이벤트 유형 KeyboardEvent
key
수정키 비고
1 keydown "Control" ctrlKey
2 keydown "Shift" ctrlKey, shiftKey
3 keydown "V" ctrlKey, shiftKey 라틴 대문자 V
beforeinput 또는 input 이벤트는 생성되지 않음.
4 keyup "V" ctrlKey, shiftKey 라틴 대문자 V
5 keyup "Shift" ctrlKey
6 keyup "Control"
US 키보드가 아닌 레이아웃에서도 이벤트 시퀀스는 동일하지만, 키의 값은 현재 키보드 레이아웃에 따라 결정됩니다. 이 예시는 아랍어 키보드 레이아웃을 사용할 때의 이벤트 시퀀스를 보여줍니다:
이벤트 유형 KeyboardEvent
key
수정키 비고
1 keydown "Control" ctrlKey
2 keydown "ر" ctrlKey 아랍 문자 Reh
beforeinput 또는 input 이벤트는 생성되지 않음.
3 keyup "ر" ctrlKey 아랍 문자 Reh
4 keyup "Control"

keydownkeyup 이벤트의 값은 키를 눌렀을 때의 현재 키보드 레이아웃에 따라 달라집니다. 즉, US 레이아웃의 v 키와 아랍어 레이아웃의 ر 키는 동일한 물리적 키여도 서로 다른 이벤트가 발생합니다. 동일 물리적 키에서 발생한 이벤트인지 식별하려면 code 속성을 사용해야 합니다.

일부 경우에는 수정키가 키 이벤트의 key 값을 변경합니다. 예를 들어, 일부 MacOS 키보드에서는 "delete" 라벨이 붙은 키가 수정되지 않은 상태에서는 Windows OS의 Backspace 키처럼 동작하지만, Fn 키로 수정하면 Delete 키처럼 동작하며, key 값은 현재 수정 상태에서 해당 키의 가장 적합한 기능과 일치합니다.

4.3.2. 죽은 키

일부 키보드 입력은 죽은 키를 사용하여 조합 문자 시퀀스를 입력합니다. 필기 입력과 달리(사용자가 먼저 기본 문자를 입력), 키보드 입력에서는 죽은 키를 누르면 특수 상태에 진입하고, 제한된 수의 합법적인 기본 문자를 입력할 때만 문자가 출력됩니다.

MacOS와 Linux 운영체제는 죽은 키 처리를 위해 입력 방법을 사용합니다.

모든 키보드 레이아웃과 맵핑에서 죽은 키는 키 값 Dead로 표시됩니다. 죽은 키가 눌릴 때마다 사용자 에이전트는 반드시 조합 이벤트를 디스패치해야 하며, compositionupdate 이벤트의 data 값에는 현재 죽은 키 조합 시퀀스의 문자 값이 들어가야 합니다.

유니코드 결합 문자는 항상 필기 입력 시퀀스(문자 뒤에 결합 문자)로 처리되지만, 일반적인 죽은 키 입력은 결합 문자가 대응 문자보다 먼저 올 수도 있습니다. 예를 들어 naïve라는 단어에서 ¨ 결합 부호를 사용할 때, 유니코드 순서는 nai¨ve가 되지만, 입력 시에는 na¨ive로 입력할 수 있습니다. U+0302(Combining Circumflex Accent key)와 U+0065(라틴 소문자 E 키)를 연속 입력하면(프랑스 키보드, 프랑스 맵핑, 수정키 미사용) 유니코드 문자 "ê"(라틴 소문자 E에 곡절 부호)를 생성하며, 이는 유니코드 정규화 형식 NFC가 권장하는 방식입니다.

이벤트 유형 KeyboardEvent
key
KeyboardEvent
isComposing
CompositionEvent
data
비고
1 keydown "Dead" false Combining Circumflex Accent (Dead Key)
2 compositionstart ""
3 compositionupdate U+0302
4 keyup "Dead" true
5 keydown "ê" true
6 compositionupdate "ê"
7 compositionend "ê"
8 keyup "e" false 라틴 소문자 E

두 번째 keydown 이벤트(5단계)에서(이벤트가 억제되지 않았다면) key 값은 일반적으로 "e"(라틴 소문자 E 키)가 아니며, 이미 죽은 키 동작에 의해 값이 변형되어 사용자 에이전트에 전달됩니다.

사용자가 죽은 키를 누른 뒤, 지원되지 않는 기본 문자(활성화된 발음 기호를 적용할 수 없는 문자)를 입력하면 이 과정이 중단될 수 있습니다:

이벤트 유형 KeyboardEvent
key
KeyboardEvent
isComposing
CompositionEvent
data
비고
1 keydown "Dead" false Combining Circumflex Accent (Dead Key)
2 compositionstart ""
3 compositionupdate U+0302
4 keyup "Dead" true
5 keydown "q" true 라틴 소문자 Q
6 compositionupdate ""
7 compositionend ""
8 keyup "q" false

4.3.3. 입력기(IME)

이 명세는 CompositionEvent 인터페이스와 이벤트를 통해 입력기(IME) 모델을 포함합니다. 단, 조합 이벤트와 키보드 이벤트는 반드시 일대일로 매핑되는 것은 아닙니다. 예를 들어, Accept 키 값에 대한 keydown을 받더라도, IME에서 현재 선택된 텍스트가 실제로 확정된다는 의미가 아니라 단순히 키 입력이 발생했다는 뜻일 뿐이며, 이는 IME의 Accept 기능과는 분리되어 있습니다(대부분의 IME 시스템에서는 compositionend 이벤트가 발생함). 키보드 이벤트로는 입력기의 현재 상태를 알 수 없으며, 이는 CompositionEvent 인터페이스의 data 속성으로 확인할 수 있습니다. 또한 IME 시스템과 장치마다 기능과 해당 기능을 활성화하는 키가 다르므로, ConvertAccept 키가 다른 키로 대체될 수 있습니다. 키보드 이벤트는 키보드 레이아웃 매핑 이후 입력장치에서 발생하는 이벤트와 대응합니다.

일부 구현이나 시스템 설정에서는 사용 중인 IME에 의해 일부 키 이벤트나 값이 억제될 수 있습니다.

다음 예시는 일본어 입력기를 사용하여 유니코드 문자 "市"(한자, CJK 통합 한자)를 생성하는 키 시퀀스를 설명합니다. 이 예시는 입력기가 활성화되어 일본어 로마자 입력 모드임을 가정합니다. ConvertAccept 키는 입력장치와 IME 설정에 따라 각각 U+0020(스페이스 키), Enter로 대체될 수 있습니다.

"詩"()와 "市"(도시)는 모두 발음이 し(shi/si)로 동일한 동음이의어이므로, 사용자가 Convert 키로 올바른 옵션을 선택해야 합니다.

이벤트 유형 KeyboardEvent
key
KeyboardEvent
isComposing
CompositionEvent
data
비고
1 keydown "s" false 라틴 소문자 S
2 compositionstart ""
3 beforeinput
4 compositionupdate "s"
DOM이 업데이트됨
5 input
6 keyup "s" true
7 keydown "i" true 라틴 소문자 I
8 beforeinput
9 compositionupdate "し" shi
DOM이 업데이트됨
10 input
11 keyup "i" true
12 keydown "Convert" true 변환(Convert)
13 beforeinput
14 compositionupdate "詩" "시(poem)"
DOM이 업데이트됨
15 input
16 keyup "Convert" true
17 keydown "Convert" true 변환(Convert)
18 beforeinput
19 compositionupdate "市" "도시(city)"
DOM이 업데이트됨
20 input
21 keyup "Convert" true
22 keydown "Accept" true 확정(Accept)
23 compositionend "市"
24 keyup "Accept" false

IME 조합 입력은 아래 예시처럼 취소될 수도 있으며, 조건은 이전 예시와 동일합니다. Cancel 키도 입력장치와 IME 설정에 따라 U+001B(Escape 키) 등으로 대체될 수 있습니다.

이벤트 유형 KeyboardEvent
key
KeyboardEvent
isComposing
CompositionEvent
data
비고
1 keydown "s" false 라틴 소문자 S
2 compositionstart ""
3 compositionupdate "s"
4 keyup "s" true
5 keydown "i" true 라틴 소문자 I
6 compositionupdate "し" shi
7 keyup "i" true
8 keydown "Convert" true 변환(Convert)
9 compositionupdate "詩" "시(poem)"
10 keyup "Convert" true
11 keydown "Convert" true 변환(Convert)
12 compositionupdate "市" "도시(city)"
13 keyup "Convert" true
14 keydown "Cancel" true 취소(Cancel)
15 compositionupdate ""
16 compositionend ""
17 keyup "Cancel" false

일부 IME(예: MacOS 운영체제)는 조합을 취소하기 전에 조합 데이터 속성을 빈 문자열로 설정할 수 있습니다.

4.3.3.1. 입력기(IME) 모드 키

일부 장치의 특정 키는 입력기(IME) 기능을 활성화하거나, 활성화된 입력기(IME)의 모드를 변경하는 용도로 설계되어 있습니다. 이러한 목적을 위한 커스텀 키는 장치나 언어 모드별로 정의할 수 있습니다. 현행 표준에서 정의된 이러한 키는 다음과 같습니다: "Alphanumeric", "CodeInput", "FinalMode", "HangulMode", "HanjaMode", "Hiragana", "JunjaMode", "KanaMode", "KanjiMode", "Katakana", "Romaji". 이 키들 중 하나가 눌릴 때, 현재 활성화된 IME가 없다면, 해당 키가 지시하는 모드의 IME가(가능하다면) 활성화되어야 합니다. 이미 IME가 활성화된 상태에서 키가 눌릴 경우, 활성 IME가 해당 모드로 변경되거나, 다른 IME가 실행되거나, 또는 무시될 수 있으며, 이는 장치와 애플리케이션에 따라 다릅니다.

현행 표준에서는 입력기(IME)와 함께 동작하도록 설계된 다른 키들도 정의합니다: "Accept", "AllCandidates", "Cancel", "Convert", "Compose", "Zenkaku" (전각), "Hankaku" (반각), "NextCandidate", "NonConvert", "PreviousCandidate". 이 키들의 기능은 현행 표준에서 정의하지 않으므로, 입력기(IME) 기능에 대한 자세한 내용은 다른 자료를 참고하세요.

입력기(IME)용 기능을 가진 키들은 그 목적으로만 사용이 제한되지 않으며, 장치/구현에 따라 다른 용도로도 사용될 수 있습니다.

4.3.4. 기본 동작 및 취소 가능한 키보드 이벤트

keydown 이벤트의 기본 동작을 취소해도 해당 keyup 이벤트에는 영향을 주지 않아야 하며, 대신 해당 beforeinput, input(및 keypress가 지원된다면) 이벤트의 생성을 반드시 막아야 합니다. 아래 예시는 US 키보드, US 매핑에서 Q(라틴 대문자 Q) 유니코드 문자를 생성하는 키 시퀀스를 보여줍니다:

이벤트 유형 KeyboardEvent
key
InputEvent
data
수정키 비고
1 keydown "Shift" shiftKey
2 keydown "Q" shiftKey 기본 동작이 방지됨, 예: preventDefault() 호출 등
beforeinput 또는 input (keypress 포함, 지원 시) 이벤트가 생성되지 않음
3 keyup "Q" shiftKey
4 keyup "Shift"

만약 키가 수정키인 경우, 해당 키 입력은 수정키 상태에도 반드시 반영되어야 합니다. 아래 예시는 US 키보드, US 매핑에서 Q(라틴 대문자 Q) 유니코드 문자를 생성하는 키 시퀀스를 보여줍니다:

이벤트 유형 KeyboardEvent
key
InputEvent
data
수정키 비고
1 keydown "Shift" shiftKey 기본 동작이 방지됨, 예: preventDefault() 호출 등
2 keydown "Q" shiftKey
3 beforeinput "Q"
4 input
5 keyup "Q" shiftKey
6 keyup "Shift"

키가 여러 키 입력 시퀀스의 일부일 때(죽은 키 또는 입력기 시퀀스에 기여하는 경우), 해당 키 입력은 반드시 keydown 이벤트에서 기본 동작이 취소된 경우에만 무시(반영하지 않음)해야 합니다. keyup 이벤트에서 죽은 키를 취소해도 beforeinput 또는 input 이벤트에는 영향을 주지 않습니다. 아래 예시는 프랑스 키보드, 프랑스 매핑에서 "Dead"(U+0302 곡절 부호)와 "e"(U+0065, 라틴 소문자 E)를 수정키 없이 입력하는 시퀀스입니다:

이벤트 유형 KeyboardEvent
key
InputEvent
data
비고
1 keydown "Dead" 기본 동작이 방지됨, 예: preventDefault() 호출 등
2 keyup "Dead"
3 keydown "e"
4 beforeinput "e"
5 input
6 keyup "e"

5. 외부 알고리즘

이 절에는 이 명세에서 필요하지만 다른 명세에서 관리하는 것이 더 적합한 알고리즘이 포함되어 있습니다.

이 절의 목적은 이러한 정의에 대한 임시 집합소 역할을 하며, 궁극적으로 더 적합한 위치로 이동되어 이 절 전체가 삭제될 수 있도록 하는 것입니다.

5.1. 핵심 DOM 알고리즘

아래 알고리즘들은 더 적합한 위치로 이동되어야 합니다... 어디로든.

5.1.1. 히트 테스트

입력

pos, 뷰포트 기준 x,y 좌표

출력

pos 위치에 있는 최상위 DOM 요소

비활성화 또는 사용 불가 요소를 처리하기 위해, elementsFromPoint를 호출하고 유효하지 않은 요소를 제외해야 합니다.

  1. pos에 대해 [CSSOM-View]elementFromPoint를 반환

5.1.2. DOM 경로 계산

입력

element, 시작 요소

출력

해당 요소의 조상 요소 목록

  1. path = element를 담은 리스트로 설정

    path에 조상을 추가하는 정확한 정의가 필요합니다.

  2. path를 반환

5.2. 포인터락 알고리즘

아래 알고리즘은 [PointerLock] 명세로 이동해야 합니다.

5.2.1. 포인터락의 전역 상태

5.2.1.1. Window 수준 상태

UA는 Window 전체에서 공유되는 다음 값을 유지해야 합니다.

마지막 마우스 이동 값(초기값은 정의되지 않음)은 마지막 mousemove 이벤트의 위치를 기록합니다.

5.2.2. MouseEvent의 PointerLock 속성 초기화

입력

event, MouseEvent

출력

없음

  1. event.movementX = 0

  2. event.movementY = 0

5.2.3. mousemove의 PointerLock 속성 설정

입력

event, MouseEvent

출력

없음

  1. event.type 이 "mousemove"가 아니면 종료

  2. 마지막 마우스 이동이 정의되지 않았다면,

    1. event.movementX = 0

    2. event.movementY = 0

  3. 그렇지 않으면,

    1. event.movementX = event.screenX - 마지막 마우스 이동의 x좌표

    2. event.movementY = event.screenX - 마지막 마우스 이동의 y좌표

  4. 마지막 마우스 이동 = ( event.screenX, event.screenY )

5.3. 포인터 이벤트 알고리즘

아래 알고리즘은 [PointerEvents3] 명세로 이동해야 합니다.

5.3.1. PointerEvent 초기화

입력

event, 초기화할 PointerEvent

eventType, 이벤트 타입을 담은 DOMString

eventTarget, 이벤트의 EventTarget

출력

없음

  1. MouseEvent 초기화event, eventType, eventTarget으로 수행

TODO - pointerevent 속성 초기화 필요

5.3.2. PointerEvent 생성

입력

eventType, 이벤트 타입을 담은 DOMString

eventTarget, 이벤트의 EventTarget

출력

없음

  1. event = 새 이벤트 생성 결과, PointerEvent 사용

  2. PointerEvent 초기화event, eventType, eventTarget으로 수행

  3. event를 반환

5.3.3. MouseEvent로부터 PointerEvent 생성

입력

eventType, 이벤트 타입을 담은 DOMString

mouseevent, 해당하는 MouseEvent

출력

없음

  1. event = 새 이벤트 생성 결과, PointerEvent 사용

  2. target = mouseevent.target

  3. PointerEvent 초기화event, eventType, target으로 수행

  4. MouseEvent 속성을 mouseevent에서 event로 복사

  5. event를 반환

5.3.4. pointerout 이벤트 전송 가능성 판단

입력

mouseout, 해당하는 mouseout MouseEvent

출력

없음

  1. pointerout = MouseEvent로부터 PointerEvent 생성 ("pointerout", mouseout)

  2. pointerevent 속성 설정

    TODO

  3. target = mouseout.target

  4. pointerouttarget에서 디스패치

5.3.5. pointerleave 이벤트 전송 가능성 판단

입력

mouseout, 해당하는 mouseout MouseEvent

출력

없음

  1. pointerout = MouseEvent로부터 PointerEvent 생성 ("pointerout", mouseout)

  2. pointerevent 속성 설정

    TODO

  3. target = mouseout.target

  4. pointerouttarget에서 디스패치

5.3.6. pointerover 이벤트 전송 가능성 판단

입력

mouseout, 해당하는 mouseout MouseEvent

출력

없음

  1. pointerout = MouseEvent로부터 PointerEvent 생성 ("pointerout", mouseout)

  2. pointerevent 속성 설정

    TODO

  3. target = mouseout.target

  4. pointerouttarget에서 디스패치

5.3.7. pointerenter 이벤트 전송 가능성 판단

입력

mouseout, 해당하는 mouseout MouseEvent

출력

없음

  1. pointerout = MouseEvent로부터 PointerEvent 생성 ("pointerout", mouseout)

  2. pointerevent 속성 설정

    TODO

  3. target = mouseout.target

  4. pointerouttarget에서 디스패치

5.3.8. pointermove 이벤트 전송 가능성 판단

입력

mouseout, 해당하는 mouseout MouseEvent

출력

없음

pointermove와 pointerrawupdate를 보내려면? 아니면 두 메서드가 필요한가?

pointermove 이벤트를 제대로 결합(coalesce)하려면 무엇이 필요한가?

  1. pointerout = MouseEvent로부터 PointerEvent 생성 ("pointerout", mouseout)

  2. pointerevent 속성 설정

    TODO

  3. target = mouseout.target

  4. pointerouttarget에서 디스패치

5.3.9. pointerdown 이벤트 전송 가능성 판단

입력

mouseout, 해당하는 mouseout MouseEvent

출력

없음

mousedown 이벤트와 달리, pointerdown 이벤트는 여러 버튼을 동시에 누를 때 중첩되지 않습니다. MouseEvent는 필드 복사를 위해 전달됩니다.

  1. pointerout = MouseEvent로부터 PointerEvent 생성 ("pointerout", mouseout)

  2. pointerevent 속성 설정

    TODO

  3. target = mouseout.target

  4. pointerouttarget에서 디스패치

5.3.10. pointerup 이벤트 전송 가능성 판단

입력

mouseout, 해당하는 mouseout MouseEvent

출력

없음

mouseup 이벤트와 달리, pointerup 이벤트는 여러 버튼을 동시에 누를 때 중첩되지 않습니다. MouseEvent는 필드 복사를 위해 전달됩니다.

  1. pointerout = MouseEvent로부터 PointerEvent 생성 ("pointerout", mouseout)

  2. pointerevent 속성 설정

    TODO

  3. target = mouseout.target

  4. pointerouttarget에서 디스패치

6. 레거시 이벤트 이니셜라이저

이 절은 규범적입니다. 다음 기능들은 더 이상 사용되지 않으며, 레거시 소프트웨어와의 호환성이 필요한 사용자 에이전트에서만 구현되어야 합니다.

이 명세의 초기 버전에는 인터페이스에 이니셜라이즈 메서드(예: initMouseEvent)가 포함되어 있었는데, 이 메서드는 많은 수의 매개변수를 필요로 했으나 대부분의 경우 이벤트 객체의 모든 속성을 완전히 초기화하지 못했습니다. 이 때문에, 기본 Event 인터페이스에서 파생된 이벤트 인터페이스들은 이벤트를 완전히 초기화하기 위해 파생된 각 인터페이스의 이니셜라이저를 명시적으로 호출해야만 했습니다.

UIEvent의 모든 속성을 초기화하려면 initEventinitUIEvent 두 이니셜라이저 메서드를 호출해야 합니다.

이 표준의 개발 기간이 길어진 영향으로, 일부 구현체는 이런(현재는 폐기된) 이니셜라이저 메서드에 의존성을 가질 수 있습니다. 완전성을 위해, 이러한 레거시 이벤트 이니셜라이저를 이 부록에서 설명합니다.

6.1. 레거시 이벤트 이니셜라이저 인터페이스

이 절은 참고용입니다

이 절은 이전 버전 명세에서 도입된 레거시 이니셜라이저 메서드들을 문서화합니다.

6.1.1. UIEvent 인터페이스용 이니셜라이저

partial interface UIEvent {
  // 현행 표준에서 사용 중단됨
  undefined initUIEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional Window? viewArg = null,
    optional long detailArg = 0);
};
initUIEvent(typeArg)
UIEvent 객체의 속성을 초기화합니다. 이 메서드는 initEvent() 와 동일하게 동작합니다.

initUIEvent 메서드는 사용 중단되었으나, 널리 배포된 구현체와의 하위 호환성으로 인해 지원됩니다.

DOMString typeArg
이 매개변수에 대한 설명은 initEvent() 메서드를 참조하세요.
boolean bubblesArg
이 매개변수에 대한 설명은 initEvent() 메서드를 참조하세요.
boolean cancelableArg
이 매개변수에 대한 설명은 initEvent() 메서드를 참조하세요.
Window? viewArg
view 를 지정합니다. 이 값은 null이 될 수 있습니다.
long detailArg
detail 를 지정합니다.

6.1.2. MouseEvent 인터페이스용 이니셜라이저

partial interface MouseEvent {
  // 현행 표준에서 사용 중단됨
  undefined initMouseEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional Window? viewArg = null,
    optional long detailArg = 0,
    optional long screenXArg = 0,
    optional long screenYArg = 0,
    optional long clientXArg = 0,
    optional long clientYArg = 0,
    optional boolean ctrlKeyArg = false,
    optional boolean altKeyArg = false,
    optional boolean shiftKeyArg = false,
    optional boolean metaKeyArg = false,
    optional short buttonArg = 0,
    optional EventTarget? relatedTargetArg = null);
};
initMouseEvent(typeArg)
MouseEvent 객체의 속성을 초기화합니다. 이 메서드는 UIEvent.initUIEvent()와 동일하게 동작합니다.

initMouseEvent 메서드는 사용 중단되었으나, 널리 배포된 구현체와의 하위 호환성으로 인해 지원됩니다.

DOMString typeArg
이 매개변수에 대한 설명은 initEvent() 메서드를 참조하세요.
boolean bubblesArg
이 매개변수에 대한 설명은 initEvent() 메서드를 참조하세요.
boolean cancelableArg
이 매개변수에 대한 설명은 initEvent() 메서드를 참조하세요.
Window? viewArg
view 를 지정합니다. 이 값은 null이 될 수 있습니다.
long detailArg
detail 를 지정합니다.
long screenXArg
screenX 를 지정합니다.
long screenYArg
screenY 를 지정합니다.
long clientXArg
clientX 를 지정합니다.
long clientYArg
clientY 를 지정합니다.
boolean ctrlKeyArg
ctrlKey 를 지정합니다.
boolean altKeyArg
altKey 를 지정합니다.
boolean shiftKeyArg
shiftKey 를 지정합니다.
boolean metaKeyArg
metaKey 를 지정합니다.
short buttonArg
button 를 지정합니다.
EventTarget? relatedTargetArg
relatedTarget 를 지정합니다. 이 값은 null이 될 수 있습니다.

6.1.3. KeyboardEvent 인터페이스용 이니셜라이저

이 레거시 KeyboardEvent 이니셜라이저의 인자 목록에는 detailArg(다른 이니셜라이저에는 있음)가 포함되어 있지 않고 locale 인자가 추가되어 있습니다. 기존 구현체와의 호환성을 위해 이 불일치가 유지되어야 합니다.

partial interface KeyboardEvent {
  // 이 명세에서 도입(그리고 사용 중단됨)
  undefined initKeyboardEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional Window? viewArg = null,
    optional DOMString keyArg = "",
    optional unsigned long locationArg = 0,
    optional boolean ctrlKey = false,
    optional boolean altKey = false,
    optional boolean shiftKey = false,
    optional boolean metaKey = false);
};
initKeyboardEvent(typeArg)
KeyboardEvent 객체의 속성을 초기화합니다. 이 메서드는 UIEvent.initUIEvent()와 동일하게 동작합니다. detail 값은 정의되지 않은 상태로 남아 있습니다.

initKeyboardEvent 메서드는 사용 중단되었습니다.

DOMString typeArg
이 매개변수에 대한 설명은 initEvent() 메서드를 참조하세요.
boolean bubblesArg
이 매개변수에 대한 설명은 initEvent() 메서드를 참조하세요.
boolean cancelableArg
이 매개변수에 대한 설명은 initEvent() 메서드를 참조하세요.
Window? viewArg
view 를 지정합니다. 이 값은 null이 될 수 있습니다.
DOMString keyArg
key 를 지정합니다.
unsigned long locationArg
location 를 지정합니다.
boolean ctrlKey
Control 키 수정자가 활성화되어 있는지 여부를 지정합니다.
boolean altKey
Alt 키 수정자가 활성화되어 있는지 여부를 지정합니다.
boolean shiftKey
Shift 키 수정자가 활성화되어 있는지 여부를 지정합니다.
boolean metaKey
Meta 키 수정자가 활성화되어 있는지 여부를 지정합니다.

6.1.4. CompositionEvent 인터페이스용 이니셜라이저

이 레거시 CompositionEvent 이니셜라이저의 인자 목록에는 detailArg(다른 이니셜라이저에는 있음)가 포함되어 있지 않고 locale 인자가 추가되어 있습니다. 기존 구현체와의 호환성을 위해 이 불일치가 유지되어야 합니다.

partial interface CompositionEvent {
  // 이 명세에서 도입(그리고 사용 중단됨)
  undefined initCompositionEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional WindowProxy? viewArg = null,
    optional DOMString dataArg = "");
};
initCompositionEvent(typeArg)
CompositionEvent 객체의 속성을 초기화합니다. 이 메서드는 UIEvent.initUIEvent()와 동일하게 동작합니다. detail 값은 정의되지 않은 상태로 남아 있습니다.

initCompositionEvent 메서드는 사용 중단되었습니다.

DOMString typeArg
이 매개변수에 대한 설명은 initEvent() 메서드를 참조하세요.
boolean bubblesArg
이 매개변수에 대한 설명은 initEvent() 메서드를 참조하세요.
boolean cancelableArg
이 매개변수에 대한 설명은 initEvent() 메서드를 참조하세요.
Window? viewArg
view 를 지정합니다. 이 값은 null이 될 수 있습니다.
DOMString dataArg
data 를 지정합니다.

7. 레거시 키 & 마우스 이벤트 속성

이 절은 참고용입니다. 다음 속성은 더 이상 사용되지 않으며, 해당 키보드 이벤트와의 호환성이 필요한 사용자 에이전트에서만 구현되어야 합니다.

이 기능들은 공식적으로 명세된 적이 없으며, 현재 브라우저 구현체마다 상당한 차이가 있습니다. 사용자 에이전트를 감지하여 동작하는 많은 레거시 콘텐츠(스크립트 라이브러리 포함)가 있기 때문에, 이러한 레거시 속성과 이벤트를 공식화하려는 시도는 오히려 콘텐츠를 망가뜨릴 위험이 있습니다. 또한, 이 속성들은 국제화나 접근성 문제를 해결하지 못합니다.

따라서, 이 명세는 키보드 입력 처리를 위해 일반적으로 사용되는 이벤트와 속성을 규범적으로 정의하지 않지만, 레거시 콘텐츠와의 호환성을 위해 사용자 에이전트에 포함될 수 있습니다. 작성자는 key 속성을 charCodekeyCode 속성 대신 사용해야 합니다.

하지만, 이 기능들의 현재 상태와 규범적 이벤트 및 속성과의 관계를 문서화하기 위해 이 절에서 설명을 제공합니다. 이러한 속성과 이벤트를 지원하는 구현체에서는 본 절의 정의를 사용하는 것이 권장됩니다.

7.1. 레거시 UIEvent 보조 인터페이스

이 절은 참고용입니다

사용자 에이전트는 전통적으로 which 속성을 포함하여 KeyboardEventMouseEvent에 추가 이벤트 정보를 기록할 수 있도록 했습니다.

이전 버전 명세는 which 속성을 KeyboardEventMouseEvent에 각각 정의했으나, 현재는 UIEvent에 공유 속성으로 정의합니다.

7.1.1. UIEvent 인터페이스 (보조)

부분 UIEvent 인터페이스는 UIEvent 인터페이스를 확장하여 which 속성을 추가합니다.

partial interface UIEvent {
  // 다음은 레거시 사용자 에이전트 지원용
  readonly attribute unsigned long which;
};
which, 타입 unsigned long, readonly
MouseEvent의 경우, button+1 값이 들어갑니다. KeyboardEvent의 경우, 눌린 키에 대한 수정되지 않은 식별자에 해당하는 시스템 및 구현체 의존적인 숫자 코드가 들어갑니다. 대부분의 경우, keyCode와 동일한 값입니다.

7.1.2. UIEventInit 인터페이스 (보조)

UIEventwhich를 지원하는 브라우저는 UIEventInit 딕셔너리에도 아래 멤버를 추가해야 합니다.

부분 UIEventInit 딕셔너리는 UIEventInit 딕셔너리를 확장하여 which 멤버를 추가해 UIEvent 속성을 초기화합니다.

partial dictionary UIEventInit {
  unsigned long which = 0;
};
which, 타입 unsigned long, 기본값 0
UIEventwhich 속성을 초기화합니다.

7.2. 레거시 KeyboardEvent 보조 인터페이스

이 절은 참고용입니다

브라우저의 키보드 지원은 세 가지 임의 속성, keyCode, charCode, 그리고 UIEventwhich에 의존해왔습니다.

이 세 속성은 모두 눌린 키와 관련된 숫자 코드를 반환합니다: keyCode는 키 자체의 인덱스, charCode는 문자 키의 ASCII 값, which는 문자 값(가능하면) 또는 키 인덱스를 반환합니다. 이 값들과 속성의 지원 여부는 플랫폼, 키보드 언어/레이아웃, 사용자 에이전트, 버전, 그리고 이벤트 타입에 따라 일관되지 않습니다.

7.2.1. KeyboardEvent 인터페이스 (보조)

부분 KeyboardEvent 인터페이스는 KeyboardEvent 인터페이스를 확장하여 charCodekeyCode 속성을 추가합니다.

부분 KeyboardEvent 인터페이스는 이 확장을 지원하는 구현체에서 createEvent() 메서드 호출로 얻을 수 있습니다.

partial interface KeyboardEvent {
  // 다음은 레거시 사용자 에이전트 지원용
  readonly attribute unsigned long charCode;
  readonly attribute unsigned long keyCode;
};
charCode, 타입 unsigned long, readonly
charCodekeypress 이벤트에서 문자 입력을 생성하는 경우 문자값(유니코드 코드포인트, 예: event.charCode = event.key.charCodeAt(0))을 담습니다. keydown 또는 keyup 이벤트에서는 charCode의 값이 0입니다.
keyCode, 타입 unsigned long, readonly
keyCode는 눌린 키에 대한 수정되지 않은 식별자에 해당하는 시스템 및 구현체 의존적인 숫자 코드를 담습니다. key 속성과 달리 값의 집합이 규범적으로 정의되어 있지 않습니다. 일반적으로 keyCode 값은 ASCII [RFC20][US-ASCII] 또는 Windows 1252 [WIN1252]의 십진수 코드포인트를 나타내야 하지만, 다른 적절한 문자셋에서 가져올 수도 있습니다. 키를 식별할 수 없는 경우 0을 사용합니다.

자세한 값 판별 방식은 § 7.3 레거시 키 모델을 참고하세요.

7.2.2. KeyboardEventInit 인터페이스 (보조)

KeyboardEventkeyCodecharCode를 지원하는 브라우저는 KeyboardEventInit 딕셔너리에도 아래 멤버를 추가해야 합니다.

부분 KeyboardEventInit 딕셔너리는 KeyboardEventInit 딕셔너리를 확장하여 charCodekeyCode 멤버를 추가해 KeyboardEvent 속성을 초기화합니다.

partial dictionary KeyboardEventInit {
  // 다음은 레거시 사용자 에이전트 지원용
  unsigned long charCode = 0;
  unsigned long keyCode = 0;
};
charCode, 타입 unsigned long, 기본값 0
charCode 속성을 KeyboardEvent의 이벤트 문자 유니코드 코드포인트로 초기화합니다.
keyCode, 타입 unsigned long, 기본값 0
keyCode 속성을 KeyboardEvent의 눌린 키에 대한 수정되지 않은 식별자를 나타내는 시스템 및 구현체 의존적인 숫자 코드로 초기화합니다.

7.3. 레거시 키 모델

이 절은 참고용입니다

구현체마다 이벤트 타입에 따라 이 속성에 어떤 값이 노출되는지 다릅니다. 구현체는 keyCode 속성에서 가상 키 코드와 문자 코드를 모두 노출하는(통합 모델), 또는 keyCodecharCode 속성을 분리해서 보고하는(분리 모델) 방식을 선택할 수 있습니다.

7.3.1. keyCode 값 결정 방법 (keydown, keyup 이벤트)

keydown 또는 keyup 이벤트의 keyCode 결정 방법:

7.3.2. keyCode 값 결정 방법 (keypress 이벤트)

keypress 이벤트의 keyCode 결정 방법:

7.3.3. 고정 가상 키 코드

데스크톱 시스템에서 아래 키들의 가상 키 코드는 키보드 레이아웃이 달라져도 일반적으로 변하지 않습니다:

가상 키
코드
비고
Backspace 8
Tab 9
Enter 13
Shift 16
Control 17
Alt 18
CapsLock 20
Escape 27 Esc
Space 32
PageUp 33
PageDown 34
End 35
Home 36
ArrowLeft 37
ArrowUp 38
ArrowRight 39
ArrowDown 40
Delete 46 Del

7.3.4. 선택적으로 고정되는 가상 키 코드

아래 구두점 문자는 키보드 레이아웃에 따라 가상 키 코드가 달라질 수 있지만, US-영문 키보드 레이아웃을 기대하는 레거시 콘텐츠와의 호환성 측면에서 아래 값을 사용하는 것이 더 안전합니다:

문자 가상 키
코드
Semicolon ";" 186
Colon ":" 186
Equals sign "=" 187
Plus "+" 187
Comma "," 188
Less than sign "<" 188
Minus "-" 189
Underscore "_" 189
Period "." 190
Greater than sign ">" 190
Forward slash "/" 191
Question mark "?" 191
Backtick "`" 192
Tilde "~" 192
Opening squace bracket "[" 219
Opening curly brace "{" 219
Backslash "\" 220
Pipe "|" 220
Closing square bracket "]" 221
Closing curly brace "}" 221
Single quote "'" 222
Double quote """ 222

8. 레거시 이벤트 타입

이 절은 규범적입니다. 다음 이벤트 타입들은 더 이상 사용되지 않으며, 레거시 소프트웨어와의 호환성이 필요한 사용자 에이전트에서만 구현되어야 합니다.

이 절의 목적은 이러한 기능의 현재 상태와 규범적 이벤트와의 관계를 문서화하는 것입니다. 이러한 이벤트를 지원하는 구현체에서는 본 절의 정의를 사용하는 것이 권장됩니다.

아래 표는 이 명세에서 사용 중단된 이벤트 타입의 요약 정보를 제공합니다. 참조와 완전성을 위해 포함되어 있습니다.

이벤트 타입 동기 / 비동기 버블링 신뢰할 수 있는 이벤트 타겟 타입 DOM 인터페이스 취소 가능 Composed 기본 동작
DOMActivate 동기 Element UIEvent 없음
DOMFocusIn 동기 Window, Element FocusEvent 아니오 없음
DOMFocusOut 동기 Window, Element FocusEvent 아니오 없음
keypress 동기 Element KeyboardEvent 다양함: 텍스트 조합 시스템 활성화; blur, focus 이벤트; DOMActivate 이벤트; 기타 이벤트
textInput 동기 Element TextEvent 정의 참고

8.1. 레거시 UIEvent 이벤트

8.1.1. 레거시 UIEvent 이벤트 타입

8.1.1.1. DOMActivate
타입 DOMActivate
인터페이스 UIEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 타겟 Element
취소 가능
Composed
기본 동작 없음
컨텍스트
(신뢰 이벤트)

사용자 에이전트는 버튼, 링크 등 상태가 변하는 요소가 활성화될 때 반드시 이 이벤트를 디스패치해야 합니다.

DOMActivate 이벤트 타입은 참조와 완전성을 위해 본 명세에 정의되어 있지만, 현행 표준에서는 관련 이벤트 타입 click을 사용할 것을 권장하며, DOMActivate 이벤트 타입의 사용은 더 이상 권장되지 않습니다.

DOMActivateclick은 완전히 동일하지 않지만, click 이벤트 타입DOMActivate 이벤트 타입이 의도했던 접근성 측면의 주요 기능을 대부분 포괄하며, 구현체에서 더 널리 사용됩니다. 콘텐츠 작성자는 접근성을 위해 click 이벤트 타입을, mousedown 또는 mouseup 이벤트 타입 대신 사용할 것을 권장합니다.

DOMActivate 이벤트 타입을 지원하는 구현체는 활성화 트리거가 있는 click 이벤트의 기본 동작으로 DOMActivate 이벤트도 디스패치해야 합니다. 단, 이러한 구현체는 동일한 활성화 트리거 발생 시에는 반드시 한 번만 활성화 동작을 실행해야 합니다.

DOMActivate 이벤트 타입[XFORMS11]에 대해 필수적으로 지원되어야 하며, 이는 호스트 언어 내에서의 구현을 위한 것입니다. 플러그인 또는 스크립트 기반 XForms 구현이 이 명세를 네이티브로 지원하는 환경에 설치되는 경우, 그 환경에서 DOMActivate 이벤트 타입을 지원하지 않는다면, XForms 사용자 에이전트는 적절한 활성화 트리거에 따라 자체적으로 DOMActivate 이벤트를 합성 및 디스패치해야 합니다.

따라서, UI Events를 준수하는 click 이벤트가 사용자 에이전트에 의해 디스패치될 때, XForms 사용자 에이전트는 해당 click 이벤트의 기본 동작으로 동일한 관련 속성을 가진 DOMActivate 이벤트를 합성할지 판단해야 합니다. 적절한 판단 기준으로는 click 이벤트의 isTrusted 값이나, 이벤트 타겟DOMActivate 이벤트 리스너가 등록되어 있는지 여부 등이 있습니다.

DOMActivate의 상호운용성 지원을 기대하지 마세요. 대신 click 이벤트 타입을 사용하면 더 넓은 구현 지원으로 인해 접근성이 향상됩니다.

DOMActivate 이벤트 타입은 현행 표준에서 더 이상 권장되지 않습니다.

8.1.2. 활성화 이벤트 순서

사용자 에이전트DOMActivate 이벤트를 지원하는 경우, 이벤트들은 반드시 서로에 대해 지정된 순서로 디스패치되어야 합니다(관련 이벤트만 나열):

이벤트 타입 비고
1 click
2 DOMActivate 기본 동작, 사용자 에이전트가 지원하는 경우; 합성됨; isTrusted="true"
3 모든 기타 기본 동작 (예: 활성화 동작 포함)

포커스된 요소가 키 이벤트로 활성화되는 경우, 다음은 일반적인 이벤트 시퀀스입니다(관련 이벤트만 나열):

이벤트 타입 비고
1 keydown 요소를 활성화할 수 있는 키여야 하며, Enter 또는 (스페이스바)와 같은 키여야 함. 아니면 활성화되지 않음
2 click 기본 동작; 합성됨; isTrusted="true"
3 DOMActivate 기본 동작, 사용자 에이전트가 지원하는 경우; 합성됨; isTrusted="true"
4 모든 기타 기본 동작 (예: 활성화 동작 포함)

8.2. 레거시 FocusEvent 이벤트

8.2.1. 레거시 FocusEvent 이벤트 타입

8.2.1.1. DOMFocusIn
타입 DOMFocusIn
인터페이스 FocusEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 타겟 Window, Element
취소 가능 아니오
Composed
기본 동작 없음
컨텍스트
(신뢰 이벤트)

user agentevent target이 포커스를 받을 때 반드시 이 이벤트를 디스패치해야 합니다. 포커스는 이 이벤트 타입을 디스패치하기 전에 해당 요소에 반드시 먼저 주어져야 합니다. 이 이벤트 타입은 focus 이벤트 타입 이후에 반드시 디스패치되어야 합니다.

DOMFocusIn 이벤트 타입은 참조 및 완전성을 위해 이 명세에 정의되어 있지만, 이 명세는 관련 이벤트 타입 focusfocusin을 사용하도록 이 이벤트 타입의 사용을 더 이상 권장하지 않습니다.

8.2.1.2. DOMFocusOut
타입 DOMFocusOut
인터페이스 FocusEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 타겟 Window, Element
취소 가능 아니오
Composed
기본 동작 없음
컨텍스트
(신뢰 이벤트)

user agentevent target이 포커스를 잃을 때 반드시 이 이벤트를 디스패치해야 합니다. 포커스는 이 이벤트 타입을 디스패치하기 전에 해당 요소에서 반드시 먼저 제거되어야 합니다. 이 이벤트 타입은 blur 이벤트 타입 이후에 반드시 디스패치되어야 합니다.

DOMFocusOut 이벤트 타입은 참조와 완전성을 위해 이 명세에 정의되어 있지만, 이 명세는 관련 이벤트 타입 blurfocusout의 사용을 권장하며 이 이벤트 타입의 사용을 더 이상 권장하지 않습니다.

8.2.2. 레거시 FocusEvent 이벤트 순서

아래는 요소 간 포커스가 이동될 때의 일반적인 이벤트 시퀀스입니다. 여기에는 더 이상 사용되지 않는 DOMFocusInDOMFocusOut 이벤트도 포함됩니다. 표시된 순서는 처음에 포커스된 요소가 없는 것으로 가정합니다.

이벤트 타입 비고
사용자가 포커스 이동
1 focusin 첫 번째 타겟 요소가 포커스를 받기 전에 전송됨
2 focus 첫 번째 타겟 요소가 포커스를 받은 후 전송됨
3 DOMFocusIn 지원하는 경우
사용자가 포커스 이동
4 focusout 첫 번째 타겟 요소가 포커스를 잃기 전에 전송됨
5 focusin 두 번째 타겟 요소가 포커스를 받기 전에 전송됨
6 blur 첫 번째 타겟 요소가 포커스를 잃은 후 전송됨
7 DOMFocusOut 지원하는 경우
8 focus 두 번째 타겟 요소가 포커스를 받은 후 전송됨
9 DOMFocusIn 지원하는 경우

8.3. 레거시 KeyboardEvent 이벤트

keypress 이벤트는 키 이벤트를 캡처하고 DOM이 키 입력의 효과로 갱신되기 전에 처리하는 전통적인 방법입니다. keypress 이벤트를 사용하는 코드는 레거시 charCode, keyCode, 그리고 which 속성에 의존합니다.

keypress 이벤트는 키 이벤트에 특화되어 있으며, 더 일반적인 beforeinputinput 이벤트 시퀀스로 대체되었습니다. 이 새로운 input 이벤트는 키보드 동작에 국한되지 않으며, 입력의 원천과 관계없이 사용자 입력을 캡처하는 데 사용할 수 있습니다.

8.3.1. 레거시 KeyboardEvent 이벤트 타입

8.3.1.1. keypress
타입 keypress
인터페이스 KeyboardEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 타겟 Element
취소 가능
Composed
기본 동작 다양함: 텍스트 조합 시스템 활성화; blur, focus 이벤트; DOMActivate 이벤트; 기타 이벤트
컨텍스트
(신뢰 이벤트)

사용자 에이전트가 지원하는 경우, 키가 눌려질 때(해당 키가 일반적으로 문자 값을 생성하는 경우에만) 반드시 이 이벤트가 디스패치되어야 합니다. keypress 이벤트 타입은 장치 의존적이며, 입력 장치의 기능과 운영체제에서 어떻게 매핑되는지에 따라 달라집니다.

이 이벤트 타입은 키 매핑 이후에 반드시 생성되어야 하며, 입력기(IME) 사용 시에는 발생하지 않아야 합니다.

이 이벤트가 취소되면 input 이벤트 발생을 막아야 하며, 기본 동작도 취소해야 합니다.

작성자는 keypress 이벤트 대신 beforeinput 이벤트를 사용해야 합니다.

keypress 이벤트는 전통적으로 물리적 키보드 키가 아니라 문자 값 감지에 사용되어 왔으며, 일부 환경에서는 모든 키에 대해 제공되지 않을 수 있습니다.

keypress 이벤트 타입은 본 명세에 참조 및 완전성 목적으로 정의되어 있지만, 현행 표준에서는 더 이상 권장되지 않습니다. 편집 컨텍스트에서는 beforeinput 이벤트를 구독하는 것이 좋습니다.

8.3.2. keypress 이벤트 순서

keypress 이벤트 타입은 동일한 키에 대해 keydown 이벤트 이후, keyup 이벤트 이전에 반드시 디스패치되어야 합니다.

keypress 이벤트 타입은 동일한 키에 대해 beforeinput 이벤트 이후, input 이벤트 이전에 반드시 디스패치되어야 합니다.

keypress 이벤트를 지원하는 사용자 에이전트의 키 이벤트 시퀀스는 아래 예시에서 볼 수 있습니다:

이벤트 타입 KeyboardEvent
key
InputEvent
data
비고
1 keydown "a"
2 beforeinput "a"
3 keypress "a"
이 키에 관련된 기본 동작 (예: 문자를 DOM에 삽입 등)
4 input
5 keyup "a"

8.4. 레거시 TextEvent 이벤트

[Exposed=Window]
interface TextEvent : UIEvent {
    readonly attribute DOMString data;
    undefined initTextEvent(DOMString type,
        optional boolean bubbles = false,
        optional boolean cancelable = false,
        optional Window? view = null,
        optional DOMString data = "undefined");
};

TextEvent 인터페이스 및 textInput 이벤트에 대해서는 UI Events Algorithms의 텍스트 이벤트 섹션을 참고하세요.

9. 이벤트 확장

이 절은 참고용입니다

9.1. 소개

이 명세는 여러 인터페이스와 많은 이벤트를 정의하지만, 모든 목적에 대한 포괄적인 이벤트 집합은 아닙니다. 콘텐츠 작성자와 구현자가 원하는 기능을 추가할 수 있도록, 이 명세는 인터페이스와 이벤트 집합을 충돌 없이 확장할 수 있는 두 가지 메커니즘을 제공합니다: 커스텀 이벤트구현체별 확장.

9.2. 커스텀 이벤트

스크립트 작성자는 애플리케이션의 기능적 컴포넌트와, 그 아키텍처에 의미가 있는 이벤트 타입을 정의하고자 할 수 있습니다. 콘텐츠 작성자는 CustomEvent 인터페이스를 사용하여 자신이 사용하는 추상화 수준에 맞는 이벤트를 직접 만들 수 있습니다.

예를 들어, 콘텐츠 작성자가 동적으로 생성되는 막대그래프(bar chart)를 가진 애플리케이션을 만들었다고 합시다. 이 그래프는 5분마다, 혹은 피드에 새 정보가 있을 때, 또는 사용자가 버튼을 눌러 직접 새로고침할 때 업데이트되어야 합니다. 차트가 업데이트될 때 실행되어야 할 핸들러가 여러 개 있습니다: 애플리케이션은 최신 데이터를 가져오고, 아이콘으로 사용자에게 이벤트가 갱신 중임을 표시하고, 차트를 다시 그려야 합니다. 이를 관리하기 위해 콘텐츠 작성자는 트리거 조건이 만족될 때마다 실행되는 커스텀 updateChart 이벤트를 만들 수 있습니다:
var chartData = ...;
var evt = document.createEvent("CustomEvent");
evt.initCustomEvent( "updateChart", true, false, { data: chartData });
document.documentElement.dispatchEvent(evt);

9.3. 구현체별 확장

새로운 이벤트를 설계/프로토타이핑하거나, 구현체별 기능을 위해 이벤트를 만들 때, 표준화된 이벤트와 구분하는 것이 바람직합니다. 구현체 개발자는 자신의 구현체에만 해당하는 이벤트 타입에는 짧은 접두사를 붙여, 다른 구현체의 동일 이벤트나 표준 이벤트와 구분해야 합니다. 이는 CSS의 벤더별 키워드 접두사와 유사하지만, CSS처럼 대시("-")는 사용하지 않아야 합니다(자바스크립트에서 속성명으로 쓸 때 문제가 될 수 있기 때문).

예를 들어, 브라우저 벤더 FooCorp가 새로운 jump 이벤트를 도입하고 싶다고 합시다. 이 벤더는 "foo" 접두사를 붙여 fooJump라는 이벤트를 구현합니다. 얼리어답터들은 someElement.addEventListener("fooJump", doJump, false )로 이벤트를 실험하고, 피드백을 FooCorp에 제공하며, FooCorp는 fooJump의 동작을 이에 맞게 개선합니다.

어느 시점에 또 다른 벤더 BarOrg도 이 기능을 원하지만, 약간 다르게 구현하고 싶어 "bar" 접두사로 barJump 이벤트 타입명을 사용합니다. 콘텐츠 작성자는 각각의 이벤트 타입을 별도의 핸들러에 등록하거나, 동일한 핸들러를 사용하면서 이벤트 타입명을 구분해 처리할 수 있습니다. 그래서 초기에 서로 다른 코드베이스에서의 실험이 충돌하지 않고, 얼리어답터는 여러 구현체용 코드를 쉽게 관리할 수 있습니다.

기능이 성숙해지면서 두 브라우저의 동작이 사용자/작성자 피드백이나 표준화 과정을 통해 안정화/수렴할 수 있습니다. 위험이 줄어들면 작성자는 분기 코드를 제거하고, (표준화 이전이라도) jump 이벤트 타입명과 더 일반적인 등록 방식 someElement.addEventListener( "jump", doJump, false)을 사용할 수 있습니다.

9.3.1. 알려진 구현체별 접두사

이 문서 작성 시점에, 다음과 같은 이벤트 타입명 접두사가 사용되고 있습니다:

접두사 웹 엔진 조직
moz, Moz Gecko Mozilla
ms, MS Trident Microsoft
o, O Presto Opera Software
webkit WebKit Apple, Google, 기타

10. 보안 고려사항

이 부록은 UI Events 구현체의 보안 고려사항을 다룹니다. 논의는 이 명세에서 정의된 이벤트 모델, API 및 이벤트의 구현에서 직접 발생하는 보안 이슈로 제한됩니다. 구현체는 일반적으로 이 문서에 정의되지 않은 스크립트 언어, 다른 API 및 추가 이벤트와 같은 기타 기능도 지원합니다. 이러한 기능은 알려지지 않은 요소이며 본 문서의 범위에 포함되지 않습니다. 구현자는 해당 기능의 명세에서 각각의 보안 고려사항을 참조해야 합니다.

이 명세에서 정의된 많은 이벤트 타입은 사용자 동작에 따라 디스패치됩니다. 이는 악의적인 이벤트 리스너가 사용자가 일반적으로 기밀로 여기는 정보(예: 폼 작성시의 오타, 다지선다 선택지를 제출 직전 바꾼 경우의 정보, 입력 속도나 기본 입력 방식 등)에 접근할 수 있게 합니다. 최악의 경우, 악의적인 이벤트 리스너가 모든 사용자 상호작용을 캡처하여, DOM 구현체에 일반적으로 제공되는 XMLHttpRequest 인터페이스 등(이 명세에 정의되어 있지 않음)을 통해 제3자에게 제출할 수 있습니다.

외부 데이터를 로드하는 기능을 지원하는 DOM 구현체에서는, error 이벤트와 같은 이벤트가 컴퓨터 시스템 또는 네트워크 환경에 대한 민감한 정보에 접근할 수 있습니다. 예를 들어, 악의적인 HTML 문서가 로컬 네트워크 또는 localhost의 여러 포트에 리소스를 삽입하려 할 수 있습니다. 삽입된 DOM 애플리케이션은 errorload 이벤트를 감시하여, 로컬 시스템에서 접근 가능한 네트워크 내 다른 컴퓨터나 열린 포트를 파악해 추가 공격을 준비할 수 있습니다.

UI Events 만으로는 일반적으로 이러한 종류의 공격을 수행하기에 충분하지 않으며, 해당 공격을 지원할 수 있는 기능의 보안 고려사항이 적용됩니다. 본 명세의 적합성을 위해, DOM 구현체는 DOM 애플리케이션이 기밀 또는 민감한 정보에 접근하지 못하도록 합리적인 조치를 취할 수 있습니다. 예를 들어, 로컬 네트워크 상의 리소스를 삽입하려는 노드에는 load 이벤트를 디스패치하지 않을 수 있습니다.

11. 감사의 글

많은 사람들이 DOM 명세(Level 1, 2 또는 3)에 기여했으며, DOM 워킹 그룹, DOM Interest Group, WebAPI Working Group, WebApps Working Group 참가자들이 포함됩니다. 특히 다음 분들께 감사드립니다:

Andrew Watson (Object Management Group), Andy Heninger (IBM), Angel Diaz (IBM), Anne van Kesteren (Opera Software), Arnaud Le Hors (W3C 및 IBM), Arun Ranganathan (AOL), Ashok Malhotra (IBM 및 Microsoft), Ben Chang (Oracle), Bill Shea (Merrill Lynch), Bill Smith (Sun), Björn Höhrmann, Bob Sutor (IBM), Charles McCathie-Nevile (Opera Software, Co-Chair), Chris Lovett (Microsoft), Chris Wilson (Microsoft), Christophe Jolif (ILOG), David Brownell (Sun), David Ezell (Hewlett-Packard Company), David Singer (IBM), Dean Jackson (W3C, W3C Team Contact), Dimitris Dimitriadis (Improve AB 및 invited expert), Don Park (invited), Doug Schepers (Vectoreal), Elena Litani (IBM), Eric Vasilik (Microsoft), Gavin Nicol (INSO), Gorm Haug Eriksen (Opera Software), Ian Davis (Talis Information Limited), Ian Hickson (Google), Ian Jacobs (W3C), James Clark (invited), James Davidson (Sun), Jared Sorensen (Novell), Jeroen van Rotterdam (X-Hive Corporation), Joe Kesselman (IBM), Joe Lapp (webMethods), Joe Marini (Macromedia), John Robinson (AOL), Johnny Stenback (Netscape/AOL), Jon Ferraiolo (Adobe), Jonas Sicking (Mozilla Foundation), Jonathan Marsh (Microsoft), Jonathan Robie (Texcel Research and Software AG), Kim Adamson-Sharpe (SoftQuad Software Inc.), Lauren Wood (SoftQuad Software Inc., 전 의장), Laurence Cable (Sun), Luca Mascaro (HTML Writers Guild), Maciej Stachowiak (Apple Computer), Marc Hadley (Sun Microsystems), Mark Davis (IBM), Mark Scardina (Oracle), Martin Dürst (W3C), Mary Brady (NIST), Michael Shenfield (Research In Motion), Mick Goulish (Software AG), Mike Champion (Arbortext 및 Software AG), Miles Sabin (Cromwell Media), Patti Lutsky (Arbortext), Paul Grosso (Arbortext), Peter Sharpe (SoftQuad Software Inc.), Phil Karlton (Netscape), Philippe Le Hégaret (W3C, W3C Team Contact 및 전 의장), Ramesh Lekshmynarayanan (Merrill Lynch), Ray Whitmer (iMall, Excite@Home, 및 Netscape/AOL, 의장), Rezaur Rahman (Intel), Rich Rollman (Microsoft), Rick Gessner (Netscape), Rick Jelliffe (invited), Rob Relyea (Microsoft), Robin Berjon (Expway, Co-Chair), Scott Hayman (Research In Motion), Scott Isaacs (Microsoft), Sharon Adler (INSO), Stéphane Sire (IntuiLab), Steve Byrne (JavaSoft), Tim Bray (invited), Tim Yu (Oracle), Tom Pixley (Netscape/AOL), T.V. Raman (Google). Vidur Apparao (Netscape) 및 Vinod Anupam (Lucent).

이전 편집자: Tom Pixley (Netscape Communications Corporation, 2002년 7월까지); Philippe Le Hégaret (W3C, 2003년 11월까지); Björn Höhrmann (Invited Expert, 2008년 1월까지); Jacob Rossi (Microsoft, 2011년 3월 ~ 2011년 10월).

기여자: WebApps Working Group에서 다음 분들은 이 명세의 개선 및 개정 과정에서 실질적인 기여를 하였습니다: Bob Lund (Cable Laboratories), Cameron McCormack (Invited Expert / Mozilla), Daniel Danilatos (Google), Gary Kacmarcik (Google), Glenn Adams (Samsung), Hallvord R. M. Steen (Opera), Hironori Bono (Google), Mark Vickers (Comcast), Masayuki Nakano (Mozilla), Olli Pettay (Mozilla), Takayoshi Kochi (Google), Travis Leithead (Microsoft).

용어집 기여자: Arnaud Le Hors (W3C) 및 Robert S. Sutor (IBM Research).

테스트 슈트 기여자: Carmelo Montanez (NIST), Fred Drake, Mary Brady (NIST), Neil Delima (IBM), Rick Rivello (NIST), Robert Clary (Netscape), Curt Arnold에게 특별히 감사드립니다.

명세 개선을 위해 제안과 오류를 보내주신 분들(계속해서 문의해 주세요!), 또는 유익한 책이나 웹사이트를 작성한 분들께도 감사드립니다: Al Gilman, Alex Russell, Alexander J. Vincent, Alexey Proskuryakov, Arkadiusz Michalski, Brad Pettit, Cameron McCormack, Chris Rebert, Curt Arnold, David Flanagan, Dylan Schiemann, Erik Arvidsson, Garrett Smith, Giuseppe Pascale, James Su, Jan Goyvaerts (regular-expressions.info), Jorge Chamorro, Kazuyuki Ashimura, Ken Rehor, Magnus Kristiansen, Martijn Wargers, Martin Dürst, Michael B. Allen, Mike Taylor, Misha Wolf, Ojan Vafai, Oliver Hunt, Paul Irish, Peter-Paul Koch, Richard Ishida, Sean Hogan, Sergey Ilinsky, Sigurd Lerstad, Steven Pemberton, Tony Chang, William Edney, Øistein E. Andersen.

12. 용어집

아래 용어 정의 중 일부는 다른 W3C 또는 표준 문서에서 차용하거나 수정한 것입니다. 자세한 정보는 각 정의 내의 링크를 참고하세요.

활성화 트리거

활성화 동작을 시작하도록 정의된 이벤트.

작성자

이 명세의 맥락에서 작성자, 콘텐츠 작성자, 스크립트 작성자는 이 명세에서 정의된 인터페이스, 이벤트, 이벤트 흐름을 사용하는 스크립트나 실행 콘텐츠를 작성하는 사람입니다. 자세한 내용은 § 1.2.3 콘텐츠 작성자와 콘텐츠 적합성 범주를 참조하세요.

body 요소

HTML 또는 XHTML 문서에서 body 요소는 문서의 내용을 나타냅니다. 올바른 HTML 문서에서는 body 요소가 루트 요소의 첫 번째 자식입니다.

문자 값

키 값의 맥락에서 문자 값은 하나 이상의 유니코드 문자(예: 글자, 기호 또는 유효한 유니코드 문자 범주에 속하는 글자 집합)를 나타내는 문자열입니다. 이 명세에서는 문자 값을 유니코드 문자열(예: U+0020) 또는 동일 코드포인트의 글리프 표현(예: " ")으로 표시하며, 이 두 표기를 쉽게 구분할 수 있도록 색상 코드를 사용합니다.

소스 코드에서 일부 키 값(예: 비그래픽 문자)은 사용하는 프로그래밍 언어의 문자 이스케이프 구문을 통해 표현할 수 있습니다.

죽은 키

죽은 키는 자체로는 문자를 생성하지 않지만, 다른 키와 조합하거나 연속적으로 눌리면 변형된 문자를 만드는 키 또는 키 조합입니다(예: "ö", "é", "â" 등).

기본 동작

기본 동작은 구현체가 이벤트 객체 디스패치와 함께 반드시 수행해야 하는 OPTIONAL 보조 동작입니다. 각 이벤트 타입 정의 및 각 명세는 해당 이벤트 타입에 대한 기본 동작을 정의합니다(있는 경우). 특정 상황에서는 활성화 트리거와 연관되어 이벤트 인스턴스가 여러 기본 동작을 가질 수 있습니다. 기본 동작preventDefault() 메서드 호출로 취소할 수 있습니다.

델타

WheelEvent 인터페이스(예: 마우스 휠, 터치 패드 등)를 지원하는 입력 장치의 물리적 움직임에 따라 사용자 에이전트가 페이지를 스크롤 또는 확대/축소할 때 예상되는 스크롤 양(픽셀, 라인, 페이지 단위). 델타의 값(예: deltaX, deltaY, deltaZ 등)은 현재 deltaMode 속성의 맥락에서 해석합니다. 휠(또는 다른 장치)의 물리적 움직임과 델타가 양수/음수인지는 환경 및 장치에 따라 다릅니다. 하지만, 사용자 에이전트가 기본 동작으로 스크롤한다면, 델타의 부호는 오른손 좌표계 기준으로 X, Y, Z가 각각 오른쪽, 아래쪽, 사용자로부터 멀어진 방향입니다.

폐기됨

폐기된 기능은 이전 구현체나 명세를 참조하기 위해 포함된 것으로, OPTIONAL이며 권장되지 않습니다. 이미 존재하거나 대체가 진행 중인 기능만 이 명세에서 폐기 대상으로 지정해야 합니다. 기존에 해당 기능을 지원하지 않는 구현체는 하위 호환성을 위해 폐기 기능을 구현할 수 있지만, 새 콘텐츠를 작성하는 작성자는 다른 방법이 없을 때를 제외하고 폐기 기능을 사용하지 않아야 합니다. 이 명세를 참조하는 다른 명세는 폐기 기능 대신 대체 기능을 참조해야 합니다. 이 명세에서 폐기된 기능은 향후 명세에서 삭제될 예정입니다.

빈 문자열

빈 문자열은 길이가 0DOMString 타입 값으로, 아무 문자(출력/제어 문자 포함)도 포함하지 않은 문자열입니다.

이벤트 포커스

이벤트 포커스는 이벤트 타겟이 되는 특정 요소나 객체에 집중하고 수용하는 특별한 상태입니다. 각 요소는 기능(버튼이나 하이퍼링크의 활성화 준비, 체크박스의 상태 토글, 텍스트 입력, 선택 텍스트 복사 등)에 따라 포커스 시 동작이 다릅니다. 자세한 내용은 § 3.3.3 문서 포커스 및 포커스 컨텍스트를 참조하세요.

이벤트 포커스 링

이벤트 포커스 링은 이벤트 포커스 타겟의 정렬된 집합입니다. 호스트 언어는 타겟의 순서를 결정하는 여러 방법(문서 순서, 타겟별 인덱스, 타겟 간 명시적 포인터, 혼합 모델 등)을 정의할 수 있습니다. 각 문서는 여러 포커스 링 또는 조건부 포커스 링을 가질 수 있습니다. 문서순서/인덱스 기반 포커스 링에서는 일반적으로 마지막 타겟 다음에 첫 타겟으로 순환됩니다.

이벤트 타겟

이벤트가 이벤트 흐름을 통해 대상으로 하는 객체입니다. 이벤트 타겟은 이벤트 객체의 target 속성값입니다.

이벤트 타입

이벤트 타입은 특정 이름을 가진 이벤트 객체로, 트리거 조건, 속성, 기타 특성을 정의하여 다른 이벤트 타입과 구별됩니다. 예를 들어, click 이벤트 타입은 mouseover 또는 load 이벤트 타입과 특성이 다릅니다. 이벤트 타입은 이벤트 객체의 type 속성으로 노출됩니다. 또한 "이벤트"(예: click 이벤트)로도 광범위하게 불립니다.

호스트 언어

다른 언어나 API 명세의 기능을 통합하고, 원본 명세를 규범적으로 참조하며, 원본 명세에서 정의한 방식으로만 확장하는 언어. 원본 명세는 일반적으로 하나 이상의 호스트 언어 맥락에서만 구현되도록 의도되며, 독립 언어로서는 구현되지 않습니다. 예를 들어, XHTML, HTML, SVG는 UI Events의 호스트 언어이며, 이 명세에서 정의한 객체와 모델을 통합/확장합니다.

히스테리시스

사용자 경험을 개선하기 위해 입력값의 위치나 시간 범위 내 값을 허용하는 휴먼 인터페이스 디자인의 특징. 예: 마우스 버튼 더블클릭 시간에 약간의 오차를 허용(시간적 히스테리시스), 부모 윈도우에서 자식 메뉴로 이동할 때 잠깐 벗어나는 경우에도 메뉴를 바로 닫지 않는 경우(위치적 히스테리시스).

IME
입력기

입력기(IME, front end processor)는 키 입력과 한자 등 문자 변환을 수행하는 애플리케이션으로, 주로 동아시아 언어(중국어, 일본어, 한국어 등)에서 사용자 안내 사전 조회를 통해 사용됩니다. IME는 모바일 기기 등에서 사전 기반 자동완성에도 사용될 수 있습니다. 이 명세에서 입력기 처리에 대해서는 § 4.3.3 입력기를 참고하세요. 텍스트 조합 시스템도 참고.

키 매핑

키 매핑은 특정 키에 키 값을 할당하는 과정으로, 운영체제, 키보드 레이아웃(예: QWERTY, 드보락, 스페인어, 인스크립트, 한중일 등), 수정키(Shift, Alt 등), 죽은 키 상태 등이 종합적으로 결정합니다.

키 값

키 값은 문자 값 또는 복수 문자 문자열(예: "Enter", "Tab", "MediaTrackNext" 등)에 해당하며, 특정 상태의 키에 연관되어 있습니다. 모든 키는 문자 값이 있든 없든 키 값을 가집니다. 여기에는 제어키, 펑션키, 수정키, 죽은 키, 기타 모든 키가 포함됩니다. 임의의 키의 키 값은 해당 시점의 키 매핑에 따릅니다.

수정키

수정키는 키의 일반 동작을 변경하는 키로, 대소문자 변경(Shift), 기능키 동작변경(Fn, Alt 등)을 포함합니다. 수정키에 대한 자세한 정보는 § 4.3.1 수정키Modifier Keys 표([UIEvents-Key] 참조)를 참고하세요.

네임스페이스 URI

네임스페이스 URI는 XML 네임스페이스를 식별하는 URI입니다. 이는 [XML-Names11]에서 네임스페이스 이름이라 불립니다. DOM API에서 URI 및 네임스페이스 URI 처리/비교에 대해서는 DOM URIs, XML Namespaces의 1.3.2, 1.3.3절을 참고하세요.

QWERTY

QWERTY(발음 ˈkwɜrti)는 널리 쓰이는 키보드 레이아웃으로, 문자 키 상단 첫 5글자가 Q, W, E, R, T, Y입니다. 드보락, 콜맥 등 다양한 레이아웃이 있으며, 대부분은 지역화나 인체공학을 고려해 설계되었습니다.

루트 요소

문서의 첫 번째 요소 노드로, 모든 다른 요소의 부모입니다. 즉, 문서 요소입니다.

회전

WheelEvent 인터페이스를 사용하는 입력 장치의 점진적 변화. 일부 장치에서는 실제 휠 회전일 수 있고, 다른 장치에서는 평면 이동이나 특정 버튼에 대한 압력일 수 있습니다.

텍스트 조합 시스템

대체 입력(예: 입력기, 음성 처리, 필기 인식 등)을 해석하여 텍스트로 변환하는 소프트웨어 컴포넌트.

최상위 이벤트 타겟

최상위 이벤트 타겟은 렌더링 순서상 가장 위에 있으며 이벤트 타겟이 될 수 있는 요소여야 합니다. GUI에서는 사용자의 포인팅 장치 아래에 있는 요소입니다. UI의 히트테스트 기능으로 타겟을 결정합니다. 히트테스트와 스택 순서의 상세는 호스트 언어를 참고하세요.

유니코드 문자 범주

각 유니코드 코드포인트에 정의된 General Category 값의 부분집합. 이 부분집합에는 Letter(Ll, Lm, Lo, Lt, Lu), Number(Nd, Nl, No), Punctuation(Pc, Pd, Pe, Pf, Pi, Po, Ps) 그리고 Symbol(Sc, Sk, Sm, So) 범주 값이 포함됩니다.

초기화되지 않은 값

이벤트가 initEvent()로 초기화되기 전의 모든 이벤트 속성(예: bubbles, currentTarget 등)의 값. 이벤트가 createEvent()로 새로 생성된 직후의 값입니다.

적합성

문서 관례

적합성 요구사항은 설명적 단언과 RFC 2119 용어를 조합하여 표현합니다. 규범 부분에서 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” 등 주요 단어는 RFC 2119에서 정의된 대로 해석해야 합니다. 다만, 가독성을 위해 이 명세에서는 모든 단어를 대문자로 표기하지 않습니다.

이 명세의 모든 텍스트는 규범적입니다. 단, 명시적으로 참고용으로 표시된 절, 예시, 그리고 주석은 제외됩니다. [RFC2119]

이 명세의 예시는 “예를 들어(for example)”라는 문구로 시작하거나, 또는 class="example"로 규범 텍스트와 구분되어 아래와 같이 표시됩니다:

이것은 참고용 예시입니다.

참고용 주석은 “Note”로 시작하며, class="note"로 규범 텍스트와 구분되어 아래와 같이 표시됩니다:

Note, 이것은 참고용 주석입니다.

적합성 있는 알고리즘

알고리즘 내의 명령형 요구사항(예: "선행 공백 문자를 모두 제거한다" 또는 "false를 반환하고 이 단계를 중단한다")는, 알고리즘을 소개하는 곳에서 사용된 주요 단어("must", "should", "may" 등)의 의미에 따라 해석해야 합니다.

알고리즘이나 특정 단계로 표현된 적합성 요구사항은, 최종 결과가 동등하기만 하면 어떤 방식으로든 구현할 수 있습니다. 특히 이 명세에서 정의된 알고리즘은 이해하기 쉽게 하기 위한 것으로, 성능을 고려한 것이 아닙니다. 구현자는 최적화를 권장합니다.

색인

이 명세에서 정의된 용어

참조로 정의된 용어

참고문헌

규범 참고문헌

[CSS-COLOR-3]
Tantek Çelik; Chris Lilley; David Baron. CSS Color Module Level 3. 2022년 1월 18일. REC. URL: https://www.w3.org/TR/css-color-3/
[CSS2]
Bert Bos; 외. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011년 6월 7일. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM-View]
Simon Pieters. CSSOM View Module. 2016년 3월 17일. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM Standard. 현행 표준. URL: https://dom.spec.whatwg.org/
[DOM-Level-3-Core]
Arnaud Le Hors; 외. Document Object Model (DOM) Level 3 Core Specification. 2021년 9월 28일. REC. URL: https://www.w3.org/TR/DOM-Level-3-Core/
[HTML]
Anne van Kesteren; 외. HTML Standard. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 현행 표준. URL: https://infra.spec.whatwg.org/
[PointerEvents3]
Patrick Lauke; Robert Flack. Pointer Events. 2024년 8월 14일. WD. URL: https://www.w3.org/TR/pointerevents3/
[POINTERLOCK-2]
Mustaq Ahmed; Vincent Scheib. Pointer Lock 2.0. 2024년 6월 17일. WD. URL: https://www.w3.org/TR/pointerlock-2/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[UIEvents-Code]
Travis Leithead; Gary Kacmarcik. UI Events KeyboardEvent code Values. 2023년 5월 30일. CR. URL: https://www.w3.org/TR/uievents-code/
[UIEvents-Key]
Travis Leithead; Gary Kacmarcik. UI Events KeyboardEvent key Values. 2023년 5월 30일. CR. URL: https://www.w3.org/TR/uievents-key/
[WebIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. 현행 표준. URL: https://webidl.spec.whatwg.org/

참고 참고문헌

[DWW95]
N. Kano. Developing International Software for Windows 95 and Windows NT: A Handbook for International Software Design. 1995.
[Editing]
A. Gregor. HTML Editing APIs. URL: https://dvcs.w3.org/hg/editing/raw-file/tip/editing.html
[HTML401]
Dave Raggett; Arnaud Le Hors; Ian Jacobs. HTML 4.01 Specification. 2018년 3월 27일. REC. URL: https://www.w3.org/TR/html401/
[HTML5]
Ian Hickson; 외. HTML5. 2018년 3월 27일. REC. URL: https://www.w3.org/TR/html5/
[Input-Events]
Johannes Wilm. Input Events Level 1. 2023년 9월 28일. WD. URL: https://www.w3.org/TR/input-events-1/
[PointerLock]
Vincent Scheib. Pointer Lock. 2016년 10월 27일. REC. URL: https://www.w3.org/TR/pointerlock/
[RFC20]
V.G. Cerf. ASCII format for network interchange. 1969년 10월. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc20
[UAAG20]
James Allan; 외. User Agent Accessibility Guidelines (UAAG) 2.0. 2015년 12월 15일. NOTE. URL: https://www.w3.org/TR/UAAG20/
[UAX15]
Ken Whistler. Unicode Normalization Forms. 2023년 8월 12일. Unicode Standard Annex #15. URL: https://www.unicode.org/reports/tr15/tr15-54.html
[Unicode]
The Unicode Standard. URL: https://www.unicode.org/versions/latest/
[US-ASCII]
Coded Character Set - 7-Bit American Standard Code for Information Interchange. 1986.
[WIN1252]
Windows 1252 a Coded Character Set - 8-Bit. URL: https://www.microsoft.com/globaldev/reference/sbcs/1252.htm
[XFORMS11]
John Boyer. XForms 1.1. 2009년 10월 20일. REC. URL: https://www.w3.org/TR/xforms11/
[XML]
Tim Bray; 외. Extensible Markup Language (XML) 1.0 (Fifth Edition). 2008년 11월 26일. REC. URL: https://www.w3.org/TR/xml/
[XML-Names11]
Tim Bray; 외. Namespaces in XML 1.1 (Second Edition). 2006년 8월 16일. REC. URL: https://www.w3.org/TR/xml-names11/

IDL 색인

[Exposed=Window]
interface UIEvent : Event {
  constructor(DOMString type, optional UIEventInit eventInitDict = {});
  readonly attribute Window? view;
  readonly attribute long detail;
};

dictionary UIEventInit : EventInit {
  Window? view = null;
  long detail = 0;
};

[Exposed=Window]
interface FocusEvent : UIEvent {
  constructor(DOMString type, optional FocusEventInit eventInitDict = {});
  readonly attribute EventTarget? relatedTarget;
};

dictionary FocusEventInit : UIEventInit {
  EventTarget? relatedTarget = null;
};

[Exposed=Window]
interface MouseEvent : UIEvent {
  constructor(DOMString type, optional MouseEventInit eventInitDict = {});
  readonly attribute long screenX;
  readonly attribute long screenY;
  readonly attribute long clientX;
  readonly attribute long clientY;
  readonly attribute long layerX;
  readonly attribute long layerY;

  readonly attribute boolean ctrlKey;
  readonly attribute boolean shiftKey;
  readonly attribute boolean altKey;
  readonly attribute boolean metaKey;

  readonly attribute short button;
  readonly attribute unsigned short buttons;

  readonly attribute EventTarget? relatedTarget;

  boolean getModifierState(DOMString keyArg);
};

dictionary MouseEventInit : EventModifierInit {
  long screenX = 0;
  long screenY = 0;
  long clientX = 0;
  long clientY = 0;

  short button = 0;
  unsigned short buttons = 0;
  EventTarget? relatedTarget = null;
};

dictionary EventModifierInit : UIEventInit {
  boolean ctrlKey = false;
  boolean shiftKey = false;
  boolean altKey = false;
  boolean metaKey = false;

  boolean modifierAltGraph = false;
  boolean modifierCapsLock = false;
  boolean modifierFn = false;
  boolean modifierFnLock = false;
  boolean modifierHyper = false;
  boolean modifierNumLock = false;
  boolean modifierScrollLock = false;
  boolean modifierSuper = false;
  boolean modifierSymbol = false;
  boolean modifierSymbolLock = false;
};

[Exposed=Window]
interface WheelEvent : MouseEvent {
  constructor(DOMString type, optional WheelEventInit eventInitDict = {});
  // DeltaModeCode
  const unsigned long DOM_DELTA_PIXEL = 0x00;
  const unsigned long DOM_DELTA_LINE  = 0x01;
  const unsigned long DOM_DELTA_PAGE  = 0x02;

  readonly attribute double deltaX;
  readonly attribute double deltaY;
  readonly attribute double deltaZ;
  readonly attribute unsigned long deltaMode;
};

dictionary WheelEventInit : MouseEventInit {
  double deltaX = 0.0;
  double deltaY = 0.0;
  double deltaZ = 0.0;
  unsigned long deltaMode = 0;
};

[Exposed=Window]
interface InputEvent : UIEvent {
  constructor(DOMString type, optional InputEventInit eventInitDict = {});
  readonly attribute USVString? data;
  readonly attribute boolean isComposing;
  readonly attribute DOMString inputType;
};

dictionary InputEventInit : UIEventInit {
  DOMString? data = null;
  boolean isComposing = false;
  DOMString inputType = "";
};

[Exposed=Window]
interface KeyboardEvent : UIEvent {
  constructor(DOMString type, optional KeyboardEventInit eventInitDict = {});
  // KeyLocationCode
  const unsigned long DOM_KEY_LOCATION_STANDARD = 0x00;
  const unsigned long DOM_KEY_LOCATION_LEFT = 0x01;
  const unsigned long DOM_KEY_LOCATION_RIGHT = 0x02;
  const unsigned long DOM_KEY_LOCATION_NUMPAD = 0x03;

  readonly attribute DOMString key;
  readonly attribute DOMString code;
  readonly attribute unsigned long location;

  readonly attribute boolean ctrlKey;
  readonly attribute boolean shiftKey;
  readonly attribute boolean altKey;
  readonly attribute boolean metaKey;

  readonly attribute boolean repeat;
  readonly attribute boolean isComposing;

  boolean getModifierState(DOMString keyArg);
};

dictionary KeyboardEventInit : EventModifierInit {
  DOMString key = "";
  DOMString code = "";
  unsigned long location = 0;
  boolean repeat = false;
  boolean isComposing = false;
};

[Exposed=Window]
interface CompositionEvent : UIEvent {
  constructor(DOMString type, optional CompositionEventInit eventInitDict = {});
  readonly attribute USVString data;
};

dictionary CompositionEventInit : UIEventInit {
  DOMString data = "";
};

partial interface UIEvent {
  // Deprecated in this specification
  undefined initUIEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional Window? viewArg = null,
    optional long detailArg = 0);
};

partial interface MouseEvent {
  // Deprecated in this specification
  undefined initMouseEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional Window? viewArg = null,
    optional long detailArg = 0,
    optional long screenXArg = 0,
    optional long screenYArg = 0,
    optional long clientXArg = 0,
    optional long clientYArg = 0,
    optional boolean ctrlKeyArg = false,
    optional boolean altKeyArg = false,
    optional boolean shiftKeyArg = false,
    optional boolean metaKeyArg = false,
    optional short buttonArg = 0,
    optional EventTarget? relatedTargetArg = null);
};

partial interface KeyboardEvent {
  // Originally introduced (and deprecated) in this specification
  undefined initKeyboardEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional Window? viewArg = null,
    optional DOMString keyArg = "",
    optional unsigned long locationArg = 0,
    optional boolean ctrlKey = false,
    optional boolean altKey = false,
    optional boolean shiftKey = false,
    optional boolean metaKey = false);
};

partial interface CompositionEvent {
  // Originally introduced (and deprecated) in this specification
  undefined initCompositionEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional WindowProxy? viewArg = null,
    optional DOMString dataArg = "");
};

partial interface UIEvent {
  // The following support legacy user agents
  readonly attribute unsigned long which;
};

partial dictionary UIEventInit {
  unsigned long which = 0;
};

partial interface KeyboardEvent {
  // The following support legacy user agents
  readonly attribute unsigned long charCode;
  readonly attribute unsigned long keyCode;
};

partial dictionary KeyboardEventInit {
  // The following support legacy user agents
  unsigned long charCode = 0;
  unsigned long keyCode = 0;
};

[Exposed=Window]
interface TextEvent : UIEvent {
    readonly attribute DOMString data;
    undefined initTextEvent(DOMString type,
        optional boolean bubbles = false,
        optional boolean cancelable = false,
        optional Window? view = null,
        optional DOMString data = "undefined");
};

이슈 색인

UI Events 알고리즘의 텍스트 이벤트 섹션에서 TextEvent 인터페이스와 textInput 이벤트를 참고하세요.
MDN

CompositionEvent/CompositionEvent

In all current engines.

Firefox53+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CompositionEvent/data

In all current engines.

Firefox9+Safari5+Chrome15+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

CompositionEvent

In all current engines.

Firefox9+Safari5+Chrome15+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/auxclick_event

Firefox53+SafariNoneChrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android53+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/blur_event

In all current engines.

Firefox24+Safari3.1+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+

Window/blur_event

In all current engines.

Firefox6+Safari5.1+Chrome5+
Opera12.1+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/click_event

In all current engines.

Firefox6+Safari3+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android6+iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/compositionend_event

In all current engines.

Firefox9+Safari5+Chrome15+
Opera15+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile14+
MDN

Element/compositionstart_event

In all current engines.

Firefox9+Safari5+Chrome15+
Opera15+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile14+
MDN

Element/compositionupdate_event

In all current engines.

Firefox9+Safari5+Chrome18+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

Element/contextmenu_event

In all current engines.

Firefox6+Safari3+Chrome1+
Opera10.5+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView?Samsung Internet?Opera Mobile11.1+
MDN

Element/dblclick_event

In all current engines.

Firefox6+Safari3+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE8+
Firefox for Android6+iOS Safari1+Chrome for AndroidNoneAndroid WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/focus_event

In all current engines.

Firefox24+Safari3.1+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+

Window/focus_event

In all current engines.

Firefox6+Safari5.1+Chrome5+
Opera12.1+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/focusin_event

In all current engines.

Firefox52+Safari5+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/focusout_event

In all current engines.

Firefox52+Safari5+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/keydown_event

In all current engines.

Firefox6+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/keyup_event

In all current engines.

Firefox6+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/mousedown_event

In all current engines.

Firefox6+Safari4+Chrome2+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/mouseenter_event

In all current engines.

Firefox10+Safari7+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

Element/mouseleave_event

In all current engines.

Firefox10+Safari7+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

Element/mousemove_event

In all current engines.

Firefox6+Safari4+Chrome2+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/mouseout_event

In all current engines.

Firefox6+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/mouseover_event

In all current engines.

Firefox6+Safari4+Chrome2+
Opera9.5+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

Element/mouseup_event

In all current engines.

Firefox6+Safari4+Chrome2+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/wheel_event

In all current engines.

Firefox17+Safari7+Chrome31+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FocusEvent/FocusEvent

In all current engines.

Firefox24+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FocusEvent/relatedTarget

In all current engines.

Firefox24+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FocusEvent

In all current engines.

Firefox24+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

HTMLElement/beforeinput_event

In all current engines.

Firefox87+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

HTMLElement/error_event

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

HTMLElement/input_event

In all current engines.

Firefox6+Safari3.1+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12+
MDN

InputEvent/InputEvent

Firefox31+SafariNoneChrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

InputEvent/inputType

In all current engines.

Firefox66+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

InputEvent/isComposing

In all current engines.

Firefox31+Safari16.4+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

InputEvent

In all current engines.

Firefox31+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/KeyboardEvent

In all current engines.

Firefox31+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/altKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent/code

In all current engines.

Firefox38+Safari10.1+Chrome48+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/ctrlKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent/getModifierState

In all current engines.

Firefox15+Safari10.1+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/isComposing

In all current engines.

Firefox31+Safari10.1+Chrome56+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/key

In all current engines.

Firefox23+Safari10.1+Chrome51+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/location

In all current engines.

Firefox15+Safari8+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/metaKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent/repeat

In all current engines.

Firefox28+Safari10.1+Chrome32+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/shiftKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/MouseEvent

In all current engines.

Firefox11+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MouseEvent/altKey

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/button

In all current engines.

Firefox1+Safari1+Chrome1+
Opera10.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile11+
MDN

MouseEvent/buttons

In all current engines.

Firefox15+Safari11.1+Chrome43+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android15+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MouseEvent/clientX

In all current engines.

Firefox1+Safari1+Chrome1+
Opera10.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile11+
MDN

MouseEvent/clientY

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/ctrlKey

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/getModifierState

In all current engines.

Firefox15+Safari12.1+Chrome47+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MouseEvent/metaKey

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/relatedTarget

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/screenX

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/screenY

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent/shiftKey

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

MouseEvent

In all current engines.

Firefox1+Safari1+Chrome1+
Opera10.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile11+
MDN

UIEvent/UIEvent

In all current engines.

Firefox11+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView1+Samsung Internet1.0+Opera Mobile?
MDN

UIEvent/detail

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

UIEvent/view

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

UIEvent

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

WheelEvent/WheelEvent

In all current engines.

Firefox17+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet1.0+Opera Mobile?
MDN

WheelEvent/deltaMode

In all current engines.

Firefox17+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet1.0+Opera Mobile?
MDN

WheelEvent/deltaX

In all current engines.

Firefox17+Safari8+Chrome31+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

WheelEvent/deltaY

In all current engines.

Firefox17+Safari8+Chrome31+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

WheelEvent/deltaZ

In all current engines.

Firefox17+Safari8+Chrome31+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

WheelEvent

In all current engines.

Firefox17+Safari3+Chrome1+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

Window/load_event

In all current engines.

Firefox1+Safari1.3+Chrome1+
Opera4+Edge79+
Edge (Legacy)12+IE4+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+