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 agent는 DOMString
데이터 타입을 [WebIDL]에서 정의한 대로 지원해야 하지만,
UI Events에 적합하기 위해 [WebIDL]에서 정의된 모든 메서드나 데이터 타입을 지원할 필요는 없습니다).
이 명세서는 다양한 user agent, 명세, 콘텐츠 작성자를 위한 여러 적합성 클래스를 정의합니다:
1.2.1. 웹 브라우저 및 기타 동적 또는 상호작용 user agent
동적 또는 상호작용 user agent는 여기서 브라우저
로 언급되며 (웹 브라우저, AT(접근성 기술) 애플리케이션, 기타 유사한
프로그램 포함), 다음을 지원하는 경우 UI Events에 적합합니다:
-
[DOM-Level-3-Core]에 정의된 Core 모듈
-
이 명세서에서 정의된 모든 인터페이스와 이벤트의 관련 메서드, 속성, 의미(단, deprecated로 표시된 항목은 제외, 적합한 user agent는 하위 호환성을 위해 deprecated 인터페이스, 이벤트, API를 구현할 수 있으나, 적합성을 위해 반드시 구현해야 하는 것은 아님)
-
플랫폼의 가용성에 따라 [UIEvents-Key] 및 [UIEvents-Code]에서 정의된
key
및code
값 전체, 그리고 -
이 명세서에 정의된 그 밖의 모든 규범적 요구 사항.
적합한 브라우저는 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 명세 관례를 따르며, 다음과 같은 추가 사항이 있습니다:
-
키에 인쇄된 키 캡은
↓
,=
또는Q
로 표시됩니다. 이는 사용자의 관점에서key
및code
값과 관계없이 키를 참조할 때 사용됩니다. 이벤트가 생성된KeyboardEvent
값과 상관없습니다. -
문자를 나타내는 글리프는 다음과 같이 표시됩니다:
"𣧂"
. -
유니코드 문자 인코딩은 다음과 같이 표시됩니다:
U+003d
. -
키 입력에 의해 생성된 키 값의 이름(즉,
KeyboardEvent
.key
값)은 다음과 같이 표시됩니다:"ArrowDown"
,"="
,"q"
또는"Q"
. -
물리적 키에 해당하는 키 코드의 이름(즉,
KeyboardEvent
.code
값)은 다음과 같이 표시됩니다:"ArrowDown"
,"Equal"
또는"KeyQ"
.
또한, 이 명세서에서 특정 용어는 특별한 의미로 사용됩니다. 구현(implementation)
은 브라우저, 콘텐츠 저작 도구 또는 이 명세서를 구현하는 기타 user
agent를 의미하며,
콘텐츠 작성자(content author)는 이 명세서에서 설명된 인터페이스, 메서드, 속성, 이벤트 및 기타 기능을 활용하여 웹 애플리케이션을 작성하는 사람입니다. 사용자는 해당 웹
애플리케이션을 구현(implementation)에서 사용하는 사람을 의미합니다.
마지막으로:
이것은 참고 사항입니다.
이것은 열린 이슈입니다.
이것은 경고입니다.
interface Example { // This is an IDL definition. };
3. 기본 이벤트 인터페이스
[DOM]에서 정의된 기본 이벤트 인터페이스는 UI Events의 근간이 됩니다. 이러한 기본 이벤트 인터페이스는 구현에서 반드시 항상 지원되어야 합니다:
-
Event
인터페이스와 다음 상수, 메서드 및 속성:-
NONE
상수 -
AT_TARGET
상수 -
type
속성 -
target
속성 -
eventPhase
속성 -
bubbles
속성 -
cancelable
속성 -
composed
속성 -
timeStamp
속성 -
isTrusted
속성 -
preventDefault()
메서드 -
initEvent()
메서드
-
-
CustomEvent
인터페이스와 다음 메서드 및 속성:-
detail
속성
-
EventTarget
인터페이스와 다음 메서드들:-
dispatchEvent()
메서드
-
EventListener
인터페이스와handleEvent()
메서드 -
Document
인터페이스의createEvent()
메서드
이 명세서에서 정의된 이벤트 타입들은 이러한 기본 인터페이스에서 파생되며, 반드시 해당 인터페이스에서 파생된 모든 속성, 메서드, 상수를 상속받아야 합니다.
다음 도표는 이 명세서에서 설명된 인터페이스의 상속 구조를 나타냅니다.
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
| 예 | 상황에 따라 다름: beforeinput 및 input 이벤트 트리거; 텍스트 조합 시스템 실행; blur 및 focus 이벤트; 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 = 0; };
detail
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
- 출력
-
없음
-
기본
Event
속성을 초기화합니다: -
다음 공개 속성을 초기화합니다:
-
다음 과거 속성을 초기화합니다:
-
event.
which
= 0 (MouseEvent
와KeyboardEvent
모두에서 사용됨)
-
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
이벤트가
폼
input
및
textarea
요소에서만 디스패치될 수 있습니다.
구현체는 폼 컨트롤 외부의 텍스트 선택, 이미지 또는 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
을 식별할 때 사용되며, 이벤트 타입에 따라 달라집니다.중첩된 브라우징 컨텍스트에서 탭 이동 시 보안상의 이유로, 관련
EventTarget
은null
이어야 합니다.이 속성의 초기화되지 않은 값은
null
이어야 합니다.
3.3.1.2. FocusEventInit
dictionary :
FocusEventInit UIEventInit {EventTarget ?=
relatedTarget null ; };
FocusEventInit . relatedTarget
-
relatedTarget
은 포커스가 사라지는 요소(focus
나focusin
이벤트의 경우) 또는 포커스가 생기는 요소(blur
나focusout
이벤트의 경우)로 초기화되어야 합니다.
3.3.2. 포커스 이벤트 순서
이 명세에서 정의된 포커스 이벤트는 서로 일정한 순서로 발생합니다. 포커스가 요소 간에 이동할 때(초기에는 포커스된 요소가 없는 것으로 가정), 일반적인 이벤트 순서는 다음과 같습니다:
이벤트 타입 | 설명 | |
---|---|---|
사용자가 포커스를 이동 | ||
1 | focus
| 첫 번째 타겟 요소가 포커스를 받을 때 전송됨 |
2 | focusin
| focus 이벤트 이후 발생 |
사용자가 포커스를 이동 | ||
3 | blur
| 첫 번째 타겟 요소가 포커스를 잃을 때 전송됨 |
4 | focusout
| blur 이벤트 이후 발생 |
5 | focus
| 두 번째 타겟 요소가 포커스를 받을 때 전송됨 |
6 | focusin
| focus 이벤트 이후 발생 |
이 명세서는 focus()
혹은 blur()
와 같은 메서드로 상호작용할 때의 포커스 이벤트
동작을 정의하지 않습니다. 해당 메서드가 정의된 관련 명세를 참조하세요.
3.3.3. 문서 포커스와 포커스 컨텍스트
이 이벤트 모듈에는 문서 포커스 변경 알림을 위한 이벤트 타입이 포함되어 있습니다. 이와 관련하여 세 가지 구분되는 포커스 컨텍스트가 있습니다:
-
운영체제 포커스 컨텍스트: 현재 컴퓨터에서 실행 중인 여러 애플리케이션 중 하나에 포커스가 있을 수 있습니다. 이 중 포커스된 애플리케이션이 브라우저일 수 있습니다.
-
브라우저가 포커스를 가진 경우, 사용자는 탭 키 등으로 애플리케이션 포커스 컨텍스트를 브라우저의 다양한 UI 필드(예: 웹사이트 주소 입력창, 검색창 등)로 전환할 수 있습니다. 이 중 하나가 탭에서 보여지고 있는 문서일 수 있습니다.
-
문서 자체가 포커스를 가진 경우, 문서 포커스 컨텍스트는 문서 내부의 포커스 가능한 아무 요소로 설정될 수 있습니다.
이 명세에서 정의된 이벤트 타입은 오직 문서 포커스만 다루며, 이벤트 세부 정보에서 식별된 event target은 반드시 문서나 해당 창의 문서 내의 일부여야 하며, 브라우저나 운영체제의 일부가 되어서는 안 됩니다. 포커스 컨텍스트 간 전환 시에도 마찬가지입니다.
일반적으로 문서에는 항상 포커스된 요소(문서 요소 자체일 수도 있음)와 지속적인 포커스 링이 존재합니다. 포커스 컨텍스트를 전환해도 문서의 현재 포커스된 요소와 포커스 링은 보통 유지됩니다. 예를 들어, 문서에 포커스 가능한 요소가 3개 있고 두 번째 요소에 포커스가 있을 때, 사용자가 운영체제 포커스를 다른 애플리케이션으로 옮겼다가 다시 브라우저로 돌아오면, 두 번째 요소가 여전히 문서 내에서 포커스를 유지하며, 탭 키로 세 번째 요소로 포커스를 이동할 수 있습니다. 호스트 언어는 포커스를 받을 수 있는 요소, 포커스를 받을 수 있는 조건, 포커스를 변경하는 방법, 포커스 변경 순서 등을 구체적으로 정의할 수 있습니다. 예를 들어, 어떤 경우에는 포인터를 이동하여 포커스를 줄 수 있고, 다른 경우에는 마우스 클릭이 필요할 수 있습니다. 일부 요소는 포커스를 받을 수 없으며, 일부는 특정 방법(요소 클릭)으로만 포커스를 받을 수 있고, 탭 키로는 불가능할 수도 있습니다. 문서는 여러 개의 포커스 링을 가질 수 있습니다. 다른 명세에서는 이 명세보다 더 복잡한 포커스 모델(예: 여러 요소가 동시에 현재 포커스를 가질 수 있음)을 정의할 수 있습니다.
3.3.4. 포커스 이벤트 타입
포커스 이벤트 타입은 아래에 나열되어 있습니다.
3.3.4.1. blur
타입 | blur
|
---|---|
인터페이스 | FocusEvent
|
동기 / 비동기 | 동기 |
버블링 | 아니오 |
신뢰할 수 있는 타겟 | Window , Element
|
취소 가능 | 아니오 |
Composed | 예 |
기본 동작 | 없음 |
컨텍스트 (신뢰된 이벤트) |
user agent는 event target이 포커스를 잃을 때 반드시 이 이벤트를 디스패치해야 합니다. 이 이벤트 타입이 디스패치되기 전에 해당 요소에서 포커스를 제거해야 합니다. 이 이벤트 타입은 focusout과 유사하지만 버블링되지 않습니다.
3.3.4.2. focus
타입 | focus
|
---|---|
인터페이스 | FocusEvent
|
동기 / 비동기 | 동기 |
버블링 | 아니오 |
신뢰할 수 있는 타겟 | Window , Element
|
취소 가능 | 아니오 |
Composed | 예 |
기본 동작 | 없음 |
컨텍스트 (신뢰된 이벤트) |
|
user agent는 event target이 포커스를 받을 때 반드시 이 이벤트를 디스패치해야 합니다. 이 이벤트 타입이 디스패치되기 전에 해당 요소에 포커스를 부여해야 합니다. 이 이벤트 타입은 focusin과 유사하지만 버블링되지 않습니다.
3.3.4.3. focusin
타입 | focusin
|
---|---|
인터페이스 | FocusEvent
|
동기 / 비동기 | 동기 |
버블링 | 예 |
신뢰할 수 있는 타겟 | Window , Element
|
취소 가능 | 아니오 |
Composed | 예 |
기본 동작 | 없음 |
컨텍스트 (신뢰된 이벤트) |
|
user agent는 event target이 포커스를 받을 때 반드시 이 이벤트를 디스패치해야 합니다. event target은 포커스를 받은 요소여야 합니다. focus 이벤트가 이 이벤트 타입보다 먼저 발생해야 합니다. 이 이벤트 타입은 focus와 유사하지만 버블링됩니다.
3.3.4.4. focusout
타입 | focusout
|
---|---|
인터페이스 | FocusEvent
|
동기 / 비동기 | 동기 |
버블링 | 예 |
신뢰할 수 있는 타겟 | Window , Element
|
취소 가능 | 아니오 |
Composed | 예 |
기본 동작 | 없음 |
컨텍스트 (신뢰된 이벤트) |
user agent는 event 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
로 초기화할 때,
구현체는 clientX
와 clientY
를 사용하여 다른 좌표(예: 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-
KeyboardEvent
의ctrlKey
속성을 참고하세요.이 속성의 초기화되지 않은 값은
false
이어야 합니다. shiftKey
, 타입 boolean, readonly-
KeyboardEvent
의shiftKey
속성을 참고하세요.이 속성의 초기화되지 않은 값은
false
이어야 합니다. altKey
, 타입 boolean, readonly-
KeyboardEvent
의altKey
속성을 참고하세요.이 속성의 초기화되지 않은 값은
false
이어야 합니다. metaKey
, 타입 boolean, readonly-
KeyboardEvent
의metaKey
속성을 참고하세요.이 속성의 초기화되지 않은 값은
false
이어야 합니다. button
, 타입 short, readonly-
마우스 버튼의 눌림이나 해제에 의해 발생하는 마우스 이벤트 동안
button
은 어떤 포인터 장치의 버튼이 상태가 변경되었는지 나타내는 데 사용되어야 합니다.button
속성의 값은 다음과 같아야 합니다:-
0
: 장치의 기본 버튼(일반적으로 왼쪽 버튼 또는 단일 버튼 장치의 유일한 버튼, UI 컨트롤 활성화 또는 텍스트 선택에 사용) 또는 초기화되지 않은 값 -
1
: 보조 버튼(일반적으로 가운데 버튼, 종종 마우스 휠과 함께) -
2
: 보조 버튼(일반적으로 오른쪽 버튼, 컨텍스트 메뉴 표시에 사용) -
3
: X1(뒤로) 버튼 -
4
: X2(앞으로) 버튼
일부 포인팅 장치는 더 많은 버튼 상태를 제공하거나 시뮬레이션하며,
2
보다 큰 값 또는0
보다 작은 값이 해당 버튼을 나타내는 데 사용될 수 있습니다.button
값은 마우스 버튼의 눌림/해제에 의해 발생하지 않은 이벤트에서는 갱신되지 않습니다. 이런 경우0
값을 왼쪽 버튼으로 해석하지 말고 초기화되지 않은 값으로 해석해야 합니다.mousedown
및mouseup
과 같은 이벤트의 기본 동작은 사용 중인 특정 마우스 버튼에 따라 달라집니다.이 속성의 초기화되지 않은 값은
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
는 왼쪽과 가운데 버튼이 동시에 눌려 있음을 나타냅니다.mousedown
및mouseup
과 같은 이벤트의 기본 동작은 사용 중인 특정 마우스 버튼에 따라 달라집니다.이 속성의 초기화되지 않은 값은
0
이어야 합니다. -
relatedTarget
, 타입 EventTarget, readonly, nullable-
UI 이벤트와 관련된 두 번째
EventTarget
을 식별할 때 사용됩니다. 이벤트 타입에 따라 달라집니다.이 속성의 초기화되지 않은 값은
null
이어야 합니다. getModifierState(keyArg)
-
이 명세에서 도입됨
키 값으로 modifier의 상태를 질의합니다.
modifier 키이고 modifier가 활성화된 경우
true
를, 그렇지 않으면false
를 반환합니다.- DOMString keyArg
-
KeyboardEvent
의getModifierState()
메서드의 해당 파라미터 설명을 참고하세요.
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. 이벤트 수정자 초기화자
MouseEvent
와 KeyboardEvent
인터페이스는 키보드 수정자 속성 집합을 공유하며, 추가 수정자 상태를 가져오는 메커니즘을 지원합니다. 다음 딕셔너리는 MouseEvent
및 KeyboardEvent
인터페이스의 키보드 수정자 속성을 초기화하고, 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에서 이벤트를 생성하는 알고리즘을 보완합니다:
-
생성되는
Event
가MouseEvent
객체 또는 그 파생 객체이고, 생성자에EventModifierInit
인자가 제공된 경우, 다음 하위 단계를 실행합니다:-
각
EventModifierInit
인자에 대해, 딕셔너리 멤버가"modifier"
로 시작한다면 키 수정자 이름을 해당 멤버 이름에서"modifier"
접두사를 제외한 이름으로 하고,Event
객체의 내부 키 수정자 상태 중 키 수정자 이름과 일치하는 값을 해당 값으로 설정합니다.
-
3.4.3. MouseEvent 알고리즘
3.4.3.1. 네이티브 OS 요구사항
이 섹션의 알고리즘은 네이티브 플랫폼 OS가 다음을 제공한다고 가정합니다:
-
마우스가 움직일 때의 이벤트(네이티브 마우스 이동 처리로 처리)
-
마우스 버튼이 눌릴 때의 이벤트(네이티브 마우스 다운 처리로 처리)
-
마우스 버튼이 해제될 때의 이벤트(네이티브 마우스 업 처리로 처리)
-
마우스 버튼 누름이 "클릭"으로 해석되어야 할 때를 식별하는 방법(네이티브 마우스 클릭 처리로 처리)
-
예를 들어, 플래그나 별도의 이벤트로
-
별도의 "클릭" 이벤트가 발생하는 경우, 네이티브 OS는 해당 "마우스 업" 이벤트 바로 뒤에, 그 사이에 다른 마우스 관련 이벤트 없이 "클릭" 이벤트를 발생시켜야 함
-
-
마우스 클릭이 "더블 클릭"인지 식별할 방법(네이티브 마우스 더블 클릭 처리로 처리)
이러한 이벤트에 대해 OS는 다음 정보를 제공할 수 있습니다:
-
네이티브 OS 데스크톱 기준 x, y 마우스 좌표
-
UA의 윈도우 뷰포트 기준 x, y 마우스 좌표
-
현재 누르고 있는 키보드 수정자
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
- 출력
-
없음
-
UIEvent 초기화를 event, eventType, eventTarget, bubbles, cancelable로 수행
-
다음 공개 속성을 초기화합니다:
-
event.
screenX
= 이벤트가 발생한 위치의 x좌표(데스크톱 원점 기준) -
event.
screenY
= 이벤트가 발생한 위치의 y좌표(데스크톱 원점 기준) -
마우스 이벤트 수정자 설정을 event로 수행
-
event.
button
= 0 -
event.
buttons
= 마우스 버튼 비트마스크
-
-
MouseEvent에 대한 PointerLock 속성 초기화를 event로 수행
3.4.3.5. 마우스 이벤트 수정자 설정
- 입력
-
event, 업데이트할
MouseEvent
- 출력
-
없음
-
키 수정자 상태에 "Shift"가 포함되어 있으면 event의 shift flag를 설정하고, 그렇지 않으면 해제한다.
-
키 수정자 상태에 "Control"이 포함되어 있으면 event의 control flag를 설정하고, 그렇지 않으면 해제한다.
-
키 수정자 상태에 "Alt"가 포함되어 있으면 event의 alt flag를 설정하고, 그렇지 않으면 해제한다.
-
키 수정자 상태에 "AltGraph"가 포함되어 있으면 event의 altgraph flag를 설정하고, 그렇지 않으면 해제한다.
-
키 수정자 상태에 "Meta"가 포함되어 있으면 event의 meta flag를 설정하고, 그렇지 않으면 해제한다.
-
event의 shift flag가 설정되어 있으면 event.
shiftKey
= true, 아니면 false로 설정한다. -
event의 control flag가 설정되어 있으면 event.
ctrlKey
= true, 아니면 false로 설정한다. -
event의 alt flag 또는 altgraph flag가 설정되어 있으면 event.
altKey
= true, 아니면 false로 설정한다. -
event의 meta flag가 설정되어 있으면 event.
metaKey
= true, 아니면 false로 설정한다.
3.4.3.6. 취소 가능한 MouseEvent 생성
- 입력
-
eventType, 유효한
MouseEvent
타입을 포함하는 DOMStringeventTarget, 이벤트의
EventTarget
- 출력
-
없음
-
bubbles를 "true"로 한다.
-
cancelable를 "true"로 한다.
-
event = 새 이벤트 생성의 결과로
MouseEvent
를 사용한다. -
MouseEvent를 초기화한다. 인자로 event, eventType, eventTarget, bubbles, cancelable를 전달한다.
-
event를 반환한다.
3.4.3.7. 취소 불가능한 MouseEvent 생성
- 입력
-
eventType, 유효한
MouseEvent
타입을 포함하는 DOMStringeventTarget, 이벤트의
EventTarget
- 출력
-
없음
-
bubbles를 "false"로 한다.
-
cancelable를 "false"로 한다.
-
event = 새 이벤트 생성의 결과로
MouseEvent
를 사용한다. -
MouseEvent를 초기화한다. 인자로 event, eventType, eventTarget, bubbles, cancelable를 전달한다.
-
event를 반환한다.
3.4.3.8. MouseEvent 버튼 속성 계산
- 입력
-
mbutton, 마우스 버튼을 식별하는 ID
- 출력
-
MouseEvent
의button
속성에 저장하기 적합한 버튼 ID
-
mbutton이 기본 마우스 버튼이면 0을 반환한다.
-
mbutton이 보조(가운데) 마우스 버튼이면 1을 반환한다.
-
mbutton이 보조 마우스 버튼이면 2를 반환한다.
-
mbutton이 X1(뒤로가기) 버튼이면 3을 반환한다.
-
mbutton이 X2(앞으로가기) 버튼이면 4를 반환한다.
3.4.3.9. 네이티브로부터 MouseEvent 속성 설정
- 입력
-
event, 초기화할
MouseEvent
native, 네이티브 마우스 이벤트
- 출력
-
없음
TODO
-
event.
type
이 [ mousedown, mouseup ] 중 하나라면,-
mbutton을 native에서 어떤 마우스 버튼이 눌렸는지 식별하는 ID로 한다.
-
event.
button
= MouseEvent 버튼 속성 계산 결과를 mbutton으로 한다.
-
3.4.3.10. 네이티브 마우스 다운 처리
- 입력
-
native, 네이티브 mousedown
- 출력
-
없음
-
mbutton을 native에서 어떤 마우스 버튼이 눌렸는지 식별하는 ID로 한다.
-
마우스 버튼 비트마스크를 다음과 같이 업데이트한다:
-
mbutton이 기본 마우스 버튼이면 0x01 비트를 설정한다.
-
mbutton이 보조 마우스 버튼이면 0x02 비트를 설정한다.
-
mbutton이 보조(가운데) 마우스 버튼이면 0x04 비트를 설정한다.
다른 버튼은 0x08부터 추가할 수 있다.
-
-
target = hit test를 native의 뷰포트 상대 좌표로 실행한 결과로 한다.
-
event = 취소 가능한 MouseEvent 생성에서 "mousedown", target을 인자로 한다.
-
네이티브로부터 MouseEvent 속성 설정을 native로 실행한다.
-
포인터다운 이벤트 전송 여부 결정를 event로 실행한다.
-
result = dispatch event at target
-
result가 true이고 target이 포커스 가능한 영역이며 클릭으로 포커스 가능하다면,
-
포커스 단계를 target에서 실행한다.
-
-
mbutton이 보조 마우스 버튼이면,
-
컨텍스트 메뉴 표시 여부 결정를 native, target으로 실행한다.
-
3.4.3.11. 네이티브 마우스 업 처리
- 입력
-
native, 네이티브 mouseup
- 출력
-
없음
마우스 다운과 업 사이에 다른 마우스 이벤트가 발생할 수 있다.
-
mbutton을 native에서 어떤 마우스 버튼이 눌렸는지 식별하는 ID로 한다.
-
마우스 버튼 비트마스크를 다음과 같이 업데이트한다:
-
mbutton이 기본 마우스 버튼이면 0x01 비트를 클리어한다.
-
mbutton이 보조 마우스 버튼이면 0x02 비트를 클리어한다.
-
mbutton이 보조(가운데) 마우스 버튼이면 0x04 비트를 클리어한다.
-
-
target = hit test를 native의 뷰포트 상대 좌표로 실행한 결과로 한다.
-
event = 취소 가능한 MouseEvent 생성에서 "mouseup", target을 인자로 한다.
-
네이티브로부터 MouseEvent 속성 설정을 native로 실행한다.
-
포인터업 이벤트 전송 여부 결정를 event로 실행한다.
-
dispatch event at target
3.4.3.12. 네이티브 마우스 클릭 처리
- 입력
-
native, 네이티브 마우스 클릭
- 출력
-
없음
플랫폼은 네이티브 마우스 업 처리 직후, 클릭을 생성하는 mouseup에 대해 이 알고리즘을 즉시 호출해야 한다.
3.4.3.13. 클릭 이벤트 전송
- 입력
-
native, 네이티브 mousedown
target, 이벤트의
EventTarget
- 출력
-
없음
-
mbutton = 1 (기본 마우스 버튼이 기본값)
-
native가 유효하면,
-
mbutton을 native에서 어떤 마우스 버튼이 눌렸는지 식별하는 ID로 한다.
-
-
eventType = mbutton이 기본 마우스 버튼이면 "click", 아니면 "auxclick"로 설정한다.
-
event = PointerEvent 생성에서 eventType과 target을 인자로 한다.
-
native가 유효하면,
-
네이티브로부터 MouseEvent 속성 설정을 event, native로 실행한다.
-
event.
screenX
가 정수값이 아니면 반올림한다. -
event.
screenY
가 정수값이 아니면 반올림한다.
-
-
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, 네이티브 마우스 더블 클릭
- 출력
-
없음
더블 클릭을 생성하는 마우스 클릭에 대해 네이티브 마우스 클릭 처리 직후 호출해야 한다.
-
mbutton을 native에서 어떤 마우스 버튼이 눌렸는지 식별하는 ID로 한다.
-
mbutton이 기본 마우스 버튼이 아니면 return한다.
-
target = hit test를 native의 뷰포트 상대 좌표로 실행한 결과로 한다.
-
event = PointerEvent 생성에서 "dblclick"과 target을 인자로 한다.
-
네이티브로부터 MouseEvent 속성 설정을 event, native로 실행한다.
-
event.
screenX
가 정수값이 아니면 반올림한다. -
event.
screenY
가 정수값이 아니면 반올림한다. -
dispatch event at target
3.4.3.15. 네이티브 마우스 이동 처리
- 입력
-
native, 네이티브 마우스 이동
- 출력
-
없음
이 알고리즘은 PointerEvent의 dispatch에 대해 명시적으로 정의되지 않았기 때문에 가정을 한다. pointerevents/285가 해결되면 업데이트가 필요할 수 있다.
-
target = hit test를 native의 뷰포트 상대 좌표로 실행한 결과로 한다.
-
targetDomPath = DOM 경로 계산을 실행한다.
-
현재 요소를 떠나는 이벤트를 생성한다:
-
last mouse element가 정의되어 있고 target과 다르다면,
-
mouseout = 취소 가능한 MouseEvent 생성을 "mouseout"과 last mouse element로 실행한다.
TODO: mouseout의 속성을 native에서 설정. +CSSOM 속성
-
포인터 out 이벤트 전송 여부 결정을 mouseout으로 실행한다.
-
Dispatch mouseout을 target에 실행한다.
취소될 때의 동작을 확인 필요(영향 없는 것으로 보임).
-
leaveElements를 last mouse DOM path의 복사본에서 targetDomPath와 공통된 모든 요소를 제거한 값으로 한다.
-
leaveElements의 각 element에 대해:
element가 삭제된 경우, 이동한 경우 처리 필요. DOM 변이가 mouseleave 이벤트를 트리거해야 할지, 지금 보내야 할지, 버려야 할지 등 현재 브라우저 동작을 확인 필요.
-
mouseleave = 취소 불가능한 MouseEvent 생성을 "mouseleave"와 element로 실행한다.
-
mouseleave.
composed
= false로 설정한다.event.composed 값 호환성 확인. 명세는 false. Chrome/Linux = true. Firefox/Linux = false.
-
포인터 leave 이벤트 전송 여부 결정을 mouseleave로 실행한다.
-
result = dispatch mouseleave을 element에 실행한다.
-
-
-
-
새 요소로 진입하는 이벤트를 생성한다:
-
target이 last mouse element가 아니면,
-
mouseover = 취소 가능한 MouseEvent 생성을 "mouseover"와 target으로 실행한다.
TODO: mouseout의 속성을 native에서 설정. +CSSOM 속성
-
포인터 over 이벤트 전송 여부 결정를 mouseover로 실행한다.
-
Dispatch mouseout을 target에 실행한다.
취소될 때의 동작을 확인 필요(영향 없는 것으로 보임).
-
enterElements를 targetDomPath의 복사본에서 last mouse DOM path와 공통된 모든 요소를 제거한 값으로 한다.
-
enterElements의 각 element에 대해:
element가 삭제되거나 이동된 경우 처리 필요.
-
mouseenter = 취소 불가능한 MouseEvent 생성을 "mouseenter"와 element로 실행한다.
-
mouseenter.
composed
= false로 설정한다.event.composed 값 호환성 확인. 명세는 false. Chrome/Linux = true. Firefox/Linux = false.
-
포인터 enter 이벤트 전송 여부 결정를 mouseenter로 실행한다.
shadow DOM 요소 호환성 확인. Chrome/Linux는 이 이벤트를 요소와 shadow root에 모두 발생시킴.
-
result = dispatch mouseenter을 element에 실행한다.
-
-
last mouse element를 target으로 설정한다.
-
last mouse DOM path를 targetDomPath로 설정한다.
-
-
-
mousemove = 취소 가능한 MouseEvent 생성을 "mousemove"와 element로 실행한다.
-
포인터 move 이벤트 전송 여부 결정를 mousemove로 실행한다.
-
Dispatch mousemove을 element에 실행한다.
3.4.3.16. 컨텍스트 메뉴 표시 여부 결정
- 입력
-
native, 네이티브 mousedown 또는 포인터 이벤트
target, 이벤트의
EventTarget
- 출력
-
없음
-
menuevent = PointerEvent 생성을 "contextmenu"와 target으로 실행한다.
-
native가 유효하면,
-
네이티브로부터 MouseEvent 속성 설정을 native로 실행한다.
-
-
result = dispatch menuevent을 target에 실행한다.
-
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의 자식이다:
포인팅 장치가 요소 스택 외부에서 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
|
mousedown
과 mouseup
사이에 허용되는 mousemove
이벤트의 지연 시간, 정도, 거리, 횟수는 구현, 장치, 플랫폼별로 다르다. 이 허용치는
불안정한 손 등 신체적 장애를 가진 사용자가 포인팅 장치로 상호작용할 때 도움을 줄 수 있다.
각 구현체는 적절한 히스테리시스 허용치를 결정하며, 일반적으로 mousedown
및 mouseup
이벤트의 대상이 같은 요소이고 그
사이에 mouseout
또는 mouseleave
이벤트가 없으면 click
및 dblclick
이벤트를 발생시켜야 하며, mousedown
과 mouseup
이벤트 대상이 다르면 가장 가까운 공통 포함 조상에서 click
및 dblclick
이벤트를 발생시켜야 한다.
만약 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
이벤트는 같은 요소에서 mousedown
및 mouseup
이벤트가 발생한 뒤에 이어질 수
있으며, 노드 종류(예: 텍스트 노드) 변화는 무시합니다. 환경 설정에 따라 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
이벤트는 같은 요소에서 mousedown
및 mouseup
이벤트가 발생한 뒤에 이어질 수
있으며, 노드 종류(예: 텍스트 노드) 변화는 무시합니다. 환경 설정에 따라 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 = {}); // DeltaModeCode
eventInitDict 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
|
취소 가능 | 상황에 따라 다름 |
합성 여부 | 예 |
기본 동작 | 문서 스크롤(또는 줌) |
컨텍스트 (신뢰할 수 있는 이벤트) |
|
사용자
에이전트는 마우스 휠이 어떤 축으로든 회전되었을 때, 또는 동등한 입력장치(마우스볼, 특정 태블릿 또는 터치패드 등)가 그러한 동작을 에뮬레이션한 경우 반드시 이 이벤트를
발생시켜야 합니다. 플랫폼 및 입력 장치에 따라, 대각선 휠 delta는
하나의 wheel
이벤트에 여러 축에 대해 모두
비영(0이 아닌) 값을 제공하거나, 각 축마다 별도의 wheel
이벤트로 전달될 수 있습니다.
일반적으로 wheel
이벤트 유형의 기본 동작은
문서를 지정된 양만큼 스크롤(또는 경우에 따라 줌)하는 것입니다. 이 이벤트가 취소되면 구현체는 문서를 스크롤하거나 줌하지 말아야 하며(또는 이 이벤트 유형에 연관된 기타 구현별 기본
동작 수행 금지),
일부 사용자 에이전트나 입력장치에서는 휠이 빨리 회전될수록 delta 값이 커질 수 있습니다.
3.5.2.2. 휠 이벤트의 취소 가능성
휠 이벤트에서 preventDefault
를 호출하면 스크롤을 방지하거나 중단시킬 수 있습니다. 최대 스크롤 성능을 위해, 사용자 에이전트는 스크롤과 연관된 각 휠
이벤트가 취소될지 확인하기 위해 처리될 때까지 기다리지 않을 수 있습니다. 이런 경우 사용자 에이전트는 cancelable
속성이
false
인 wheel
이벤트를 생성해야 하며, 이는 preventDefault
로 스크롤을 방지하거나 중단할 수
없음을 의미합니다. 그렇지 않은 경우 cancelable
은 true
입니다.
특히, 사용자 에이전트는 비수동(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 = {}); // KeyLocationCode
eventInitDict 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
- 키 활성화가 해당 키의 여러 위치 중 왼쪽 위치에서 발생함을 나타냅니다.
DOM_KEY_LOCATION_RIGHT
- 키 활성화가 해당 키의 여러 위치 중 오른쪽 위치에서 발생함을 나타냅니다.
DOM_KEY_LOCATION_NUMPAD
-
키 활성화가 숫자 키패드 또는 숫자 키패드에 대응하는 가상 키에서 발생함을 나타냅니다(해당 키에 여러 위치가 있을 때).
NumLock
키는 항상location
값으로DOM_KEY_LOCATION_STANDARD
을 사용해야 합니다. 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
속성을 다음의 위치 상수 중 하나로 초기화합니다:-
DOM_KEY_LOCATION_STANDARD
(숫자 값 0) -
DOM_KEY_LOCATION_LEFT
(숫자 값 1) -
DOM_KEY_LOCATION_RIGHT
(숫자 값 2) -
DOM_KEY_LOCATION_NUMPAD
(숫자 값 3)
-
repeat
, 타입 boolean, 기본값false
- KeyboardEvent 객체의
repeat
속성을 초기화합니다. 이 속성은 현재 KeyboardEvent가 하나의 키가 길게 눌려 반복적으로 발생한 이벤트 시퀀스의 일부일 때true
로, 아니면false
로 설정해야 합니다. isComposing
, 타입 boolean, 기본값false
- KeyboardEvent 객체의
isComposing
속성을 초기화합니다. 이 속성은 생성되는 이벤트가 조합 입력 시퀀스의 일부일 때true
, 그렇지 않으면false
로 설정해야 합니다.
keyCode
, charCode
, which
라는 세 가지 추가 속성이 있습니다.
keyCode
는 컴퓨터 키보드의 특정 키와 연관된 숫자 값을 나타내며, charCode
는 해당 키와 연관된 ASCII 문자 값(이는 keyCode
값과 같을 수도 있음)을 나타내며, 문자 값을 생성하는 키에만 적용됩니다.
실제로 keyCode
와 charCode
는 플랫폼마다, 심지어 동일 구현체에서 OS나 로케일에 따라 일관되지 않습니다. 본 명세는
keyCode
와 charCode
의 값이나 charCode
의 동작을 정의하지 않습니다. 현행 표준 UI
Events 구현에서 콘텐츠 작성자는 대신 key
와 code
를
사용할 수 있습니다.
자세한 내용은 레거시 키 속성의 참고 부록을 참조하세요.
기존 콘텐츠와의 호환성을 위해, 소프트웨어 키보드와 같은 가상 키보드는 실제 키가 없더라도 일반적인 키보드 이벤트를 생성해야 합니다.
일부 구현이나 시스템 설정에서는 사용 중인 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
이벤트의 기본 동작은 키에 따라
다릅니다:
-
키가 문자와 연관된 경우, 반드시
beforeinput
이벤트 후input
이벤트를 디스패치해야 합니다. 매크로나 죽은 키 시퀀스 등 여러 문자를 생성하는 키의 경우, 각 문자마다beforeinput
/input
이벤트 세트를 디스패치해야 합니다. -
키가 텍스트 조합 시스템과 연관된 경우, 반드시 해당 시스템을 실행해야 합니다.
-
키가
Tab
키일 경우, 현재 포커스된 요소(있다면)에서 새롭게 포커스된 요소로 문서 포커스를 이동해야 하며, 자세한 내용은 포커스 이벤트 유형에서 설명합니다. -
키가
Enter
또는click
이벤트와,DOMActivate
이벤트(지원되는 경우)를 디스패치해야 합니다.
이 이벤트가 취소되면, 연관된 이벤트 유형은 디스패치되지 말아야 하며, 연관된 동작도 수행되어서는 안 됩니다.
keydown
와 keyup
이벤트는 전통적으로 문자 값을 생성하는 키뿐 아니라 모든 키 감지에 사용됩니다.
3.7.5.2. keyup
유형 | keyup
|
---|---|
인터페이스 | KeyboardEvent
|
동기 / 비동기 | 동기 |
버블링 | 예 |
신뢰할 수 있는 대상 | Element
|
취소 가능 | 예 |
합성 여부 | 예 |
기본 동작 | 없음 |
컨텍스트 (신뢰할 수 있는 이벤트) |
|
사용자
에이전트는 키가 해제될 때 반드시 이 이벤트를 발생시켜야 합니다.
keyup
이벤트 유형은 장치 의존적이며 입력 장치의
기능과 운영체제에서의 매핑 방식에 따라 달라집니다. 이 이벤트 유형은 키 매핑 이후에 반드시 생성되어야 하며, 동일 키에 대한 keydown
, beforeinput
, input
이벤트 이후에 디스패치되어야 합니다.
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. 조합 중 키 이벤트
조합 세션 중에는 keydown
과 keyup
이벤트가 반드시 전송되어야 하며, 이
이벤트의 isComposing
속성은 true
로 설정되어야 합니다.
이벤트 유형 | KeyboardEvent isComposing
| 비고 | |
---|---|---|---|
1 | keydown
| false | 조합을 시작하는 키 이벤트입니다. |
2 | compositionstart
| ||
3 | compositionupdate
| ||
4 | keyup
| true | |
... | 조합 세션 중 전송되는 모든 키 이벤트는 isComposing 이 true 여야 함.
| ||
5 | keydown
| true | 조합을 끝내는 키 이벤트입니다. |
6 | compositionend
| ||
7 | keyup
| false |
3.8.6. 조합 중 입력 이벤트
조합 세션 중에는 compositionupdate
가 반드시 beforeinput
이 전송된 후, input
이벤트가 전송되기 전에 디스패치되어야
합니다.
이벤트 유형 | 비고 | |
---|---|---|
1 | beforeinput
| |
2 | compositionupdate
| |
이 시점에 DOM 업데이트가 발생함. | ||
3 | input
|
대부분의 IME는 조합 세션 중에는 업데이트 취소를 지원하지 않습니다.
beforeinput
와 input
이벤트는 조합 과정에서 DOM이
업데이트될 때마다 compositionupdate
이벤트와 함께 전송됩니다. compositionend
이벤트에는 DOM 업데이트가 없으므로, 그 시점에는 beforeinput
과 input
이벤트를 전송하지 않아야 합니다.
이벤트 유형 | 비고 | |
---|---|---|
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. 키보드 이벤트와 키 값
이 절에는 키보드 이벤트에 관한 필수 정보가 포함되어 있습니다:
-
키보드 레이아웃, 매핑 및 키 값에 대한 설명
-
키 간의 관계(예: 죽은 키 또는 수정키)
-
키보드 이벤트와 그 기본 동작 간의 관계
-
key
값 집합 및 이 집합 확장에 대한 가이드라인
이 절에서는 세르비아 문자와 한자를 사용하므로, 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.
key
와 code
의
관계
key
key
속성은 현재 키보드 레이아웃(및 IME, 죽은 키에는 고유key
값이 있음)을 고려한, 눌린 키의 의미에 관심 있는 사용자를 위한 속성입니다. 예시: 수정키가 눌린 상태/단일 수정키 감지(예: 단축키 동작).code
code
속성은 레이아웃 변경 없이 사용자가 실제로 누른 키에 관심 있는 사용자를 위한 속성입니다. 예시: 게임에서 WASD 키 감지, 원격 데스크톱에서 모든 키 전송 등.
4.2.3. code
예시
키보드 레이아웃 | 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"
)
만을 일치시킬 수 있습니다.
프랑스어 키보드 예시에서 Alt
와 AltGraph
키는 각각 하나만 있어도
왼쪽/오른쪽 위치 정보를 유지합니다.
키보드 레이아웃 | 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
속성에 항상 들어갑니다.
Shift
와
2
아래 두 키 이벤트 시퀀스의 속성 값을 비교하세요. 둘 다 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
와 같은 마크업 속성의 값으로, 또는 관련 용도로도 사용할
수 있습니다. 규범적 호스트 언어는 키 값의 두
동등한 문자열 값(즉 문자 값 또는 키 값) 중 어느 것을 사용해도 허용해야 합니다.
구현체는 플랫폼이나 키보드 레이아웃 맵핑과 무관하게 가장 관련성 높은 값을 키에 대해 사용하지만, 콘텐츠 작성자는 모든 키보드 장치가 그 값을
생성할 수 있다고 가정해서는 안 됩니다. 단축키 조합에 키보드 이벤트와 키 값을 사용할 경우, 대부분의 키보드 레이아웃에서 해당 키가 존재하므로 숫자 및 기능키(
을 고려할 수 있습니다 ([DWW95]).
F4
, F5
등)를 문자 대신 사용하는 것
키 값은 물리적 키 자체나 키에 인쇄된 문자와 직접적으로 일치하지 않습니다. 키 값은 모든 활성 키와 키 입력 모드(Shift 등)의 현재 상태, 그리고 운영체제의 키보드 매핑에 따라
이벤트의 현재 값을 나타냅니다. 즉, QWERTY 키보드에서 O
라벨이 붙은 키는 쉬프트가 안 눌린 상태에서는 "o"
, 쉬프트가 눌린 상태에서는 "O"
키 값을 가집니다. 사용자는 키보드를 임의로 커스텀 매핑할 수 있으므로, 콘텐츠 작성자는 키의 쉬프트/언쉬프트 상태와 문자의 대/소문자
사이의 관계를 가정하지 말고 key
속성의 값을 사용하는 것이 바람직합니다.
예를 들어 [UIEvents-Code]의 Standard "102" 키보드 레이아웃은 한 가지 키 매핑 사례를 보여줍니다. 표준 및 특이한 매핑은
매우 다양합니다.
죽은 키 지원을
단순화하기 위해, 운영체제가 죽은 키 상태를 처리할 때, 죽은 키
시퀀스의 현재 상태는 key
속성으로 보고되지 않습니다.
대신 "Dead"
키 값이
보고됩니다.
구현체는 조합 이벤트를 생성하여, 죽은 키 시퀀스의 중간 상태를 data
속성으로 보고합니다. 앞의 예시와 같이, QWERTY 키보드에서
O
키에 대해 죽은 키 조작으로 움라우트(¨)를 추가할 때 언쉬프트 상태에서는 "ö"
,
쉬프트 상태에서는 "Ö"
가 data
값이 됩니다.
또한, 키 이벤트 상태와 키 값은 일대일 관계가 아니라는 점도 중요합니다. 특정 키 값은 여러 키와 연관될 수 있습니다. 예를 들어, 대부분의 표준 키보드에는 Shift
키 값이 두 개 이상 있으며(보통 location
값 DOM_KEY_LOCATION_LEFT
및 DOM_KEY_LOCATION_RIGHT
로
구분), 8
키 값도 두 개 이상이며(보통 location
값 DOM_KEY_LOCATION_STANDARD
및 DOM_KEY_LOCATION_NUMPAD
로
구분), 사용자가 커스텀 키보드 레이아웃을 구성할 경우 여러 키 상태에 동일한 키 값이 중복될 수 있습니다(location
은 표준 키보드 레이아웃을 위한 것이며, 항상 의미 있는 구분이 가능한 것은 아님).
마지막으로, 문자 표현의 의미는 맥락에 따라 복잡합니다. 예를 들어 별표("*"
) 기호는 일부 맥락에서는 각주나 강조(텍스트를 괄호로 감쌀
때 등)를 나타내지만, 문서나 프로그램에 따라서는 곱셈 연산을 의미할 수도 있습니다. 또 다른 문서/프로그램에서는 곱셈 기호("×"
,
유니코드 U+00D7
)나 라틴 소문자 "x"
가 사용되기도 합니다(많은 키보드에 곱셈 키가 없고, "×"
와 "x"
가 시각적으로 비슷하기 때문). 문자 표현의 의미/기능은 이 명세서의 범위를
벗어납니다.
4.3.1. 수정키
키보드 입력은 수정키를 사용하여 키의 일반 동작을 변경합니다. 다른 키들과 마찬가지로, 수정키도 아래 예시처럼 keydown
및 keyup
이벤트를 발생시킵니다. 일부 수정키(Alt
,
Control
, Shift
, AltGraph
, Meta
)는 키가 눌려 있거나 유지되는 동안 활성화됩니다. 다른
수정키(CapsLock
, NumLock
, ScrollLock
)는 상태에 따라 활성화되며, 수정키가 눌릴 때 상태가 변경됩니다. KeyboardEvent
인터페이스는 일반적인 수정키에 대해 편리한 속성을 제공합니다: ctrlKey
,
shiftKey
,
altKey
,
metaKey
.
일부 운영체제에서는 AltGraph
수정키를 Alt
와 Control
수정키 조합으로 에뮬레이션하기도 합니다. 구현체에서는 AltGraph
수정키를 사용하는 것이 권장됩니다.
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"
|
Shift
와 Control
을 동시에 누를 때의 이벤트 시퀀스를 보여줍니다:
이벤트 유형 | 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"
|
이벤트 유형 | KeyboardEvent key
| 수정키 | 비고 | |
---|---|---|---|---|
1 | keydown
| "Control"
| ctrlKey
| |
2 | keydown
| "ر"
| ctrlKey
| 아랍 문자 Reh |
beforeinput 또는 input
이벤트는 생성되지 않음.
| ||||
3 | keyup
| "ر"
| ctrlKey
| 아랍 문자 Reh |
4 | keyup
| "Control"
|
keydown
및 keyup
이벤트의 값은 키를 눌렀을 때의 현재 키보드 레이아웃에 따라 달라집니다. 즉, 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 시스템과 장치마다 기능과 해당 기능을
활성화하는 키가 다르므로, Convert
및 Accept
키가 다른 키로 대체될 수
있습니다. 키보드 이벤트는 키보드 레이아웃 매핑 이후 입력장치에서 발생하는 이벤트와 대응합니다.
일부 구현이나 시스템 설정에서는 사용 중인 IME에 의해 일부 키 이벤트나 값이 억제될 수 있습니다.
다음 예시는 일본어 입력기를 사용하여 유니코드 문자 "市"
(한자, CJK 통합 한자)를 생성하는 키 시퀀스를 설명합니다. 이 예시는 입력기가
활성화되어 일본어 로마자 입력 모드임을 가정합니다. Convert
와 Accept
키는
입력장치와 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를 호출하고 유효하지 않은 요소를 제외해야 합니다.
-
pos에 대해 [CSSOM-View]의 elementFromPoint를 반환
5.1.2. DOM 경로 계산
- 입력
-
element, 시작 요소
- 출력
-
해당 요소의 조상 요소 목록
-
path = element를 담은 리스트로 설정
path에 조상을 추가하는 정확한 정의가 필요합니다.
-
path를 반환
5.2. 포인터락 알고리즘
아래 알고리즘은 [PointerLock] 명세로 이동해야 합니다.
5.2.1. 포인터락의 전역 상태
5.2.1.1. Window 수준 상태
UA는 Window 전체에서 공유되는 다음 값을 유지해야 합니다.
마지막 마우스 이동 값(초기값은 정의되지 않음)은 마지막 mousemove 이벤트의 위치를 기록합니다.
5.2.2. MouseEvent의 PointerLock 속성 초기화
- 입력
-
event,
MouseEvent
- 출력
-
없음
5.2.3. mousemove의 PointerLock 속성 설정
- 입력
-
event,
MouseEvent
- 출력
-
없음
-
event.
type
이 "mousemove"가 아니면 종료 -
마지막 마우스 이동이 정의되지 않았다면,
-
그렇지 않으면,
-
event.
movementX
= event.screenX
- 마지막 마우스 이동의 x좌표 -
event.
movementY
= event.screenX
- 마지막 마우스 이동의 y좌표
-
-
마지막 마우스 이동 = ( event.
screenX
, event.screenY
)
5.3. 포인터 이벤트 알고리즘
아래 알고리즘은 [PointerEvents3] 명세로 이동해야 합니다.
5.3.1. PointerEvent 초기화
- 입력
-
event, 초기화할
PointerEvent
eventType, 이벤트 타입을 담은 DOMString
eventTarget, 이벤트의
EventTarget
- 출력
-
없음
-
MouseEvent 초기화를 event, eventType, eventTarget으로 수행
TODO - pointerevent 속성 초기화 필요
5.3.2. PointerEvent 생성
- 입력
-
eventType, 이벤트 타입을 담은 DOMString
eventTarget, 이벤트의
EventTarget
- 출력
-
없음
-
event = 새 이벤트 생성 결과,
PointerEvent
사용 -
PointerEvent 초기화를 event, eventType, eventTarget으로 수행
-
event를 반환
5.3.3. MouseEvent로부터 PointerEvent 생성
- 입력
-
eventType, 이벤트 타입을 담은 DOMString
mouseevent, 해당하는
MouseEvent
- 출력
-
없음
-
event = 새 이벤트 생성 결과,
PointerEvent
사용 -
target = mouseevent.
target
-
PointerEvent 초기화를 event, eventType, target으로 수행
-
MouseEvent 속성을 mouseevent에서 event로 복사
-
event를 반환
5.3.4. pointerout 이벤트 전송 가능성 판단
- 입력
-
mouseout, 해당하는 mouseout
MouseEvent
- 출력
-
없음
-
pointerout = MouseEvent로부터 PointerEvent 생성 ("pointerout", mouseout)
-
pointerevent 속성 설정
TODO
-
target = mouseout.
target
-
pointerout를 target에서 디스패치
5.3.5. pointerleave 이벤트 전송 가능성 판단
- 입력
-
mouseout, 해당하는 mouseout
MouseEvent
- 출력
-
없음
-
pointerout = MouseEvent로부터 PointerEvent 생성 ("pointerout", mouseout)
-
pointerevent 속성 설정
TODO
-
target = mouseout.
target
-
pointerout를 target에서 디스패치
5.3.6. pointerover 이벤트 전송 가능성 판단
- 입력
-
mouseout, 해당하는 mouseout
MouseEvent
- 출력
-
없음
-
pointerout = MouseEvent로부터 PointerEvent 생성 ("pointerout", mouseout)
-
pointerevent 속성 설정
TODO
-
target = mouseout.
target
-
pointerout를 target에서 디스패치
5.3.7. pointerenter 이벤트 전송 가능성 판단
- 입력
-
mouseout, 해당하는 mouseout
MouseEvent
- 출력
-
없음
-
pointerout = MouseEvent로부터 PointerEvent 생성 ("pointerout", mouseout)
-
pointerevent 속성 설정
TODO
-
target = mouseout.
target
-
pointerout를 target에서 디스패치
5.3.8. pointermove 이벤트 전송 가능성 판단
- 입력
-
mouseout, 해당하는 mouseout
MouseEvent
- 출력
-
없음
pointermove와 pointerrawupdate를 보내려면? 아니면 두 메서드가 필요한가?
pointermove 이벤트를 제대로 결합(coalesce)하려면 무엇이 필요한가?
-
pointerout = MouseEvent로부터 PointerEvent 생성 ("pointerout", mouseout)
-
pointerevent 속성 설정
TODO
-
target = mouseout.
target
-
pointerout를 target에서 디스패치
5.3.9. pointerdown 이벤트 전송 가능성 판단
- 입력
-
mouseout, 해당하는 mouseout
MouseEvent
- 출력
-
없음
mousedown 이벤트와 달리, pointerdown 이벤트는 여러 버튼을 동시에 누를 때 중첩되지 않습니다. MouseEvent는 필드 복사를 위해 전달됩니다.
-
pointerout = MouseEvent로부터 PointerEvent 생성 ("pointerout", mouseout)
-
pointerevent 속성 설정
TODO
-
target = mouseout.
target
-
pointerout를 target에서 디스패치
5.3.10. pointerup 이벤트 전송 가능성 판단
- 입력
-
mouseout, 해당하는 mouseout
MouseEvent
- 출력
-
없음
mouseup 이벤트와 달리, pointerup 이벤트는 여러 버튼을 동시에 누를 때 중첩되지 않습니다. MouseEvent는 필드 복사를 위해 전달됩니다.
-
pointerout = MouseEvent로부터 PointerEvent 생성 ("pointerout", mouseout)
-
pointerevent 속성 설정
TODO
-
target = mouseout.
target
-
pointerout를 target에서 디스패치
6. 레거시 이벤트 이니셜라이저
이 절은 규범적입니다. 다음 기능들은 더 이상 사용되지 않으며, 레거시 소프트웨어와의 호환성이 필요한 사용자 에이전트에서만 구현되어야 합니다.
이 명세의 초기 버전에는 인터페이스에 이니셜라이즈 메서드(예: initMouseEvent
)가 포함되어 있었는데, 이 메서드는 많은 수의 매개변수를 필요로 했으나
대부분의 경우 이벤트 객체의 모든 속성을 완전히 초기화하지 못했습니다. 이 때문에, 기본 Event
인터페이스에서 파생된 이벤트 인터페이스들은 이벤트를 완전히 초기화하기 위해 파생된 각 인터페이스의 이니셜라이저를 명시적으로 호출해야만 했습니다.
이 표준의 개발 기간이 길어진 영향으로, 일부 구현체는 이런(현재는 폐기된) 이니셜라이저 메서드에 의존성을 가질 수 있습니다. 완전성을 위해, 이러한 레거시 이벤트 이니셜라이저를 이 부록에서 설명합니다.
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 = 0); };
detailArg
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 = 0,
detailArg optional long = 0,
screenXArg optional long = 0,
screenYArg optional long = 0,
clientXArg optional long = 0,
clientYArg optional boolean =
ctrlKeyArg false ,optional boolean =
altKeyArg false ,optional boolean =
shiftKeyArg false ,optional boolean =
metaKeyArg false ,optional short = 0,
buttonArg 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 = 0,
locationArg 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
속성을 charCode
및 keyCode
속성 대신 사용해야 합니다.
하지만, 이 기능들의 현재 상태와 규범적 이벤트 및 속성과의 관계를 문서화하기 위해 이 절에서 설명을 제공합니다. 이러한 속성과 이벤트를 지원하는 구현체에서는 본 절의 정의를 사용하는 것이 권장됩니다.
7.1. 레거시 UIEvent
보조 인터페이스
이 절은 참고용입니다
사용자
에이전트는 전통적으로 which
속성을 포함하여 KeyboardEvent
와
MouseEvent
에
추가 이벤트 정보를 기록할 수 있도록 했습니다.
이전 버전 명세는 which
속성을 KeyboardEvent
와
MouseEvent
에
각각 정의했으나, 현재는 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 인터페이스 (보조)
UIEvent
의
which
를
지원하는 브라우저는 UIEventInit
딕셔너리에도 아래 멤버를 추가해야 합니다.
부분 UIEventInit
딕셔너리는 UIEventInit
딕셔너리를 확장하여 which
멤버를 추가해 UIEvent
속성을
초기화합니다.
partial dictionary UIEventInit {unsigned long which = 0; };
which
, 타입 unsigned long, 기본값0
-
UIEvent
의which
속성을 초기화합니다.
7.2. 레거시 KeyboardEvent
보조 인터페이스
이 절은 참고용입니다
브라우저의 키보드 지원은 세 가지 임의 속성, keyCode
,
charCode
,
그리고 UIEvent
의
which
에
의존해왔습니다.
이 세 속성은 모두 눌린 키와 관련된 숫자 코드를 반환합니다: keyCode
는
키 자체의 인덱스, charCode
는
문자 키의 ASCII 값, which
는
문자 값(가능하면) 또는 키 인덱스를 반환합니다. 이 값들과 속성의 지원 여부는 플랫폼, 키보드 언어/레이아웃, 사용자 에이전트, 버전, 그리고 이벤트
타입에 따라 일관되지 않습니다.
7.2.1. KeyboardEvent 인터페이스 (보조)
부분 KeyboardEvent
인터페이스는 KeyboardEvent
인터페이스를 확장하여 charCode
와
keyCode
속성을 추가합니다.
부분 KeyboardEvent
인터페이스는 이 확장을 지원하는 구현체에서 createEvent()
메서드 호출로 얻을 수 있습니다.
partial interface KeyboardEvent { // 다음은 레거시 사용자 에이전트 지원용readonly attribute unsigned long charCode ;readonly attribute unsigned long keyCode ; };
charCode
, 타입 unsigned long, readonly-
charCode
는keypress
이벤트에서 문자 입력을 생성하는 경우 문자값(유니코드 코드포인트, 예: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 인터페이스 (보조)
KeyboardEvent
의
keyCode
및 charCode
를
지원하는 브라우저는 KeyboardEventInit
딕셔너리에도 아래 멤버를 추가해야 합니다.
부분 KeyboardEventInit
딕셔너리는 KeyboardEventInit
딕셔너리를 확장하여 charCode
및 keyCode
멤버를 추가해 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
속성에서 가상 키 코드와 문자 코드를 모두 노출하는(통합 모델), 또는 keyCode
와 charCode
속성을 분리해서 보고하는(분리 모델) 방식을 선택할 수 있습니다.
7.3.1. keyCode
값 결정 방법 (keydown
, keyup
이벤트)
keydown
또는 keyup
이벤트의 keyCode
결정 방법:
-
운영체제 이벤트 정보에서 가상 키 코드를 읽어옵니다(가능한 경우).
-
입력기(IME)가 키 입력을 처리 중이고 이벤트가
keydown
이면 229를 반환합니다. -
수정키 없이 누르면 숫자(0-9)가 입력되는 키라면, 해당 숫자의 ASCII 코드를 반환합니다.
-
수정키 없이 누르면 영문 소문자(a-z)가 입력되는 키라면, 그 대문자에 해당하는 ASCII 코드를 반환합니다.
-
운영체제/플랫폼용 키 코드 변환 테이블을 지원한다면, 테이블에서 값을 조회하여 대체 가상키 값을 지정하고 있으면 그 값을 반환합니다.
-
키의 기능이 구현체별 판단에 따라 § 7.3.3 고정 가상 키 코드 표의 키에 해당한다면, 표에 있는 값을 반환합니다.
-
운영체제에서 가상 키 코드를 반환합니다.
-
키 코드를 찾지 못하면 0을 반환합니다.
7.3.2.
keyCode
값 결정 방법 (keypress
이벤트)
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
이벤트 타입의 사용은 더 이상 권장되지 않습니다.
DOMActivate
와 click
은 완전히 동일하지 않지만, 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
agent는 event
target이 포커스를 받을 때 반드시 이 이벤트를 디스패치해야 합니다. 포커스는 이 이벤트 타입을 디스패치하기 전에 해당 요소에 반드시 먼저 주어져야 합니다. 이 이벤트
타입은 focus
이벤트 타입 이후에 반드시
디스패치되어야 합니다.
DOMFocusIn
이벤트 타입은 참조 및 완전성을 위해 이 명세에 정의되어 있지만, 이 명세는 관련
이벤트 타입 focus
와 focusin
을 사용하도록 이 이벤트 타입의
사용을 더 이상 권장하지 않습니다.
8.2.1.2. DOMFocusOut
타입 | DOMFocusOut
|
---|---|
인터페이스 | FocusEvent
|
동기 / 비동기 | 동기 |
버블링 | 예 |
신뢰할 수 있는 타겟 | Window , Element
|
취소 가능 | 아니오 |
Composed | 예 |
기본 동작 | 없음 |
컨텍스트 (신뢰 이벤트) |
|
user
agent는 event
target이 포커스를 잃을 때 반드시 이 이벤트를 디스패치해야 합니다. 포커스는 이 이벤트 타입을 디스패치하기 전에 해당 요소에서 반드시 먼저 제거되어야 합니다. 이
이벤트 타입은 blur
이벤트 타입 이후에 반드시
디스패치되어야 합니다.
DOMFocusOut
이벤트 타입은 참조와 완전성을 위해 이 명세에 정의되어 있지만, 이 명세는 관련
이벤트 타입 blur
및 focusout
의 사용을 권장하며 이
이벤트 타입의 사용을 더 이상 권장하지 않습니다.
8.2.2. 레거시 FocusEvent 이벤트 순서
아래는 요소 간 포커스가 이동될 때의 일반적인 이벤트 시퀀스입니다. 여기에는 더 이상 사용되지 않는 DOMFocusIn
및 DOMFocusOut
이벤트도 포함됩니다. 표시된 순서는 처음에 포커스된 요소가 없는 것으로
가정합니다.
이벤트 타입 | 비고 | |
---|---|---|
사용자가 포커스 이동 | ||
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
이벤트는 키 이벤트에
특화되어 있으며, 더 일반적인 beforeinput
및 input
이벤트 시퀀스로 대체되었습니다. 이 새로운 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 = "undefined"); };
data
TextEvent
인터페이스 및 textInput 이벤트에
대해서는 UI Events Algorithms의 텍스트 이벤트 섹션을 참고하세요.
9. 이벤트 확장
이 절은 참고용입니다
9.1. 소개
이 명세는 여러 인터페이스와 많은 이벤트를 정의하지만, 모든 목적에 대한 포괄적인 이벤트 집합은 아닙니다. 콘텐츠 작성자와 구현자가 원하는 기능을 추가할 수 있도록, 이 명세는 인터페이스와 이벤트 집합을 충돌 없이 확장할 수 있는 두 가지 메커니즘을 제공합니다: 커스텀 이벤트와 구현체별 확장.
9.2. 커스텀 이벤트
스크립트 작성자는 애플리케이션의 기능적 컴포넌트와, 그 아키텍처에 의미가 있는 이벤트 타입을 정의하고자 할 수 있습니다. 콘텐츠 작성자는 CustomEvent
인터페이스를 사용하여 자신이 사용하는 추상화 수준에 맞는 이벤트를 직접 만들 수 있습니다.
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 애플리케이션은 error
및 load
이벤트를 감시하여, 로컬 시스템에서 접근
가능한 네트워크 내 다른 컴퓨터나 열린 포트를 파악해 추가 공격을 준비할 수 있습니다.
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이며 권장되지 않습니다. 이미 존재하거나 대체가 진행 중인 기능만 이 명세에서 폐기 대상으로 지정해야 합니다. 기존에 해당 기능을 지원하지 않는 구현체는 하위 호환성을 위해 폐기 기능을 구현할 수 있지만, 새 콘텐츠를 작성하는 작성자는 다른 방법이 없을 때를 제외하고 폐기 기능을 사용하지 않아야 합니다. 이 명세를 참조하는 다른 명세는 폐기 기능 대신 대체 기능을 참조해야 합니다. 이 명세에서 폐기된 기능은 향후 명세에서 삭제될 예정입니다.
- 빈 문자열
-
빈 문자열은 길이가
0
인DOMString
타입 값으로, 아무 문자(출력/제어 문자 포함)도 포함하지 않은 문자열입니다. - 이벤트 포커스
-
이벤트 포커스는 이벤트 타겟이 되는 특정 요소나 객체에 집중하고 수용하는 특별한 상태입니다. 각 요소는 기능(버튼이나 하이퍼링크의 활성화 준비, 체크박스의 상태 토글, 텍스트 입력, 선택 텍스트 복사 등)에 따라 포커스 시 동작이 다릅니다. 자세한 내용은 § 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()
로 새로 생성된 직후의 값입니다.