UI 이벤트

W3C 워킹드래프트,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-uievents-20260221/
최신 공개 버전:
https://www.w3.org/TR/uievents/
에디터 초안:
https://w3c.github.io/uievents/
이전 버전:
히스토리:
https://www.w3.org/standards/history/uievents/
피드백:
GitHub
명세 내 인라인
에디터:
Xiaoqian Wu (W3C)
이전 에디터:
Gary Kacmarcik (Google)
Travis Leithead (Microsoft)
Doug Schepers (2008년 3월 – 2011년 5월)
테스트:
web-platform-tests uievents/ (진행 중 작업)

요약

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

이 문서의 상태

이 섹션은 이 문서가 발행될 당시의 상태를 설명합니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정본은 W3C 표준 및 초안 목록에서 찾을 수 있습니다.

이 문서는 웹 애플리케이션 워킹 그룹에서 작업 초안으로 권고 트랙을 따라 발행되었습니다. 작업 초안으로 발행되었다고 해서 W3C 및 그 회원의 승인을 의미하지는 않습니다.

이 문서는 초안이며 언제든지 다른 문서에 의해 갱신, 대체 또는 폐기될 수 있습니다. 진행 중인 작업 외의 용도로 이 문서를 인용하는 것은 부적절합니다.

이 문서는 W3C 특허 정책 하에서 운영되는 그룹에 의해 작성되었습니다. W3C는 그룹 산출물과 관련하여 이루어진 특허 공개의 공개 목록을 유지합니다. 해당 페이지에는 특허를 공개하는 방법에 대한 안내도 포함되어 있습니다. 개별이 필수 청구항을 포함한다고 믿는 특허에 대한 실제 정보를 알고 있다면, W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받습니다.

1. 소개

1.1. 개요

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

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

1.1.1. 마우스 및 휠 이벤트

이 명세의 마우스 이벤트와 휠 이벤트 섹션은 Pointer Events 명세로 이동되었습니다 [pointerevents4].

1.2. 적합성

이 섹션은 규범적입니다.

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

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

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

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

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

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

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

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

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

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

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

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

1.2.2. 저작 도구

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

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

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

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

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

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

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

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

1.2.4. 명세 및 호스트 언어

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

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

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

2. 스타일 관례

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

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

마지막으로:

이것은 참고 사항입니다.

이것은 열린 이슈입니다.

이것은 경고입니다.

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

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

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

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

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

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

3.1. 이벤트 타입 목록

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

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

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

이벤트 유형 동기 / 비동기 버블링 단계 신뢰할 수 있는 이벤트 대상 타입 DOM 인터페이스 취소 가능 기본 동작
abort 동기 아니오 Window, Element Event 아니오 없음
beforeinput 동기 Element InputEvent DOM 요소 업데이트
blur 동기 아니오 Window, Element FocusEvent 아니오 없음
compositionstart 동기 Element CompositionEvent 텍스트 합성 시스템 후보 창 표시
compositionupdate 동기 Element CompositionEvent 아니오 없음
compositionend 동기 Element CompositionEvent 아니오 없음
error 비동기 아니오 Window, Element Event 아니오 없음
focus 동기 아니오 Window, Element FocusEvent 아니오 없음
focusin 동기 Window, Element FocusEvent 아니오 없음
focusout 동기 Window, Element FocusEvent 아니오 없음
input 동기 Element InputEvent 아니오 없음
keydown 동기 Element KeyboardEvent 다양함: beforeinputinput 이벤트 트리거; 텍스트 합성 시스템 실행; blurfocus 이벤트; keypress 이벤트(지원 시); activation behavior; 기타 이벤트
keyup 동기 Element KeyboardEvent 없음
load 비동기 아니오 Window, Document, Element Event 아니오 없음
select 동기 Element Event 아니오 없음
unload 동기 아니오 Window, Document, Element Event 아니오 없음

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

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

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

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

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

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

3.2.1. UIEvent 인터페이스

DOM Level 2에서 도입됨

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

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

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

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

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

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

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

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

3.2.2. UIEvent 알고리즘

3.2.2.1. UIEvent 초기화
입력

event: 초기화할 UIEvent

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

eventTarget: 이벤트의 EventTarget

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

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

출력

없음

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

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

    2. event.target = eventTarget

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

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

    2. event.detail = 0

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

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

3.2.3. UIEvent 타입

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.3. 포커스 이벤트

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

3.3.1. FocusEvent 인터페이스

이 명세에서 도입됨

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

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

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

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

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

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

3.3.2. 포커스 이벤트 순서

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

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

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

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

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

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

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

3.3.4. 포커스 이벤트 타입

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

3.3.4.1. blur
유형 blur
인터페이스 FocusEvent
동기 / 비동기 동기
버블링 아니오
신뢰할 수 있는 대상 Window, Element
취소 가능 아니오
합성됨
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

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

3.3.4.2. focus
유형 focus
인터페이스 FocusEvent
동기 / 비동기 동기
버블링 아니오
신뢰할 수 있는 대상 Window, Element
취소 가능 아니오
합성됨
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

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

3.3.4.3. focusin
유형 focusin
인터페이스 FocusEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Window, Element
취소 가능 아니오
합성됨
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

사용자 에이전트이벤트 대상 이 포커스를 받을 때 반드시 이 이벤트를 디스패치해야 합니다. 이벤트 대상은 반드시 포커스를 받은 요소여야 합니다. focus 이벤트가 반드시 이 이벤트 타입이 디스패치되기 전에 먼저 발생해야 합니다. 이 이벤트 타입은 focus와 유사하지만 버블링됩니다.

3.3.4.4. focusout
유형 focusout
인터페이스 FocusEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Window, Element
취소 가능 아니오
합성됨
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

사용자 에이전트이벤트 대상 이 포커스를 잃을 때 반드시 이 이벤트를 디스패치해야 합니다. 이벤트 대상은 반드시 포커스를 잃은 요소여야 합니다. blur 이벤트가 반드시 이 이벤트 타입이 디스패치되기 전에 먼저 발생해야 합니다. 이 이벤트 타입은 blur와 유사하지만, 버블링됩니다.

3.4. 입력 이벤트

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

3.4.1. InputEvent 인터페이스

3.4.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, 읽기 전용, 널 허용
data는 입력 방법에 의해 생성된 문자의 값을 담습니다. 이는 단일 유니코드 문자이거나 비어 있지 않은 유니코드 문자 시퀀스일 수 있습니다 [Unicode]. 문자들은 Unicode 정규화 형식 NFC에 정의된 대로 정규화되어야 합니다 [UAX15]. 이 속성은 빈 문자열을 포함할 수도 있습니다.

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

isComposing, 형식: boolean, 읽기 전용
이 입력 이벤트가 composition 세션의 일부로 발생한 경우(즉, compositionstart 이벤트 이후이고 해당하는 compositionend 이벤트 이전인 경우) true입니다.

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

inputType, 형식: DOMString, 읽기 전용
inputType은 이벤트와 관련된 입력의 유형을 식별하는 문자열을 포함합니다.

이 속성의 유효한 값 목록은 [Input-Events] 명세를 참조하세요.

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

3.4.1.2. InputEventInit
dictionary InputEventInit : UIEventInit {
  DOMString? data = null;
  boolean isComposing = false;
  DOMString inputType = "";
};
data, 형식: DOMString, 널 허용, 기본값 null
InputEvent 객체의 data 속성을 초기화합니다.
isComposing, 형식: boolean, 기본값 false
InputEvent 객체의 isComposing 속성을 초기화합니다.
inputType, 형식: DOMString, 기본값 ""
InputEvent 객체의 inputType 속성을 초기화합니다.

3.4.2. 입력 이벤트 순서

이 명세에서 정의한 입력 이벤트들은 서로에 대해 정해진 순서대로 발생해야 합니다.

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

3.4.3. 입력 이벤트 유형

3.4.3.1. beforeinput
유형 beforeinput
인터페이스 InputEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Element (특히: HTMLInputElement와 같은 제어 타입 등) 또는 contenteditable 속성이 활성화된 모든 Element
취소 가능
구성됨
기본 동작 DOM 요소를 업데이트함
맥락
(신뢰된 이벤트)

사용자 에이전트는 DOM이 업데이트되려 할 때 반드시 이 이벤트를 디스패치해야 합니다.

3.4.3.2. input
유형 input
인터페이스 InputEvent
동기 / 비동기 동기
버블링
신뢰할 수 있는 대상 Element (특히: HTMLInputElement와 같은 제어 타입 등) 또는 contenteditable 속성이 활성화된 모든 Element
취소 가능 아니요
구성됨
기본 동작 없음
맥락
(신뢰된 이벤트)

사용자 에이전트는 DOM이 업데이트된 직후에 반드시 이 이벤트를 디스패치해야 합니다.

3.5. 키보드 이벤트

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

키보드 이벤트는 텍스트 입력을 제공하는 한 가지 방식일 뿐입니다. 편집 시나리오에서는 키보드 이벤트의 대안으로(또는 추가적으로) InputEvent를 사용하는 것을 고려하세요.

3.5.1. KeyboardEvent 인터페이스

이 명세에서 도입됨

The KeyboardEvent interface provides specific contextual information associated with keyboard devices. Each keyboard event references a key using a value. Keyboard events are commonly directed at the element that has the focus.

The KeyboardEvent interface provides convenient attributes for some common modifiers keys: ctrlKey, shiftKey, altKey, metaKey. These attributes are equivalent to using the method getModifierState() with Control, Shift, Alt, or Meta respectively.

To create an instance of the KeyboardEvent interface, use the KeyboardEvent constructor, passing an optional KeyboardEventInit dictionary.

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

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

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

  readonly attribute boolean repeat;
  readonly attribute boolean isComposing;

  boolean getModifierState(DOMString keyArg);
};
DOM_KEY_LOCATION_STANDARD
키 동작을 왼쪽 또는 오른쪽으로 구분하지 않으며(NumLock 키 제외) 숫자 키패드에서 비롯된 것이 아님을 의미합니다.

PC 101 키 US 키보드의 Q 키.
PC 101 키 US 키보드의 NumLock 키.
PC 101 키 US 키보드에서 키보드의 메인 섹션에 위치한 1 키.

DOM_KEY_LOCATION_LEFT
활성화된 키가 왼쪽 위치에서 유래했음을 나타냅니다(키에 여러 가능한 위치가 있는 경우).

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

DOM_KEY_LOCATION_RIGHT
활성화된 키가 오른쪽 위치에서 유래했음을 나타냅니다(키에 여러 가능한 위치가 있는 경우).

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

DOM_KEY_LOCATION_NUMPAD
활성화된 키가 숫자 키패드에서 유래했거나 숫자 키패드에 대응하는 가상 키에서 유래했음을 나타냅니다(키에 여러 가능한 위치가 있는 경우). 참고로 NumLock 키는 항상 location 값으로 DOM_KEY_LOCATION_STANDARD를 사용해야 합니다.

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

key, 형식: DOMString, 읽기 전용
key는 눌린 키에 대응하는 key attribute value를 담습니다.

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

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

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

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

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

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

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

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

ctrlKey, 형식: boolean, 읽기 전용
true이면 Control 키(컨트롤) 수정자가 활성화된 상태입니다.

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

shiftKey, 형식: boolean, 읽기 전용
true이면 Shift 키 수정자가 활성화된 상태입니다.

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

altKey, 형식: boolean, 읽기 전용
true이면 Alt(또는 "Option") 키 수정자가 활성화된 상태입니다.

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

metaKey, 형식: boolean, 읽기 전용
true이면 Meta 키 수정자가 활성화된 상태입니다.

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

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

repeat, 형식: boolean, 읽기 전용
true이면 키가 지속적으로 눌려져 반복되고 있음을 나타냅니다. 키를 누르고 있으면 시스템 구성에 따라 keydown, beforeinput, input 이벤트가 이 순서로 반복되어야 합니다. 화면 기반 입력 장치의 소프트웨어 키보드와 같은 모바일 장치에서 long-key-press 동작이 있는 경우, repeat 속성 값이 true인 첫 번째 키 이벤트는 long-key-press의 표시로 간주되어야 합니다. 반복이 시작되기까지 필요한 시간은 구성에 따라 다릅니다.

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

isComposing, 형식: boolean, 읽기 전용
이 키 이벤트가 composition 세션의 일부로 발생한 경우(즉, compositionstart 이벤트 이후이고 해당하는 compositionend 이벤트 이전인 경우) true입니다.

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

getModifierState(keyArg)
키 값을 사용하여 수정자의 상태를 쿼리합니다.

리턴 값은 해당 키가 수정자 키이고 그 수정자가 활성화된 경우 true, 그렇지 않으면 false입니다.

DOMString keyArg
수정자 키 값입니다. 유효한 수정자 키Modifier Keys table에 정의되어 있습니다.

애플리케이션이 오른쪽과 왼쪽 수정자를 구별하려는 경우, 이 정보는 키보드 이벤트와 location을 사용하여 유추할 수 있습니다.

3.5.1.2. KeyboardEventInit
dictionary KeyboardEventInit : EventModifierInit {
  DOMString key = "";
  DOMString code = "";
  unsigned long location = 0;
  boolean repeat = false;
  boolean isComposing = false;
};
key, 형식: DOMString, 기본값 ""
KeyboardEvent 객체의 key 속성을 초기화합니다. 이 값은 수정자(예: shift 상태)를 고려한 후 키의 의미를 나타내는 유니코드 문자열입니다. 출력 가능한 문자가 아닌 경우, [UIEvents-Key]에 정의된 키 값 중 하나여야 합니다.
code, 형식: DOMString, 기본값 ""
KeyboardEvent 객체의 code 속성을 초기화합니다. 이 값은 키보드 레이아웃과 같은 수정자를 무시하고 눌린 물리적 키를 나타내는 유니코드 문자열입니다. 이 값은 [UIEvents-Code]에 정의된 코드 값 중 하나여야 합니다.
location, 형식: unsigned long, 기본값 0
KeyboardEvent 객체의 location 속성을 다음 위치 숫자 상수 중 하나로 초기화합니다:
repeat, 형식: boolean, 기본값 false
KeyboardEvent 객체의 repeat 속성을 초기화합니다. 이 속성은 현재 KeyboardEvent가 단일 키의 장시간 누름으로 인해 발생한 반복 시퀀스의 일부로 간주되는 경우 true로 설정되어야 하고, 그렇지 않으면 false로 설정되어야 합니다.
isComposing, 형식: boolean, 기본값 false
KeyboardEvent 객체의 isComposing 속성을 초기화합니다. 이 속성은 생성되는 이벤트가 composition 시퀀스의 일부로 발생하는 경우 true로, 그렇지 않으면 false로 설정되어야 합니다.
레거시 키보드 이벤트 구현체에는 추가로 세 가지 속성, keyCode, charCode, 및 which가 포함됩니다. keyCode 속성은 컴퓨터 키보드의 특정 키와 연관된 숫자 값을 나타내고, charCode 속성은 해당 키와 연관된 문자(해당 키가 문자 값을 생성하는 경우)의 ASCII 값을 나타냅니다(이는 keyCode 값과 동일할 수 있음).

실제로 keyCodecharCode는 플랫폼 간에, 심지어 동일한 구현이라도 운영 체제나 로컬라이제이션에 따라 일관되지 않습니다. 이 명세는 keyCode 또는 charCode의 값을 정의하지 않으며, charCode의 동작을 정의하지 않습니다. 준수하는 UI Events 구현에서는 콘텐츠 작성자가 대신 keycode를 사용할 수 있습니다.

자세한 정보는 레거시 키 속성에 관한 정보성 부록을 참조하세요.

기존 콘텐츠와의 호환성을 위해, 화면 기반 입력 장치의 소프트웨어 키보드와 같은 가상 키보드는 물리적 키가 없더라도 일반적인 범위의 키보드 이벤트를 생성할 것으로 기대됩니다.

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

3.5.2. 키보드 이벤트 키 위치

The location 속성은 키보드의 서로 다른 물리적 키에서 생성될 수 있는 key 값들을 구별하는 데 사용할 수 있습니다. 예를 들어 왼쪽과 오른쪽 Shift 키 또는 물리적 화살표 키와 숫자패드의 화살표 키 (NumLock이 꺼져 있을 때) 등입니다.

다음 표는 키보드에서 둘 이상의 위치를 가지는 특수 키들에 대해 유효한 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.5.3. 이벤트 수정자 초기화

The MouseEventKeyboardEvent 인터페이스는 일련의 키보드 수정자 속성을 공유하며 추가 수정자 상태를 검색하는 메커니즘을 지원합니다. 다음 사전은 작성자가 MouseEventKeyboardEvent 인터페이스의 키보드 수정자 속성과 getModifierState() 를 통해 질의되는 추가 수정자 상태들을 초기화할 수 있게 해 줍니다. 이 사전을 사용하여 마우스 이벤트를 구성하는 절차는 [pointerevents4] 명세에 정의되어 있습니다.

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
ctrlKeyMouseEvent 또는 KeyboardEvent 객체의 ctrlKey 속성을 Control 키 수정자가 활성으로 간주되어야 할 경우 true로, 그렇지 않으면 false로 초기화합니다.

값이 true일 때, 구현은 이벤트 객체의 키 수정자 상태도 초기화해야 하며, getModifierState() 또는 getModifierState() 에서 매개변수로 Control 를 제공했을 때 true를 반환하도록 해야 합니다.

shiftKey, 형식은 boolean, 기본값은 false
shiftKeyMouseEvent 또는 KeyboardEvent 객체의 shiftKey 속성을 Shift 키 수정자가 활성으로 간주되어야 할 경우 true로, 그렇지 않으면 false로 초기화합니다.

값이 true일 때, 구현은 이벤트 객체의 키 수정자 상태도 초기화해야 하며, getModifierState() 또는 getModifierState() 에서 매개변수로 Shift 를 제공했을 때 true를 반환하도록 해야 합니다.

altKey, 형식은 boolean, 기본값은 false
altKeyMouseEvent 또는 KeyboardEvent 객체의 altKey 속성을 Alt(또는 Option) 키 수정자가 활성으로 간주되어야 할 경우 true로, 그렇지 않으면 false로 초기화합니다.

값이 true일 때, 구현은 이벤트 객체의 키 수정자 상태도 초기화해야 하며, getModifierState() 또는 getModifierState() 에서 매개변수로 Alt 를 제공했을 때 true를 반환하도록 해야 합니다.

metaKey, 형식은 boolean, 기본값은 false
metaKeyMouseEvent 또는 KeyboardEvent 객체의 metaKey 속성을 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.5.4. KeyboardEvent 알고리즘

3.5.4.1. KeyboardEvent를 위한 전역 상태
3.5.4.1.1. 사용자 에이전트 수준 상태

UA는 전체 사용자 에이전트에서 공유되는 다음 값들을 유지해야 합니다.

시스템에서 사용 가능한 각 수정자 키 의 현재 상태를 추적하는 키 수정자 상태(초기에는 비어 있음).

3.5.5. 키보드 이벤트 순서

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

이벤트 유형 비고
1 keydown
2 beforeinput (문자 값을 생성하는 키에만 해당)
이 키와 관련된 모든 기본 동작, 예: DOM에 문자 삽입.
3 input (DOM을 업데이트한 키에만 해당)
키가 일정 기간 눌려 있는 결과로 발생하는 모든 이벤트(아래 참조).
4 keyup

키를 일정 시간 동안 누르고 있으면, 다음 이벤트들이 환경에 따라 반복될 수 있습니다:

이벤트 유형 비고
1 keydown (repeat 속성이 true로 설정된 경우)
2 beforeinput (문자 값을 생성하는 키에만 해당)
이 키와 관련된 모든 기본 동작, 예: DOM에 문자 삽입.
3 input (DOM을 업데이트한 키에만 해당)

일반적으로 특정 키와 연관된 모든 기본 동작keyup 이벤트가 디스패치되기 전에 완료됩니다. 이로 인해 keyup 이벤트가 약간 지연될 수 있습니다(그러나 이는 인지 가능한 지연일 가능성은 낮습니다).

The 이벤트 대상은 키보드 동작을 처리하는 현재 포커스된 요소입니다. 이는 종종 HTML input 요소나 편집 가능한 텍스트 요소이지만, 호스트 언어에 의해 가속기 키 활성화나 기타 동작 트리거와 같은 비텍스트 목적의 키보드 입력을 받도록 정의된 요소일 수도 있습니다. 적절한 요소가 포커스되어 있지 않으면, 이벤트 대상은 사용 가능하면 HTML body 요소가 되며, 그렇지 않으면 루트 요소가 됩니다.

이벤트 대상은 서로 다른 키 이벤트들 사이에서 변경될 수 있습니다. 예를 들어, keydown 이벤트는 동일한 키스트로크에 대한 keyup 이벤트와 다른 이벤트 대상을 가질 가능성이 높습니다.

3.5.6. 키보드 이벤트 유형

3.5.6.1. keydown
형식 keydown
인터페이스 KeyboardEvent
동기 / 비동기 동기
버블링
신뢰된 대상 Element
취소 가능
합성됨
기본 동작 다름: beforeinputinput 이벤트; 텍스트 합성 시스템 실행; blurfocus 이벤트; keypress 이벤트(지원되는 경우); 활성화 동작; 기타 이벤트
컨텍스트
(신뢰된 이벤트)

사용자 에이전트(user agent)는 키가 눌릴 때 이 이벤트를 반드시 디스패치해야 합니다. keydown 이벤트 유형은 장치에 따라 다르며 입력 장치의 기능과 운영 체제에서의 매핑 방식에 의존합니다. 이 이벤트 유형은 키 매핑 이후에 생성되어야 합니다. 이 이벤트 유형은 동일한 키와 관련된 beforeinput, input, 및 keyup 이벤트보다 먼저 디스패치되어야 합니다.

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

이 이벤트가 취소된 경우, 관련된 이벤트 유형들은 디스패치되어서는 안 되며 관련 동작들도 수행되어서는 안 됩니다.

참고: keydownkeyup 이벤트는 전통적으로 문자 값을 생성하는 키뿐만 아니라 어떤 키든지 감지하는 것과 관련이 있습니다.

3.5.6.2. keyup
형식 keyup
인터페이스 KeyboardEvent
동기 / 비동기 동기
버블링
신뢰된 대상 Element
취소 가능
합성됨
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

사용자 에이전트(user agent)는 키가 릴리스될 때 이 이벤트를 반드시 디스패치해야 합니다. keyup 이벤트 유형은 장치에 따라 다르며 입력 장치의 기능과 운영 체제에서의 매핑 방식에 의존합니다. 이 이벤트 유형은 키 매핑 이후에 생성되어야 합니다. 이 이벤트 유형은 동일한 키와 관련된 keydown, beforeinput, 및 input 이벤트들 이후에 디스패치되어야 합니다.

keydownkeyup 이벤트는 전통적으로 문자 값을 생성하는 키뿐만 아니라 어떤 키든지 감지하는 것과 관련이 있습니다.

3.6. Composition Events

Composition Events는 키보드 이벤트와는 보조적이거나 대체적인 방식으로 텍스트를 입력할 수 있는 수단을 제공하여, 키보드에 흔히 존재하지 않을 수 있는 문자를 사용할 수 있게 합니다. 예를 들어, Composition Events는 표준 미국 키보드에 없는 문자에 악센트를 추가하거나, 여러 아시아 언어의 표의문자를 기본 구성 요소 또는 범주로부터 구성하거나, 모바일 장치 키보드에서 복수의 키 입력 조합으로 단어 선택을 하거나, 음성 인식 프로세서를 사용해 음성 명령을 텍스트로 변환하는 데 사용될 수 있습니다. Composition Events가 키보드 이벤트와 어떻게 결합되어 사용되는지에 대한 예는 § 4 Keyboard events and key values를 참조하세요.

개념적으로, 하나의 composition 세션은 하나의 compositionstart 이벤트, 하나 이상의 compositionupdate 이벤트들, 그리고 하나의 compositionend 이벤트로 구성되며, data 속성의 값은 세션 동안 이 이벤트 체인의 각 단계(stage) 사이에 지속됩니다.

참고: composition 세션이 활성화되어 있는 동안, 키보드가 그 세션에 사용되는 입력 장치인 경우 키보드 이벤트들이 DOM으로 디스패치될 수 있습니다. 관련 이벤트 순서는 compositionstart 이벤트 세부사항과 IME 섹션을 참조하세요.

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

3.6.1. CompositionEvent 인터페이스

이 명세에서 도입됨

The CompositionEvent 인터페이스는 Composition Events와 관련된 특정 문맥 정보를 제공합니다.

CompositionEvent 인터페이스의 인스턴스를 생성하려면, 선택적 CompositionEventInit 사전을 전달하여 CompositionEvent 생성자를 사용하세요.

3.6.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.6.1.2. CompositionEventInit
dictionary CompositionEventInit : UIEventInit {
  DOMString data = "";
};
data, 타입은 DOMString, 기본값은 ""
CompositionEvent 객체의 data 속성을 IME 합성으로 생성된 문자들로 초기화합니다.

3.6.2. Composition Event Order

이 명세에서 정의된 Composition 이벤트들은 상호 간에 다음과 같은 순서로 발생해야 합니다:

Event Type Notes
1 compositionstart
2 compositionupdate 여러 번 발생할 수 있음
3 compositionend

3.6.3. Handwriting Recognition Systems

다음 예시는 펜 태블릿과 같은 필기 인식 시스템에서 텍스트 구절 text를 합성할 때 발생할 수 있는 이벤트 순서를 Composition Events를 사용하여 설명합니다.

Event Type CompositionEvent
data
Notes
1 compositionstart ""
사용자가 태블릿 표면에 단어를 씀
2 compositionupdate "test"
사용자가 첫 번째 단어 일치 제안을 거부하고 다른 일치를 선택함
3 compositionupdate "text"
4 compositionend "text"

3.6.4. Canceling Composition Events

만약 keydown 이벤트가 취소되면, 그 keydown로 인해 발생했어야 할 모든 Composition 이벤트들은 디스패치되어서는 안 됩니다:

Event Type Notes
1 keydown 기본 동작이 방지됨, 예: preventDefault() 호출
어떤 Composition 이벤트도 디스패치되지 않음
2 keyup

만약 초기의 compositionstart 이벤트가 취소되면 텍스트 합성 세션은 종료되어야 합니다. 합성 세션이 종료되었는지 여부와 상관없이, compositionend 이벤트는 반드시 전송되어야 합니다.

Event Type Notes
1 keydown
2 compositionstart 기본 동작이 방지됨, 예: preventDefault() 호출
어떤 Composition 이벤트도 디스패치되지 않음
3 compositionend
4 keyup

3.6.5. Key Events During Composition

합성 세션 동안에는 keydownkeyup 이벤트가 여전히 전송되어야 하며, 이 이벤트들은 isComposing 속성이 true로 설정되어 있어야 합니다.

Event Type KeyboardEvent
isComposing
Notes
1 keydown false 이것이 합성을 시작시키는 키 이벤트입니다.
2 compositionstart
3 compositionupdate
4 keyup true
... 합성 세션 동안 전송되는 모든 키 이벤트는 isComposingtrue로 설정되어야 합니다.
5 keydown true 이것이 합성에서 빠져나오는 키 이벤트입니다.
6 compositionend
7 keyup false

3.6.6. Input Events During Composition

합성 세션 동안에는 compositionupdatebeforeinput가 전송된 후, 그러나 input 이벤트가 전송되기 전에 디스패치되어야 합니다.

Event Type Notes
1 beforeinput
2 compositionupdate
이 시점에서 DOM 업데이트가 발생합니다.
3 input

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

The beforeinput and input events are sent along with the compositionupdate event whenever the DOM is updated as part of the composition. Since there are no DOM updates associated with the compositionend event, beforeinput and input events should not be sent at that time.

Event Type Notes
1 beforeinput 이 이벤트를 취소하면 DOM 업데이트와 input 이벤트가 방지됩니다.
2 compositionupdate
이 시점에서 DOM 업데이트가 발생합니다.
3 input DOM이 업데이트된 경우에만 전송됩니다.
4 compositionend

3.6.7. Composition Event Types

3.6.7.1. compositionstart
Type compositionstart
Interface CompositionEvent
Sync / Async Sync
Bubbles Yes
Trusted Targets Element
Cancelable Yes
Composed Yes
Default action 텍스트 합성 시스템이 활성화될 때 새로운 합성 세션을 시작함
Context
(trusted events)

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

이 이벤트는 텍스트 합성 시스템이 새 합성 세션을 시작하기 직전에, 그리고 합성 과정으로 인해 DOM이 변경되기 전에 즉시 디스패치되어야 합니다. 이 이벤트의 기본 동작은 텍스트 합성 시스템이 새로운 합성 세션을 시작하는 것입니다. 이 이벤트가 취소되면, 텍스트 합성 시스템은 현재 합성 세션을 폐기해야 합니다.

compositionstart 이벤트 타입을 취소하는 것은 텍스트 합성 시스템 자체(예: 취소 버튼을 누르거나 IME 창을 닫음)를 취소하는 것과 구별됩니다.

일부 IME는 진행 중인 합성 세션을 취소하는 것을 지원하지 않습니다(예: 현재 그런 API가 없는 GTK). 이런 경우에는 preventDefault() 를 호출해도 이 이벤트의 기본 동작을 멈추지 못할 것입니다.

3.6.7.2. compositionupdate
Type compositionupdate
Interface CompositionEvent
Sync / Async Sync
Bubbles Yes
Trusted Targets Element
Cancelable No
Composed Yes
Default action 없음
Context
(trusted events)

사용자 에이전트는 합성 세션 중 텍스트 합성 시스템이 활성 텍스트 구절을 새로운 문자로 업데이트할 때, 그 변경이 data에 반영되면 이 이벤트를 디스패치해야 합니다.

입력 제어와 합성 내용을 동기화하는 텍스트 합성 시스템에서는, compositionupdate 이벤트가 제어가 업데이트되기 전에 반드시 디스패치되어야 합니다.

합성 정보를 DOM에 노출하지 않는 일부 텍스트 합성 시스템의 경우, 이 이벤트는 합성 과정 중에 발생하지 않습니다.

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

3.6.7.3. compositionend
Type compositionend
Interface CompositionEvent
Sync / Async Sync
Bubbles Yes
Trusted Targets Element
Cancelable No
Composed Yes
Default action 없음
Context
(trusted events)

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

이 이벤트는 텍스트 합성 시스템이 합성 세션을 완료한 직후에 디스패치됩니다(예: IME가 닫히거나 최소화되거나 포커스에서 벗어나 해제되고, 포커스가 사용자 에이전트로 다시 전환되는 경우 등).

4. 키보드 이벤트와 키 값

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

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

4.1. 키보드 입력

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

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

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

4.1.1. 키 레전드

이 절은 참고용입니다

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

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

4.2. 키 코드

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

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

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

4.2.1. code 속성의 도입 이유

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

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

4.2.2. keycode의 관계

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

4.2.3. code 예시

왼쪽 및 오른쪽 Alt 키 처리
키보드 레이아웃 KeyboardEvent
key
KeyboardEvent
code
메모
US "Alt" "AltLeft" DOM_KEY_LOCATION_LEFT
French "Alt" "AltLeft" DOM_KEY_LOCATION_LEFT
US "Alt" "AltRight" DOM_KEY_LOCATION_RIGHT
French "AltGraph" "AltRight" DOM_KEY_LOCATION_RIGHT

이 예에서, key 속성을 확인하면 어떤 Alt 키(왼쪽인지 오른쪽인지)가 눌렸는지 신경 쓰지 않고 Alt에 매칭할 수 있습니다. code 속성을 확인하면 현재 어떤 레이아웃이 사용 중인지 신경 쓰지 않고 오른쪽 Alt 키("AltRight")에 매칭할 수 있습니다.

프랑스 예제에서는 각 키가 하나씩만 있더라도, Alt 키와 AltGraph 키가 왼쪽과 오른쪽 위치를 유지한다는 점에 유의하십시오.

작은따옴표 키 처리
키보드 레이아웃 KeyboardEvent
key
KeyboardEvent
code
메모
US "'" "Quote"
Japanese ":" "Quote"
US Intl "Dead" "Quote"

이 예제는 데드 키(dead key) 값들이 속성에 어떻게 인코딩되는지를 보여줍니다. key 값은 현재 로케일에 따라 달라지는 반면, code 속성은 일관된 값을 반환합니다.

여러 키보드 레이아웃에서 Shift를 누른 상태와 그렇지 않은 상태에서 "2" 키 처리.
키보드 레이아웃 KeyboardEvent
key
KeyboardEvent
code
메모
US "2" "Digit2"
US "@" "Digit2" shiftKey
UK "2" "Digit2"
UK """ "Digit2" shiftKey
French "é" "Digit2"
French "2" "Digit2" shiftKey

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

키보드 이벤트 순서 : Shift2

다음 두 키 이벤트 시퀀스에서 속성 값을 비교해 보십시오. 둘 다 US 키보드에서 "@" 문자를 생성하지만, 키가 해제되는 순서가 다릅니다. 첫 번째 시퀀스에서는 순서가 다음과 같습니다: Shift (누름), 2 (누름), 2 (뗌), Shift (뗌).

이벤트 타입 KeyboardEvent
key
KeyboardEvent
code
메모
1 keydown "Shift" "ShiftLeft" DOM_KEY_LOCATION_LEFT
2 keydown "@" "Digit2" shiftKey
3 keypress "@" "Digit2" (지원되는 경우)
4 keyup "@" "Digit2" shiftKey
5 keyup "Shift" "ShiftLeft" DOM_KEY_LOCATION_LEFT

두 번째 시퀀스에서는 Shift가 2보다 먼저 해제되어 다음과 같은 이벤트 순서가 발생합니다: Shift (누름), 2 (누름), Shift (뗌), 2 (뗌).

이벤트 타입 KeyboardEvent
key
KeyboardEvent
code
메모
1 keydown "Shift" "ShiftLeft" DOM_KEY_LOCATION_LEFT
2 keydown "@" "Digit2" shiftKey
3 keypress "@" "Digit2" (지원되는 경우)
4 keyup "Shift" "ShiftLeft" DOM_KEY_LOCATION_LEFT
5 keyup "2" "Digit2"

key 속성에 포함된 값이 "2" 키에 대해 keydown 이벤트와 keyup 이벤트 간에 일치하지 않는다는 점에 유의하십시오. code 속성은 현재 수정키 상태의 영향을 받지 않는 일관된 값을 제공합니다.

4.2.4. code 및 가상 키보드

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

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

4.3. 키보드 이벤트 key

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

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

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

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

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

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

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

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

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

4.3.1. 수정키

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

이 예제는 US 키보드에서 US 매핑을 사용하여 유니코드 문자 Q (Latin Capital Letter Q, 유니코드 코드 포인트 U+0051)를 생성할 때 발생할 수 있는 이벤트의 가능한 시퀀스를 설명합니다:
이벤트 타입 KeyboardEvent
key
수정키 메모
1 keydown "Shift" shiftKey
2 keydown "Q" shiftKey Latin Capital Letter Q
3 beforeinput
4 input
5 keyup "Q" shiftKey
6 keyup "Shift"
이 예제는 위의 예제와 다른 키 시퀀스를 설명하는데, 여기서는 Shift 키가 Q 키보다 먼저 해제됩니다. Q 키의 키 값은 keyup 이벤트에서 비시프트(unsifted) 값으로 되돌아갑니다:
이벤트 타입 KeyboardEvent
key
수정키 메모
1 keydown "Shift" shiftKey
2 keydown "Q" shiftKey Latin Capital Letter Q
3 beforeinput
4 input
5 keyup "Shift"
6 keyup "q" Latin Small Letter Q
다음 예제는 (이전 예제와 동일한 구성으로) 유니코드 문자를 생성하지 않는 키 시퀀스를 설명합니다:
이벤트 타입 KeyboardEvent
key
수정키 메모
1 keydown "Control" ctrlKey
2 keydown "v" ctrlKey Latin Small Letter V
어떠한 beforeinput 또는 input 이벤트도 생성되지 않습니다.
3 keyup "v" ctrlKey Latin Small Letter V
4 keyup "Control"
다음 예제는 ShiftControl가 모두 눌렸을 때의 이벤트 시퀀스를 보여줍니다:
이벤트 타입 KeyboardEvent
key
수정키 메모
1 keydown "Control" ctrlKey
2 keydown "Shift" ctrlKey, shiftKey
3 keydown "V" ctrlKey, shiftKey Latin Capital Letter V
어떠한 beforeinput 또는 input 이벤트도 생성되지 않습니다.
4 keyup "V" ctrlKey, shiftKey Latin Capital Letter V
5 keyup "Shift" ctrlKey
6 keyup "Control"
비-US 키보드 레이아웃의 경우 이벤트 시퀀스는 동일하지만 키의 값은 현재 키보드 레이아웃에 기반합니다. 이 예제는 아랍어 키보드 레이아웃을 사용할 때의 이벤트 시퀀스를 보여줍니다:
이벤트 타입 KeyboardEvent
key
수정키 메모
1 keydown "Control" ctrlKey
2 keydown "ر" ctrlKey Arabic Letter Reh
어떠한 beforeinput 또는 input 이벤트도 생성되지 않습니다.
3 keyup "ر" ctrlKey Arabic Letter Reh
4 keyup "Control"

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

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

4.3.2. 죽은 키

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

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

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

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

이벤트 타입 KeyboardEvent
key
KeyboardEvent
isComposing
CompositionEvent
data
메모
1 keydown "Dead" false 결합 캐럿 악센트 (데드 키)
2 compositionstart ""
3 compositionupdate U+0302
4 keyup "Dead" true
5 keydown "ê" true
6 compositionupdate "ê"
7 compositionend "ê"
8 keyup "e" false 라틴 소문자 e

두 번째 keydown 이벤트(단계 5)에서, 키 값(이벤트가 억제되지 않았다고 가정하면)은 일반적인 상황에서는 일반적으로 "e" (라틴 소문자 e)가 되지 않습니다. 그 이유는 사용자 에이전트에 전달되는 값이 이미 데드 키 동작에 의해 변경되었기 때문입니다.

사용자가 데드 키를 누른 후, 지원되지 않는 기본 문자를 입력하는 경우(즉, 활성 발음 구별 부호가 해당 기본 문자에 사용될 수 없는 경우), 이 과정이 중단될 수 있습니다:

Event Type KeyboardEvent
key
KeyboardEvent
isComposing
CompositionEvent
data
Notes
1 keydown "Dead" false 결합 캐럿 악센트 (데드 키)
2 compositionstart ""
3 compositionupdate U+0302
4 keyup "Dead" true
5 keydown "q" true 라틴 소문자 q
6 compositionupdate ""
7 compositionend ""
8 keyup "q" false

4.3.3. 입력기(IME)

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

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

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

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

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

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

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

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

4.3.3.1. 입력기(IME) 모드 키

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

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

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

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

키다운(default action) 이벤트의 기본 동작을 취소하는 것은 해당 keydown 이벤트와 대응되는 keyup 이벤트에 영향을 주어서는 안 되지만, 해당 beforeinputinput (그리고 지원되는 경우 keypress) 이벤트의 생성은 반드시 막아야 합니다. 다음 예제는 US 키보드에서 US 매핑을 사용하여 유니코드 문자 Q (라틴 대문자 Q)를 생성하기 위한 가능한 키 시퀀스를 설명합니다:

Event Type KeyboardEvent
key
InputEvent
data
수정키 메모
1 keydown "Shift" shiftKey
2 keydown "Q" shiftKey 기본 동작(default action)이 방지됩니다. 예: preventDefault() 호출.
beforeinput 또는 input (또는 지원되는 경우 keypress) 이벤트가 생성되지 않습니다
3 keyup "Q" shiftKey
4 keyup "Shift"

키가 수정 키일 경우에도, 해당 키 입력은 수정키 상태에 반영되어야 합니다. 다음 예제는 US 키보드에서 US 매핑을 사용하여 유니코드 문자 Q (라틴 대문자 Q)를 생성하기 위한 가능한 키 시퀀스를 설명합니다:

Event Type KeyboardEvent
key
InputEvent
data
수정키 메모
1 keydown "Shift" shiftKey 기본 동작(default action)이 방지됩니다. 예: preventDefault() 호출.
2 keydown "Q" shiftKey
3 beforeinput "Q"
4 input
5 keyup "Q" shiftKey
6 keyup "Shift"

키가 여러 키 입력의 연속의 일부인 경우, 그것이 dead key이거나 입력 방법 편집기(Input Method Editor) 시퀀스에 기여하는 경우에는, 오직 keydown 이벤트에서 default action이 취소된 경우에만 해당 키 입력을 무시해야 합니다(반영하지 않아야 합니다). dead keykeyup 이벤트에서 취소하는 것은 beforeinput 또는 input 이벤트에 아무런 영향을 미치지 않습니다. 다음 예제는 프랑스 키보드에서 프랑스 매핑을 사용하고 어떠한 수정키도 활성화되어 있지 않은 상태에서 데드 키 "Dead" (U+0302 결합 캐럿 악센트 키)와 "e" (U+0065, 라틴 소문자 e 키)를 사용하는 경우입니다:

Event Type KeyboardEvent
key
InputEvent
data
메모
1 keydown "Dead" 기본 동작(default action)이 방지됩니다. 예: preventDefault() 호출.
2 keyup "Dead"
3 keydown "e"
4 beforeinput "e"
5 input
6 keyup "e"

5. 외부 알고리즘

이 섹션에는 이 명세에서 요구되지만 다른 명세에 더 적절하게 포함되어야 하는 알고리즘이 포함되어 있습니다.

이 섹션의 의도는 이러한 정의들의 임시적인 보관소 역할을 하는 것이며, 결국 더 적절한 위치로 옮겨져 이 전체 섹션을 삭제할 수 있어야 합니다.

5.1. 코어 DOM 알고리즘

다음 알고리즘들은 어딘가로 옮겨져야 합니다...

5.2. PointerLock 알고리즘

다음 알고리즘은 [PointerLock] 명세로 옮겨져야 합니다.

5.2.1. PointerLock의 전역 상태

5.2.1.1. 윈도우 수준 상태

사용자 에이전트(UA)는 창과 공유되는 다음 값을 유지해야 합니다.

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

5.2.2. MouseEvent에 대한 PointerLock 속성 초기화

입력

event, 하나의 MouseEvent

출력

없음

  1. 설정 event.movementX = 0

  2. 설정 event.movementY = 0

5.2.3. mousemove에 대한 PointerLock 속성 설정

입력

event, 하나의 MouseEvent

출력

없음

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

  2. 만약 마지막 마우스 이동이 정의되어 있지 않다면, 다음을 실행

    1. 설정 event.movementX = 0

    2. 설정 event.movementY = 0

  3. 그렇지 않으면,

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

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

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

6. 레거시 이벤트 초기자

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

이 명세의 초기 버전들은 인터페이스에 초기화 메서드(예: initMouseEvent)를 포함하고 있었고, 이 메서드들은 대부분의 경우 이벤트 객체의 모든 속성을 완전히 초기화하지 못하는 긴 매개변수 목록을 필요로 했습니다. 이로 인해 기본 Event 인터페이스에서 파생된 이벤트 인터페이스들은 이벤트를 완전히 초기화하려면 파생된 각 인터페이스의 초기화자를 명시적으로 호출해야 했습니다.

UIEvent의 모든 속성을 초기화하려면 두 개의 초기자 메서드인 initEventinitUIEvent를 호출해야 합니다.

이 표준의 개발에 긴 시간이 소요된 탓에 일부 구현체는 이러한(현재는 사용 중단된) 초기자 메서드들에 의존하게 되었을 수 있습니다. 완전성을 위해 이 부록에서는 이러한 레거시 이벤트 초기자들을 설명합니다.

6.1. 레거시 이벤트 초기자 인터페이스

이 섹션은 정보 제공용입니다

이 섹션은 이 명세의 이전 버전에 도입된 레거시 초기자 메서드들을 문서화합니다.

6.1.1. UIEvent 인터페이스용 초기자

partial interface UIEvent {
  // Deprecated in this specification
  undefined initUIEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional Window? viewArg = null,
    optional long detailArg = 0);
};
initUIEvent(typeArg)
UIEvent 객체의 속성을 초기화합니다. 이 메서드는 initEvent()와 동일한 동작을 합니다.

initUIEvent 메서드는 사용 중단(deprecated)되었지만, 널리 배포된 구현체들과의 하위 호환성을 위해 지원됩니다.

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

6.1.2. KeyboardEvent 인터페이스용 초기자

이 레거시 KeyboardEvent 초기자의 인수 목록에는 다른 초기자들에 있는 detailArg가 포함되어 있지 않고 대신 locale 인수를 추가합니다; 이는 기존 구현체와의 호환성을 위해 이 불일치를 유지할 필요가 있습니다.

partial interface KeyboardEvent {
  // Originally introduced (and deprecated) in this specification
  undefined initKeyboardEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional Window? viewArg = null,
    optional DOMString keyArg = "",
    optional unsigned long locationArg = 0,
    optional boolean ctrlKey = false,
    optional boolean altKey = false,
    optional boolean shiftKey = false,
    optional boolean metaKey = false);
};
initKeyboardEvent(typeArg)
KeyboardEvent 객체의 속성을 초기화합니다. 이 메서드는 UIEvent.initUIEvent()와 동일한 동작을 합니다. detail 값은 정의되지 않은 상태로 남습니다.

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

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.3. CompositionEvent 인터페이스용 초기자

이 레거시 CompositionEvent 초기자의 인수 목록에는 다른 초기자들에 있는 detailArg가 포함되어 있지 않고 대신 locale 인수를 추가합니다; 이는 기존 구현체와의 호환성을 위해 이 불일치를 유지할 필요가 있습니다.

partial interface CompositionEvent {
  // Originally introduced (and deprecated) in this specification
  undefined initCompositionEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional WindowProxy? viewArg = null,
    optional DOMString dataArg = "");
};
initCompositionEvent(typeArg)
CompositionEvent 객체의 속성을 초기화합니다. 이 메서드는 UIEvent.initUIEvent()와 동일한 동작을 합니다. detail 값은 정의되지 않은 상태로 남습니다.

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

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

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

이 절은 비규범적입니다. 다음 속성들은 구식이며 이러한 키보드 이벤트들을 필요로 하는 레거시 소프트웨어와의 호환성이 필요한 user agents에서만 구현되어야 합니다.

이 기능들은 공식적으로 명세된 적이 없으며 현재 브라우저 구현은 중요한 면에서 다양합니다. 많은 양의 레거시 컨텐츠(스크립트 라이브러리 등을 포함)들이 user agent를 감지하고 그에 따라 동작하는 데 의존하고 있으므로, 이러한 레거시 속성 및 이벤트들을 정식화하려는 시도는 수정하거나 활성화할 수 있는 양만큼의 컨텐츠를 깨뜨릴 위험이 있습니다. 또한 이 속성들은 국제적 사용에 적합하지 않으며 접근성 문제를 해결하지도 않습니다.

따라서 이 명세는 키보드 입력을 처리하는 데 일반적으로 사용되는 이벤트 및 속성들을 규범적으로 정의하지 않지만, 이러한 속성과 이벤트들은 레거시 컨텐츠와의 호환성을 위해 user agents에 존재할 수 있습니다. 저자들은 key 속성을 charCodekeyCode 속성들 대신 사용해야 합니다.

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

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

이 절은 비규범적입니다

User agents는 전통적으로 which 속성을 포함하여 KeyboardEventMouseEvent가 보조 이벤트 정보를 기록할 수 있도록 해 왔습니다.

이 명세의 이전 버전들은 공유된 which 속성을 UIEvent에 정의하기보다는, KeyboardEventMouseEvent 에 각각 별도의 which 속성을 정의했습니다.

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

부분적 UIEvent 인터페이스는 UIEvent 인터페이스의 정보 제공용 확장으로, which 속성을 추가합니다.

partial interface UIEvent {
  // The following support legacy user agents
  readonly attribute unsigned long which;
};
which, 타입은 unsigned long, 읽기 전용
MouseEvent의 경우, 이는 button+1과 동일한 값을 포함합니다. KeyboardEvent의 경우, 이는 누른 키와 관련된 수정되지 않은 식별자를 나타내는 시스템 및 구현체 종속의 숫자 코드값을 가집니다. 대부분의 경우, 이 값은 keyCode와 동일합니다.

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

whichUIEvent 에 대해 지원하는 브라우저는 다음 멤버들도 UIEventInit 딕셔너리에 추가해야 합니다.

부분적 UIEventInit 딕셔너리는 UIEventInit 딕셔너리의 정보 제공용 확장으로, 해당 UIEvent 속성을 초기화하기 위한 which 멤버를 추가합니다.

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

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

이 절은 비규범적입니다

키보드에 대한 브라우저 지원은 전통적으로 세 가지 임시 속성, keyCode, charCode, 및 UIEventwhich에 의존해 왔습니다.

이 세 속성 모두 눌린 키의 특정 측면을 나타내는 숫자 코드를 반환합니다: keyCode 는 키 자체의 인덱스입니다. charCode 는 문자 키의 ASCII 값입니다. which 는 사용할 수 있을 경우 문자 값을, 그렇지 않으면 키 인덱스를 반환합니다. 각 속성의 값과 속성 지원 여부는 플랫폼, 키보드 언어와 배열, 사용자 에이전트, 버전, 그리고 심지어 이벤트 유형에 따라 일관성이 없습니다.

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

부분적 KeyboardEvent 인터페이스는 KeyboardEvent 인터페이스의 정보 제공용 확장으로, charCodekeyCode 속성을 추가합니다.

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

partial interface KeyboardEvent {
  // The following support legacy user agents
  readonly attribute unsigned long charCode;
  readonly attribute unsigned long keyCode;
};
charCode, 타입은 unsigned long, 읽기 전용
charCodekeypress 이벤트로부터 생성되는 문자 입력에 대한 문자 값을 보관합니다. 값은 그 문자의 유니코드 참조 번호(코드 포인트)입니다(예: 인쇄 가능한 문자에 대해 event.charCode = event.key.charCodeAt(0)). keydown 또는 keyup 이벤트의 경우, charCode 값은 0입니다.
keyCode, 타입은 unsigned long, 읽기 전용
keyCode 는 누른 키와 연관된 수정되지 않은 식별자를 나타내는 시스템 및 구현체 종속의 숫자 코드를 보관합니다. key 속성과 달리 가능한 값들의 집합이 이 명세에서 규범적으로 정의되어 있지 않습니다. 일반적으로 이 keyCode 값들은 ASCII의 십진수 코드포인트 [RFC20][US-ASCII] 또는 Windows 1252 [WIN1252]의 십진 코드포인트를 나타내는 것이 권장되지만, 적절한 다른 문자 집합에서 가져올 수도 있습니다. 키를 식별할 수 없는 구현체는 키 값으로 0을 사용합니다.

키에 대한 값을 결정하는 방법에 대한 자세한 내용은 § 7.3 Legacy key models를 참조하십시오.

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

keyCodecharCodeKeyboardEvent 에 대해 지원하는 브라우저는 다음 멤버들도 KeyboardEventInit 딕셔너리에 추가해야 합니다.

부분적 KeyboardEventInit 딕셔너리는 KeyboardEventInit 딕셔너리의 정보 제공용 확장으로, 해당 KeyboardEvent 속성을 초기화하기 위한 charCodekeyCode 멤버를 추가합니다.

partial dictionary KeyboardEventInit {
  // The following support legacy user agents
  unsigned long charCode = 0;
  unsigned long keyCode = 0;
};
charCode, 타입은 unsigned long, 기본값 0
charCode 속성을 KeyboardEvent 에 대해 이벤트의 문자에 대한 유니코드 코드 포인트로 초기화합니다.
keyCode, 타입은 unsigned long, 기본값 0
keyCode 속성을 KeyboardEvent 에 대해 누른 키와 연관된 수정되지 않은 식별자를 나타내는 시스템 및 구현체 종속의 숫자 코드로 초기화합니다.

7.3. 레거시 키 모델

이 절은 참고용입니다

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

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

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

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

keypress 이벤트의 keyCode 결정 방법:

7.3.3. 고정 가상 키 코드

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

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

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

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

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

8. 레거시 이벤트 유형

이 섹션은 규범적입니다. 다음 이벤트 유형들은 구식이며 레거시 소프트웨어와의 호환이 필요한 사용자 에이전트에 의해서만 구현되어야 합니다.

이 섹션의 목적은 이러한 기능들의 현재 상태와 규범적 이벤트와의 관계를 문서화하는 것입니다. 이 이벤트들을 지원하는 구현체의 경우, 본 섹션에서 제공되는 정의를 사용하는 것이 권장됩니다.

다음 표는 이 명세에서 더 이상 권장되지 않는 이벤트 유형들에 대한 설명용 요약을 제공합니다. 참고와 완전성을 위해 여기에 포함되어 있습니다.

이벤트 유형 동기 / 비동기 버블링 단계 신뢰할 수 있는 이벤트 대상 유형 DOM 인터페이스 취소 가능 구성됨 기본 동작
DOMActivate 동기 Element UIEvent 없음
DOMFocusIn 동기 Window, Element FocusEvent 아니오 없음
DOMFocusOut 동기 Window, Element FocusEvent 아니오 없음
keypress 동기 Element KeyboardEvent 다양함: 텍스트 합성 시스템 실행; blurfocus 이벤트; DOMActivate 이벤트; 기타 이벤트
textInput 동기 Element TextEvent 정의 참조

8.1. 레거시 UIEvent 이벤트

8.1.1. 레거시 UIEvent 이벤트 유형

8.1.1.1. DOMActivate
유형 DOMActivate
인터페이스 UIEvent
동기 / 비동기 동기
버블링
신뢰 가능한 대상 Element
취소 가능
구성됨
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

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

DOMActivate 이벤트 유형은 참고와 완전성을 위해 이 명세에 정의되어 있지만, 이 명세는 관련된 이벤트 유형click을 대신 사용하도록 이 이벤트 유형의 사용을 더 이상 권장하지 않습니다. 다른 명세들은 하위 호환성을 위해 자체적인 DOMActivate 이벤트 유형을 정의하고 유지할 수 있습니다.

DOMActivateclick는 완전히 동일하지 않지만, 구현된 click 이벤트 동작은 DOMActivate 이벤트 유형이 설계된 중요한 접근성 측면을 포함하도록 발전했으며, 더 널리 구현되어 있습니다. 콘텐츠 작성자는 최대한의 접근성을 보장하기 위해 관련된 mousedown 또는 mouseup 이벤트 유형보다 click 이벤트 유형을 사용하는 것이 권장됩니다.

이벤트 유형 DOMActivate를 지원하는 구현체는 또한 관련된 click 이벤트의 기본 동작으로서 DOMActivate 이벤트를 디스패치해야 합니다. 그러나 이러한 구현체는 주어진 활성화 트리거 발생에 대해 관련된 활성화 동작을 한 번만 시작해야 합니다.

DOMActivate 이벤트 유형은 XForms [XFORMS11]에서 필수로 지원되어야 하며, 이는 호스트 언어 내에서의 구현을 대상으로 합니다. 플러그인 또는 스크립트 기반의 XForms 구현이 이 명세의 네이티브 구현에 설치되는 시나리오에서 해당 네이티브 구현이 DOMActivate 이벤트 유형을 지원하지 않는다면, XForms 사용자 에이전트는 적절한 활성화 트리거에 기반하여 자체적으로 DOMActivate 이벤트를 합성하고 디스패치해야 합니다.

따라서 UI Events에 부합하는 click 이벤트가 사용자 에이전트에 의해 디스패치되면, XForms 사용자 에이전트는 해당 click 이벤트의 기본 동작과 동일한 관련 속성을 가진 DOMActivate 이벤트를 합성할지 여부를 결정해야 합니다. 적절한 단서는 click 이벤트의 isTrusted 여부 또는 해당 이벤트 대상DOMActivate 이벤트 리스너가 등록되어 있는지 여부 등이 될 수 있습니다.

많은 사용자 에이전트에서 DOMActivate의 상호운용 가능한 지원에 의존하지 마십시오. 대신 더 널리 구현되어 접근성 측면에서 더 나은 동작을 제공하는 click 이벤트 유형을 사용해야 합니다.

DOMActivate 이벤트 유형은 이 명세에서 사용 중단(Deprecated)되었습니다.

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
취소 가능 아니오
구성됨
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

사용자 에이전트는 이벤트 대상이 포커스를 받을 때 이 이벤트를 반드시 디스패치해야 합니다. 포커스는 이 이벤트 유형을 디스패치하기 전에 요소에 주어져야 합니다. 이 이벤트 유형은 focus 이벤트 유형 다음에 디스패치되어야 합니다.

DOMFocusIn 이벤트 유형은 참고와 완전성을 위해 이 명세에 정의되어 있지만, 이 명세는 이 이벤트 유형의 사용을 중단하고 관련 이벤트 유형인 focusfocusin을 대신 사용할 것을 권장합니다.

8.2.1.2. DOMFocusOut
유형 DOMFocusOut
인터페이스 FocusEvent
동기 / 비동기 동기
버블링
신뢰 가능한 대상 Window, Element
취소 가능 아니오
구성됨
기본 동작 없음
컨텍스트
(신뢰된 이벤트)

사용자 에이전트는 이벤트 대상이 포커스를 잃을 때 이 이벤트를 반드시 디스패치해야 합니다. 포커스는 이 이벤트 유형을 디스패치하기 전에 요소로부터 제거되어야 합니다. 이 이벤트 유형은 blur 이벤트 유형 다음에 반드시 디스패치되어야 합니다.

DOMFocusOut 이벤트 유형은 참고와 완전성을 위해 이 명세에 정의되어 있지만, 이 명세는 이 이벤트 유형의 사용을 중단하고 관련 이벤트 유형인 blurfocusout을 대신 사용할 것을 권장합니다.

8.2.2. 레거시 FocusEvent 이벤트 순서

다음은 포커스가 요소들 간에 이동할 때의 일반적인 이벤트 순서입니다. 여기에는 더 이상 권장되지 않는 DOMFocusInDOMFocusOut 이벤트가 포함됩니다. 표시된 순서는 초기에는 어떤 요소도 포커스되어 있지 않다고 가정합니다.

이벤트 유형 참고
사용자가 포커스를 이동함
1 focusin 첫 번째 대상 요소가 포커스를 받기 전에 전송
2 focus 첫 번째 대상 요소가 포커스를 받은 후 전송
3 DOMFocusIn 지원되는 경우
사용자가 포커스를 이동함
4 focusout 첫 번째 대상 요소가 포커스를 잃기 전에 전송
5 focusin 두 번째 대상 요소가 포커스를 받기 전에 전송
6 blur 첫 번째 대상 요소가 포커스를 잃은 후 전송
7 DOMFocusOut 지원되는 경우
8 focus 두 번째 대상 요소가 포커스를 받은 후 전송
9 DOMFocusIn 지원되는 경우

8.3. 레거시 KeyboardEvent 이벤트

keypress 이벤트는 전통적으로 키 이벤트를 캡처하고 키 누름의 효과로 DOM이 업데이트되기 전에 이를 처리하는 방법입니다. keypress 이벤트를 사용하는 코드는 일반적으로 레거시 charCode, keyCode, 및 which 속성에 의존합니다.

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

8.3.1. 레거시 KeyboardEvent 이벤트 유형

8.3.1.1. keypress
유형 keypress
인터페이스 KeyboardEvent
동기 / 비동기 동기
버블링
신뢰 가능한 대상 Element
취소 가능
구성됨
기본 동작 다양함: 텍스트 합성 시스템(text composition system) 실행; blurfocus 이벤트; DOMActivate 이벤트; 기타 이벤트
컨텍스트
(신뢰된 이벤트)

만약 사용자 에이전트가 지원한다면, 이 이벤트는 해당 키가 통상적으로 문자 값을 생성하는 경우에만 키가 눌러질 때 디스패치되어야 합니다. keypress 이벤트 유형은 장치에 따라 다르며 입력 장치의 기능과 운영체제에서의 매핑에 의존합니다.

이 이벤트 유형은 키 매핑 이후에 생성되어야 합니다. 입력 방식 편집기(IME)를 사용할 때는 발생되어서는 안 됩니다.

이 이벤트가 취소되면, input 이벤트가 발생하는 것을 방지해야 하며, 또한 기본 동작을 취소해야 합니다.

저자들은 beforeinput 이벤트를 keypress 이벤트 대신 사용하는 것이 권장됩니다.

keypress 이벤트는 전통적으로 물리적 키보다는 문자 값을 감지하는 데 사용되며, 일부 구성에서는 모든 키에서 이용할 수 없을 수 있습니다.

keypress 이벤트 유형은 참고와 완전성을 위해 이 명세에 정의되어 있지만, 이 명세는 이 이벤트 유형의 사용을 중단(Deprecated)합니다. 편집 문맥에서는 작성자가 대신 beforeinput 이벤트를 구독할 수 있습니다.

8.3.2. keypress 이벤트 순서

keypress 이벤트 유형은 동일한 키와 관련된 keydown 이벤트 이후 및 keyup 이벤트 이전에 반드시 디스패치되어야 합니다.

keypress 이벤트 유형은 동일한 키와 관련된 beforeinput 이벤트 이후 및 input 이벤트 이전에 반드시 디스패치되어야 합니다.

keypress 이벤트를 지원하는 사용자 에이전트의 키 이벤트 시퀀스는 다음 예시에서 설명됩니다:

이벤트 유형 KeyboardEvent
key
InputEvent
data
참고
1 keydown "a"
2 beforeinput "a"
3 keypress "a"
이 키와 관련된 모든 기본 동작, 예: DOM에 문자 삽입 등.
4 input
5 keyup "a"

8.4. 레거시 TextEvent 이벤트

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

UI Events 알고리즘의 Text Event 섹션를 참고하십시오. TextEvent 인터페이스와 textInput 이벤트에 관한 내용입니다.

9. 이벤트 확장

이 절은 참고용입니다

9.1. 소개

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

9.2. 커스텀 이벤트

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

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

9.3. 구현체별 확장

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

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

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

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

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

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

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

10. 보안 고려사항

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

이 명세에서 정의된 많은 이벤트 유형은 응답으로 사용자 동작에 따라 디스패치됩니다. 이는 악의적인 이벤트 리스너가 접근할 수 있게 하며 사용자가 일반적으로 기밀로 여길 정보를 얻을 수 있습니다, 예를 들어 양식을 작성할 때 발생할 수 있는 오타, 제출 직전에 선택형 질문에 대한 답을 재고하는 경우에 발생했을 수 있는 내용, 타이핑 속도나 주된 입력 수단. 최악의 경우, 악의적인 이벤트 리스너는 모든 사용자 상호작용을 캡처하고 제3자에게 제출할 수 있으며, 이 수단들은(이 명세에 정의되어 있지 않음) DOM 구현에서 일반적으로 사용 가능한 것들일 수 있습니다, 예를 들어 XMLHttpRequest 인터페이스.

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

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

11. 감사의 글

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

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

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

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

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

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

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

12. 용어집

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

활성화 트리거

활성화 동작(활성화 동작)을 시작하도록 정의된 이벤트입니다.

작성자

이 명세의 문맥에서 author, content author 또는 script author는 이 명세에서 정의한 인터페이스, 이벤트, 이벤트 흐름을 사용하는 스크립트나 기타 실행 가능한 콘텐츠를 작성하는 사람을 말합니다. 자세한 내용은 § 1.2.3 콘텐츠 작성자 및 콘텐츠 적합성 범주를 참조하십시오.

body 요소

HTML 또는 XHTML 문서에서 body 요소는 문서의 내용을 나타냅니다. 올바르게 구성된 HTML 문서에서 body 요소는 루트 요소의 첫 번째 하위 요소입니다.

문자 값

키 값의 문맥에서 문자 값은 문자나 기호와 같은 하나 이상의 유니코드 문자를 나타내는 문자열이거나, 각각이 유효한 유니코드 문자 카테고리 집합에 속하는 문자들의 집합을 나타냅니다. 이 명세에서는 문자 값을 유니코드 문자열(예: U+0020) 또는 동일한 코드 포인트의 글리프 표현(예: " ")으로 표기하며, 이 두 표현을 구별하기 쉽게 색으로 구분합니다.

소스 코드에서는 비그래픽 문자와 같은 일부 키 값이 사용 중인 프로그래밍 언어의 문자 이스케이프 문법을 사용하여 표현될 수 있습니다.

데드 키

데드 키는 그 자체로 문자를 생성하지 않는 키 또는 키 조합이지만, 다른 키와 결합되거나 순차적으로 사용될 때 발음 구별 부호가 있는 문자(예: "ö", "é", "â")와 같은 수정된 문자를 생성하는 키입니다.

기본 동작

기본 동작은 이벤트 객체의 디스패치와 결합하여 구현체가 수행해야 하는 선택적 보조 동작입니다. 각 이벤트 유형 정의와 각 명세는 해당 이벤트 유형에 기본 동작이 있다면 그 기본 동작을 정의합니다. 이벤트 인스턴스는 활성화 트리거(활성화 트리거)와 연관되는 경우와 같이 특정 상황에서 둘 이상의 기본 동작을 가질 수 있습니다. 기본 동작preventDefault() 메서드 호출로 취소될 수 있습니다.

델타

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

사용 중단(deprecated)

사용 중단으로 표시된 기능은 이전 구현이나 명세에 대한 참조로 명세에 포함되지만 선택 사항이며 권장되지 않습니다. 이 명세에서는 기존 또는 진행 중인 대체 기능이 있는 경우에만 기능을 사용 중단해야 합니다. 해당 기능에 대한 지원을 아직 포함하지 않은 구현체는 기존 콘텐츠와의 하위 호환성을 위해 사용 중단된 기능을 구현할 수 있지만, 콘텐츠를 작성하는 작성자는 다른 방법으로 해결할 수 없는 경우를 제외하고 사용 중단된 기능을 사용해서는 안 됩니다. 이 명세를 참조하는 다른 명세는 사용 중단된 기능을 사용해서는 안 되며 대신 해당 기능이 대체되는 기능을 가리켜야 합니다. 이 명세에서 사용 중단으로 표시된 기능은 향후 명세에서 제거될 것으로 예상됩니다.

빈 문자열

빈 문자열은 길이 0DOMString 타입 값, 즉 어떠한 문자도(출력 문자나 제어 문자 모두) 포함하지 않는 문자열입니다.

이벤트 포커스

이벤트 포커스는 문서(이벤트 대상이 속하는 문서) 내의 특정 요소나 다른 이벤트 대상에 대한 수용성과 집중의 특수한 상태입니다. 각 요소는 포커스되었을 때 기능에 따라 다른 동작을 하며, 예를 들어 요소를 활성화할 준비를 하거나(버튼이나 하이퍼링크의 경우), 상태를 전환하거나(체크박스의 경우), 텍스트 입력을 받거나(텍스트 폼 필드의 경우), 선택한 텍스트를 복사하는 등의 동작을 합니다. 자세한 내용은 § 3.3.3 문서 포커스 및 포커스 컨텍스트를 참조하십시오.

이벤트 포커스 링

이벤트 포커스 링은 문서(이벤트 포커스 대상들의) 내에서 순서가 정해진 집합입니다. 호스트 언어는 문서 순서, 포커스 대상별로 정의된 숫자 인덱스, 포커스 대상 간의 명시적 포인터, 또는 여러 모델의 혼합과 같은 대상 순서를 결정하는 하나 이상의 방법을 정의할 수 있습니다. 각 문서는 여러 개의 포커스 링이나 조건부 포커스 링을 가질 수 있습니다. 일반적으로 문서 순서 또는 인덱스된 포커스 링의 경우, 포커스는 마지막 포커스 대상에서 첫 번째 대상으로 "감싸서 돌아갑니다".

이벤트 대상

이벤트 흐름을 사용하여 이벤트가 대상으로 삼는 객체입니다. 이벤트 대상은 target 속성의 값입니다.

이벤트 유형

이벤트 유형은 특정 이름을 가진 이벤트 객체로, 특정 트리거 조건, 속성 및 다른 이벤트 유형과 구별되는 기타 특성들을 정의합니다. 예를 들어 keydown 이벤트 유형은 blur 또는 load 이벤트 유형과 다른 특성을 가집니다. 이벤트 유형은 이벤트 객체의 type 속성으로 노출됩니다. 또한 느슨하게 "event"라고도 불리며, 예를 들어 keydown 이벤트처럼 언급됩니다.

호스트 언어

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

입력기(IME)
입력 방식 편집기

입력 방식 편집기(IME, 프런트 엔드 프로세서라고도 함)은 키 입력과 이데오그램 또는 다른 문자 간의 변환을 수행하는 애플리케이션으로, 일반적으로 사용자 주도 사전 조회를 통해 이루어지며 동아시아 언어(예: 중국어, 일본어, 한국어)에서 자주 사용됩니다. IME는 모바일 장치에서와 같이 사전 기반 단어 완성에도 사용될 수 있습니다. 이 명세에서 IME의 처리에 대해서는 § 4.3.3 Input Method Editors를 참조하십시오. 또한 텍스트 합성 시스템도 참조하십시오.

키 매핑

키 매핑은 특정 키에 키 값을 할당하는 과정이며, 운영 체제와 키보드 레이아웃(예: QWERTY, Dvorak, Spanish, InScript, Chinese 등)을 포함한 여러 요인의 조합의 결과입니다. 또한 모든 수정 키(Shift, Alt 등) 및 데드 키 상태들을 고려한 결과입니다.

키 값

키 값은 특정 상태의 키와 연관된 문자 값 또는 다중 문자 문자열(예: "Enter", "Tab", 또는 "MediaTrackNext")입니다. 모든 키는 문자 값이 있든 없든 키 값을 가집니다. 여기에는 제어 키, 기능 키, 수정 키, 데드 키 및 기타 모든 키가 포함됩니다. 주어진 키의 키 값은 해당 시점의 키 매핑에 따라 달라집니다.

수정 키

수정 키는 키의 일반적인 동작을 변경하며, 예를 들어 다른 대소문자의 문자를 생성하거나(Shift 키처럼), 키가 트리거하는 기능을 변경합니다(Fn 혹은 Alt 키처럼). 수정 키에 대한 더 많은 정보는 § 4.3.1 수정 키를 참고하고, 유효한 수정 키 목록은 Modifier Keys table [UIEvents-Key] 을 참조하십시오.

네임스페이스 URI

네임스페이스 URI는 XML 네임스페이스를 식별하는 URI입니다. 이는 [XML-Names11]에서 네임스페이스 이름(namespace name)이라고 불립니다. 또한 DOM API에서 URI 및 네임스페이스 URI의 처리와 비교에 관해서는 섹션 1.3.2 DOM URIs 및 1.3.3 XML Namespaces를 참조하십시오.

QWERTY

QWERTY(발음 ˈkwɜrti)는 일반적인 키보드 배열로, 문자 키의 윗줄 첫 다섯 글자가 Q, W, E, R, T, Y이기 때문에 붙여진 이름입니다. Dvorak 및 Colemak 등 다른 인기 있는 키보드 배열들도 많이 있으며, 대부분 지역화나 인체공학을 위해 설계되었습니다.

루트 요소

문서의 첫 번째 요소 노드로, 다른 모든 요소들이 그 자식입니다. 문서 요소를 가리킵니다.

텍스트 합성 시스템

입력 방식 편집기(input method editor), 음성 처리기 또는 필기 인식 시스템과 같은 형태의 대체 입력을 해석하고 이를 텍스트로 변환하는 소프트웨어 구성 요소입니다.

유니코드 문자 카테고리

각 유니코드 코드 포인트에 대해 정의된 General Category 값의 부분집합입니다. 이 부분집합에는 문자( Ll, Lm, Lo, Lt, Lu ), 숫자( Nd, Nl, No ), 구두점( Pc, Pd, Pe, Pf, Pi, Po, Ps ) 및 기호( Sc, Sk, Sm, So ) 카테고리 값이 포함됩니다.

초기화되지 않은 값

이벤트가 bubbles 또는 currentTarget과 같은 속성들에 대해 initEvent()로 초기화되기 이전의 값을 말합니다. 이벤트의 초기화되지 않은 값들은 createEvent() 메서드를 사용하여 새 이벤트가 생성된 직후에 적용됩니다.

적합성

문서 관례

적합성 요구사항은 설명적 단언과 RFC 2119 용어를 조합하여 표현합니다. 규범 부분에서 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” 등 주요 단어는 RFC 2119에서 정의된 대로 해석해야 합니다. 다만, 가독성을 위해 이 명세에서는 모든 단어를 대문자로 표기하지 않습니다.

이 명세의 모든 텍스트는 규범적입니다. 단, 명시적으로 참고용으로 표시된 절, 예시, 그리고 주석은 제외됩니다. [RFC2119]

이 명세의 예시는 “예를 들어(for example)”라는 문구로 시작하거나, 또는 class="example"로 규범 텍스트와 구분되어 아래와 같이 표시됩니다:

이것은 참고용 예시입니다.

참고용 주석은 “Note”로 시작하며, class="note"로 규범 텍스트와 구분되어 아래와 같이 표시됩니다:

Note, 이것은 참고용 주석입니다.

적합성 있는 알고리즘

알고리즘 내의 명령형 요구사항(예: "선행 공백 문자를 모두 제거한다" 또는 "false를 반환하고 이 단계를 중단한다")는, 알고리즘을 소개하는 곳에서 사용된 주요 단어("must", "should", "may" 등)의 의미에 따라 해석해야 합니다.

알고리즘이나 특정 단계로 표현된 적합성 요구사항은, 최종 결과가 동등하기만 하면 어떤 방식으로든 구현할 수 있습니다. 특히 이 명세에서 정의된 알고리즘은 이해하기 쉽게 하기 위한 것으로, 성능을 고려한 것이 아닙니다. 구현자는 최적화를 권장합니다.

색인

이 명세에서 정의된 용어

참조로 정의된 용어

참고문헌

규범 참고문헌

[CSS-COLOR-3]
Tantek Çelik; Chris Lilley; David Baron. CSS 색상 모듈 레벨 3. 18 January 2022. REC. URL: https://www.w3.org/TR/css-color-3/
[DOM]
Anne van Kesteren. DOM 표준. Living Standard. URL: https://dom.spec.whatwg.org/
[DOM-Level-3-Core]
Arnaud Le Hors; et al. 문서 객체 모델 (DOM) 레벨 3 코어 명세. 28 September 2021. REC. URL: https://www.w3.org/TR/DOM-Level-3-Core/
[HTML]
Anne van Kesteren; et al. HTML 표준. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 표준. Living Standard. URL: https://infra.spec.whatwg.org/
[POINTEREVENTS4]
Patrick Lauke; Robert Flack. 포인터 이벤트. 11 February 2026. WD. URL: https://www.w3.org/TR/pointerevents4/
[PointerLock]
Mustaq Ahmed; Vincent Scheib. Pointer Lock 2.0. 29 September 2025. WD. URL: https://www.w3.org/TR/pointerlock-2/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[UIEvents-Code]
Travis Leithead; Gary Kacmarcik. UI Events KeyboardEvent 코드 값. 22 April 2025. REC. URL: https://www.w3.org/TR/uievents-code/
[UIEvents-Key]
Travis Leithead; Gary Kacmarcik. UI Events KeyboardEvent key 값. 22 April 2025. REC. URL: https://www.w3.org/TR/uievents-key/
[WebIDL]
Edgar Chen; Timothy Gu. Web IDL 표준. Living Standard. URL: https://webidl.spec.whatwg.org/

참고 참고문헌

[DWW95]
N. Kano. Windows 95 및 Windows NT용 국제 소프트웨어 설계를 위한 핸드북. 1995.
[Editing]
A. Gregor. HTML 편집 API. URL: https://dvcs.w3.org/hg/editing/raw-file/tip/editing.html
[HTML5]
Ian Hickson; et al. HTML5. 2018년 3월 27일. REC. URL: https://www.w3.org/TR/html5/
[Input-Events]
Johannes Wilm. 입력 이벤트 레벨 2. 14 2025년 8월. WD. URL: https://www.w3.org/TR/input-events-2/
[RFC20]
V.G. Cerf. 네트워크 교환을 위한 ASCII 형식. 1969년 10월. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc20
[UAAG20]
James Allan; et al. 사용자 에이전트 접근성 지침 (UAAG) 2.0. 2015년 12월 15일. NOTE. URL: https://www.w3.org/TR/UAAG20/
[UAX15]
Ken Whistler. 유니코드 정규화 형태. 2025년 7월 30일. Unicode Standard Annex #15. URL: https://www.unicode.org/reports/tr15/tr15-57.html
[Unicode]
유니코드 표준. URL: https://www.unicode.org/versions/latest/
[US-ASCII]
문자 부호 집합 - 7비트 미국 표준 정보 교환 코드. 1986.
[WIN1252]
Windows 1252 부호화 문자 집합 - 8비트. URL: https://www.microsoft.com/globaldev/reference/sbcs/1252.htm
[XFORMS11]
John Boyer. XForms 1.1. 2009년 10월 20일. REC. URL: https://www.w3.org/TR/xforms11/
[XML]
Tim Bray; et al. 확장 마크업 언어 (XML) 1.0 (제5판). 2008년 11월 26일. REC. URL: https://www.w3.org/TR/xml/
[XML-Names11]
Tim Bray; et al. XML의 네임스페이스 1.1 (제2판). 2006년 8월 16일. REC. URL: https://www.w3.org/TR/xml-names11/

IDL 색인

[Exposed=Window]
interface UIEvent : Event {
  constructor(DOMString type, optional UIEventInit eventInitDict = {});
  readonly attribute Window? view;
  readonly attribute long detail;
};

dictionary UIEventInit : EventInit {
  Window? view = null;
  long detail = 0;
};

[Exposed=Window]
interface FocusEvent : UIEvent {
  constructor(DOMString type, optional FocusEventInit eventInitDict = {});
  readonly attribute EventTarget? relatedTarget;
};

dictionary FocusEventInit : UIEventInit {
  EventTarget? relatedTarget = null;
};

[Exposed=Window]
interface InputEvent : UIEvent {
  constructor(DOMString type, optional InputEventInit eventInitDict = {});
  readonly attribute USVString? data;
  readonly attribute boolean isComposing;
  readonly attribute DOMString inputType;
};

dictionary InputEventInit : UIEventInit {
  DOMString? data = null;
  boolean isComposing = false;
  DOMString inputType = "";
};

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

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

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

  readonly attribute boolean repeat;
  readonly attribute boolean isComposing;

  boolean getModifierState(DOMString keyArg);
};

dictionary KeyboardEventInit : EventModifierInit {
  DOMString key = "";
  DOMString code = "";
  unsigned long location = 0;
  boolean repeat = false;
  boolean isComposing = false;
};

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

  boolean modifierAltGraph = false;
  boolean modifierCapsLock = false;
  boolean modifierFn = false;
  boolean modifierFnLock = false;
  boolean modifierHyper = false;
  boolean modifierNumLock = false;
  boolean modifierScrollLock = false;
  boolean modifierSuper = false;
  boolean modifierSymbol = false;
  boolean modifierSymbolLock = false;
};

[Exposed=Window]
interface CompositionEvent : UIEvent {
  constructor(DOMString type, optional CompositionEventInit eventInitDict = {});
  readonly attribute USVString data;
};

dictionary CompositionEventInit : UIEventInit {
  DOMString data = "";
};

partial interface UIEvent {
  // Deprecated in this specification
  undefined initUIEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional Window? viewArg = null,
    optional long detailArg = 0);
};

partial interface KeyboardEvent {
  // Originally introduced (and deprecated) in this specification
  undefined initKeyboardEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional Window? viewArg = null,
    optional DOMString keyArg = "",
    optional unsigned long locationArg = 0,
    optional boolean ctrlKey = false,
    optional boolean altKey = false,
    optional boolean shiftKey = false,
    optional boolean metaKey = false);
};

partial interface CompositionEvent {
  // Originally introduced (and deprecated) in this specification
  undefined initCompositionEvent(DOMString typeArg,
    optional boolean bubblesArg = false,
    optional boolean cancelableArg = false,
    optional WindowProxy? viewArg = null,
    optional DOMString dataArg = "");
};

partial interface UIEvent {
  // The following support legacy user agents
  readonly attribute unsigned long which;
};

partial dictionary UIEventInit {
  unsigned long which = 0;
};

partial interface KeyboardEvent {
  // The following support legacy user agents
  readonly attribute unsigned long charCode;
  readonly attribute unsigned long keyCode;
};

partial dictionary KeyboardEventInit {
  // The following support legacy user agents
  unsigned long charCode = 0;
  unsigned long keyCode = 0;
};

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

이슈 색인

UI Events 알고리즘의 텍스트 이벤트 섹션에서 TextEvent 인터페이스와 textInput 이벤트를 참고하세요.
MDN

CompositionEvent/CompositionEvent

In all current engines.

Firefox53+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CompositionEvent/data

In all current engines.

Firefox9+Safari5+Chrome15+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

CompositionEvent

In all current engines.

Firefox9+Safari5+Chrome15+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/blur_event

In all current engines.

Firefox24+Safari3.1+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+

Window/blur_event

In all current engines.

Firefox6+Safari5.1+Chrome5+
Opera12.1+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/compositionend_event

In all current engines.

Firefox9+Safari5+Chrome15+
Opera15+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile14+
MDN

Element/compositionstart_event

In all current engines.

Firefox9+Safari5+Chrome15+
Opera15+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile14+
MDN

Element/compositionupdate_event

In all current engines.

Firefox9+Safari5+Chrome18+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

Element/focus_event

In all current engines.

Firefox24+Safari3.1+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+

Window/focus_event

In all current engines.

Firefox6+Safari5.1+Chrome5+
Opera12.1+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/focusin_event

In all current engines.

Firefox52+Safari5+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/focusout_event

In all current engines.

Firefox52+Safari5+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Element/keydown_event

In all current engines.

Firefox6+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Element/keyup_event

In all current engines.

Firefox6+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

FocusEvent/FocusEvent

In all current engines.

Firefox24+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FocusEvent/relatedTarget

In all current engines.

Firefox24+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FocusEvent

In all current engines.

Firefox24+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

HTMLElement/beforeinput_event

In all current engines.

Firefox87+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

HTMLElement/error_event

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

HTMLElement/input_event

In all current engines.

Firefox6+Safari3.1+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12+
MDN

InputEvent/InputEvent

Firefox31+SafariNoneChrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

InputEvent/inputType

In all current engines.

Firefox66+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

InputEvent/isComposing

In all current engines.

Firefox31+Safari16.4+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

InputEvent

In all current engines.

Firefox31+Safari10.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/KeyboardEvent

In all current engines.

Firefox31+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/altKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent/code

In all current engines.

Firefox38+Safari10.1+Chrome48+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/ctrlKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent/getModifierState

In all current engines.

Firefox15+Safari10.1+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/isComposing

In all current engines.

Firefox31+Safari10.1+Chrome56+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/key

In all current engines.

Firefox23+Safari10.1+Chrome51+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/location

In all current engines.

Firefox15+Safari8+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/metaKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent/repeat

In all current engines.

Firefox28+Safari10.1+Chrome32+
Opera?Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

KeyboardEvent/shiftKey

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

KeyboardEvent

In all current engines.

Firefox1.5+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

UIEvent/UIEvent

In all current engines.

Firefox11+Safari7+Chrome26+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView1+Samsung Internet1.0+Opera Mobile?
MDN

UIEvent/detail

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

UIEvent/view

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

UIEvent

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

Window/load_event

In all current engines.

Firefox1+Safari1.3+Chrome1+
Opera4+Edge79+
Edge (Legacy)12+IE4+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+