입력 이벤트 레벨 1

W3C 중단된 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2023/DISC-input-events-1-20230928/
최신 공개 버전:
https://www.w3.org/TR/input-events-1/
최신 편집자 초안:
https://w3c.github.io/input-events/
히스토리:
https://www.w3.org/standards/history/input-events-1/
커밋 히스토리
편집자:
(초청 전문가)
이전 편집자:
(Microsoft) (2015년 2월 23일까지)
피드백:
GitHub w3c/input-events (풀 리퀘스트, 새 이슈, 오픈 이슈)
레벨별 최신 공개 버전
레벨 1
레벨 2
레벨별 최신 편집자 초안
레벨 1
레벨 2

요약

이 명세는 텍스트 및 관련 입력 이벤트에 대한 확장 기능을 정의하여, 텍스트 편집기 애플리케이션 및 텍스트 입력과 서식을 처리하는 기타 애플리케이션에서 기본 브라우저 동작을 모니터링하고 조작할 수 있도록 합니다. 이 명세는 UI 이벤트 명세 [UI-EVENTS]를 기반으로 합니다.

이 문서의 상태

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

입력 이벤트 레벨 1은 Input Events의 첫 번째 버전입니다 [INPUT-EVENTS].

입력 이벤트 명세를 위한 테스트 스위트구현 보고서는 아직 작업 중입니다.

이 문서는 웹 편집 작업 그룹에서 권고안 트랙을 사용하여 중단된 초안으로 발행되었습니다.

중단된 초안으로 발행된 것은 W3C 및 회원의 지지를 의미하지 않습니다.

중단된 초안으로 발행된 문서는 더 이상 발전하거나 유지될 의도가 없음을 의미합니다. 이 문서를 포기된 작업 이외의 것으로 인용하는 것은 부적절합니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었습니다. W3C공개 특허 공개 목록을 유지합니다. 이 목록에는 그룹 산출물과 관련하여 제출된 특허 공개가 있으며, 특허 공개 방법에 대한 지침도 포함되어 있습니다. 개인이 특정 특허가 필수 청구항을 포함한다고 판단할 경우, W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

이 문서는 2023년 6월 12일 W3C 프로세스 문서를 따릅니다.

1. 소개

이 문서는 편집과 관련된 2가지 이벤트에 대한 확장 사항을 설명합니다 - inputbeforeinput 이벤트로, 이들은 UI 이벤트 명세 [UI-EVENTS]에서 설명되어 있습니다. 이러한 이벤트의 목적은 저자가 편집이 발생하기 전후에 기본 편집 동작을 이해하거나 재정의할 수 있도록 하는 것입니다.

2. 정의

DataTransfer
DataTransfer 객체는 일부 inputtype에 대해 리치텍스트 및 일반 텍스트 데이터를 포함합니다. [HTML]
의도 표현
사용자는 키보드, IME, 음성 또는 유사한 방법을 통해 특정 편집 작업을 실행하고자 하는 의도를 표현할 수 있습니다. 특정 입력 동작은 플랫폼별 관례에 따라 의도와 매핑됩니다.
킬 버퍼

이 정의는 규범적이지 않습니다.

킬 버퍼는 클립보드와는 별도로 리치텍스트 콘텐츠를 메모리에 저장하는 공간으로, 특정 삭제 명령을 통해 삭제된 콘텐츠를 임시로 저장할 수 있습니다. 사용자는 yank 의도를 나타내어 킬 버퍼에 저장된 콘텐츠로 현재 선택 영역을 대체할 수 있습니다.
문자(character)
문자확장된 그래프 클러스터를 의미합니다. [UAX29]

3. 해결된 문제

이 섹션은 규범적이지 않습니다.

웹 기반 텍스트 에디터를 만들기 위해서는 브라우저 코드 외에도 상당한 양의 JavaScript가 필요합니다. 그 이유는 다음과 같습니다:

  1. 브라우저마다 모든 편집 작업을 동일하게 처리하지 않습니다.
  2. 브라우저가 특정 편집 작업을 처리하는 방식에 종종 버그가 있습니다.
  3. 개별 사이트는 특정 편집 작업을 처리하는 방식에 대해 사용자 지정 선호도를 가질 수 있습니다.
  4. 브라우저에서 고급 텍스트 편집 기능 개발은 Extensible Web Manifesto에 명시된 원칙을 따르지 않았으며, 이러한 기능 개발이 웹 개발자 커뮤니티의 요구와 항상 조율되어 이루어진 것은 아닙니다.

이 명세는 웹 개발자가 beforeinput 이벤트를 통해 텍스트 편집과 관련된 모든 사용자 입력에 대한 브라우저 처리 방식을 재정의하고, input 이벤트를 통해 사용자 입력으로 인해 브라우저가 DOM에 변경한 내용을 모니터링할 수 있는 간단한 방법을 제공하여 이러한 문제를 완화하고자 합니다.

4. 사용 사례

이 섹션은 규범적이지 않습니다.

  1. 모든 브라우저에 접근할 수 없는 상황에서 사용자가 텍스트를 굵게 표시할 때 <b> 태그 대신 <strong> 태그를 사용하는 JavaScript 텍스트 에디터를 만들기.
  2. JavaScript가 편집된 텍스트의 변경 사항을 DOM에 렌더링하는 백엔드 데이터 모델과 함께 동작하는 JavaScript 텍스트 에디터 만들기.
  3. JavaScript 에디터에서 일부 리치텍스트 편집만 허용(예: 굵게만 허용, 이탤릭은 허용하지 않음).
  4. 사용자들이 각기 다른 브라우저에서 의도를 표현하는 방식이 다르더라도 JavaScript가 사용자 의도에 따라 DOM 변경 사항을 렌더링하는 협업 에디터 만들기.
  5. 일부 사용자는 텍스트 추가·삭제만 가능하고, 다른 사용자는 특정 서식만 추가·삭제할 수 있는 다양한 사용자 접근 옵션을 가진 JavaScript 에디터 만들기.

5. 입력 이벤트 타입

입력 이벤트는 사용자가 마크업을 편집하려고 시도하기 전(beforeinput 이벤트)과 후(input 이벤트)에 전송됩니다. 여기에는 콘텐츠의 삽입 및 삭제, 서식 변경이 포함됩니다.

입력 이벤트는 디스패치 [UI-EVENTS]되어 편집 호스트 역할을 하는 요소들에서 발생합니다. 여기에는 contenteditable 속성이 설정된 요소, textarea 요소, 그리고 input 요소 중 텍스트 입력이 허용되는 요소가 포함됩니다.

5.1 InputEvent 인터페이스

WebIDLpartial interface InputEvent {
   readonly attribute DataTransfer? dataTransfer;
   sequence<StaticRange> getTargetRanges();
};

partial dictionary InputEventInit {
   DataTransfer? dataTransfer = null;
   sequence<StaticRange> targetRanges = [];
};

InputEventInputEventInit 객체는 [UI-EVENTS]에서 정의되어 있습니다.

inputType, dataTransfertargetRanges 속성은 InputEventInit 객체의 해당 속성을 초기화합니다.

5.1.1 개요

이 섹션은 규범적이지 않습니다.

아래 표는 datadataTransfer 속성에 값이 들어있는 경우와 null인 경우, 그리고 getTargetRanges() 메서드가 inputType에 따라 빈 배열 또는 비어있지 않은 배열을 반환하는 경우를 요약합니다.

편집 호스트 inputType data dataTransfer getTargetRanges()
Contenteditable "insertText", "insertCompositionText", "formatSetBlockTextDirection", "formatSetInlineTextDirection", "formatBackColor", "formatFontColor", "formatFontName", "insertLink" 있음 null 비어있지 않은 배열
Contenteditable "insertFromPaste", "insertFromPasteAsQuotation", "insertFromDrop", "insertReplacementText", "insertFromYank" null 있음 비어있지 않은 배열
<textarea>, <input type="text"> "insertText", "insertCompositionText", "insertFromPaste", "insertFromPasteAsQuotation", "insertFromDrop", "insertReplacementText", "insertFromYank", "formatSetBlockTextDirection", "formatSetInlineTextDirection", "formatBackColor", "formatFontColor", "formatFontName", "insertLink" 있음 null 빈 배열
모든 편집 호스트 "historyUndo", "historyRedo" null null 빈 배열
Contenteditable 나머지 모두 null null 비어있지 않은 배열
<textarea>, <input type="text"> 나머지 모두 null null 빈 배열

5.1.2 속성

beforeinput 이벤트의 취소 가능성은 inputType에 따라 달라집니다.

선택되는 inputType은 사용자의 의도 표현 여부, 편집이 IME 조합 중에 이루어지는지 여부, 그리고 선택 상태에 따라 결정됩니다.

이 명세는 inputType 값을 아래 표의 inputType 열의 값으로 정의합니다.

inputType 사용자의 의도 표현 IME 조합의 일부 beforeinput 취소 가능 선택 상태
"insertText" 입력한 일반 텍스트 삽입 아니오 정의되지 않음 임의
"insertReplacementText" 맞춤법 검사기, 자동 교정 등으로 기존 텍스트 교체 아니오 정의되지 않음 임의
"insertLineBreak" 줄 바꿈 삽입 아니오 정의되지 않음 임의
"insertParagraph" 단락 구분 삽입 아니오 정의되지 않음 임의
"insertOrderedList" 번호 매김 목록 삽입 아니오 임의
"insertUnorderedList" 글머리표 목록 삽입 아니오 임의
"insertHorizontalRule" 수평선 삽입 아니오 임의
"insertFromYank" 현재 선택 영역을 킬 버퍼에 저장된 콘텐츠로 대체 아니오 임의
"insertFromDrop" 드롭으로 DOM에 콘텐츠 삽입 아니오 임의
"insertFromPaste" 붙여넣기 아니오 임의
"insertFromPasteAsQuotation" 인용으로 붙여넣기 아니오 임의
"insertTranspose" 마지막 두 문자 교환 아니오 임의
"insertCompositionText" 현재 조합 문자열 대체 아니오 임의
"insertLink" 링크 삽입 아니오 임의
"deleteWordBackward" 캐럿 위치 바로 앞의 단어 삭제 아니오 정의되지 않음 축소됨
"deleteWordForward" 캐럿 위치 바로 뒤의 단어 삭제 아니오 정의되지 않음 축소됨
"deleteSoftLineBackward" 캐럿 위치에서 가장 가까운 시각적 줄 바꿈 전까지 삭제 아니오 정의되지 않음 축소됨
"deleteSoftLineForward" 캐럿 위치에서 가장 가까운 시각적 줄 바꿈 후까지 삭제 아니오 정의되지 않음 축소됨
"deleteEntireSoftLine" 캐럿 위치 전후의 가장 가까운 시각적 줄 바꿈 사이 전체 삭제 아니오 정의되지 않음 축소됨
"deleteHardLineBackward" 캐럿 위치에서 가장 가까운 블록 요소 또는 br 요소 전까지 삭제 아니오 정의되지 않음 축소됨
"deleteHardLineForward" 캐럿 위치에서 가장 가까운 블록 요소 또는 br 요소 후까지 삭제 아니오 정의되지 않음 축소됨
"deleteByDrag" 드래그로 DOM에서 콘텐츠 제거 아니오 임의
"deleteByCut" 잘라내기의 일환으로 현재 선택 영역 제거 아니오 임의
"deleteContent" 삭제 방향을 지정하지 않고 선택을 삭제하며, 이 의도가 다른 inputType에 포함되지 않은 경우 아니오 정의되지 않음 축소되지 않음
"deleteContentBackward" 캐럿 바로 앞의 콘텐츠를 삭제하며, 이 의도가 다른 inputType에 포함되지 않거나 삭제 후 선택이 시작 위치로 축소되는 경우 아니오 정의되지 않음 임의
"deleteContentForward" 캐럿 바로 뒤의 콘텐츠를 삭제하며, 이 의도가 다른 inputType에 포함되지 않거나 삭제 후 선택이 끝 위치로 축소되는 경우 아니오 정의되지 않음 임의
"historyUndo" 마지막 편집 작업 실행 취소 아니오 임의
"historyRedo" 마지막 취소된 편집 작업 다시 실행 아니오 임의
"formatBold" 굵게 서식 시작 아니오 임의
"formatItalic" 이탤릭 서식 시작 아니오 임의
"formatUnderline" 밑줄 서식 시작 아니오 임의
"formatStrikeThrough" 취소선 서식 시작 아니오 임의
"formatSuperscript" 위 첨자 서식 시작 아니오 임의
"formatSubscript" 아래 첨자 서식 시작 아니오 임의
"formatJustifyFull" 현재 선택 영역 전체 정렬 아니오 임의
"formatJustifyCenter" 현재 선택 영역 가운데 정렬 아니오 임의
"formatJustifyRight" 현재 선택 영역 오른쪽 정렬 아니오 임의
"formatJustifyLeft" 현재 선택 영역 왼쪽 정렬 아니오 임의
"formatIndent" 현재 선택 영역 들여쓰기 아니오 임의
"formatOutdent" 현재 선택 영역 내어쓰기 아니오 임의
"formatRemove" 현재 선택 영역의 모든 서식 제거 아니오 임의
"formatSetBlockTextDirection" 텍스트 블록 방향 설정 아니오 임의
"formatSetInlineTextDirection" 텍스트 인라인 방향 설정 아니오 임의
"formatBackColor" 배경색 변경 아니오 임의
"formatFontColor" 글자색 변경 아니오 임의
"formatFontName" 글꼴 변경 아니오 임의
참고
다른 명세에서 이 정의를 확장할 수 있습니다.
참고
위에서 언급한 inputTypes의 존재는 모든 구현이 이를 모두 지원한다는 의미는 아닙니다. 그러나 특정 브라우저가 DOM 변경을 초래할 수 있는 편집 작업을 지원한다면, 해당 브라우저는 반드시 디스패치 [UI-EVENTS]에 따라 beforeinputinput 이벤트를 발생시켜야 합니다.
참고
선택이 축소된 경우, "deleteContentBackward"는 사용자가 텍스트 노드 내에서 텍스트 삭제를 요청할 때뿐만 아니라 더 복잡한 요소 삭제 또는 문단 병합 의도가 있을 때(캐럿이 텍스트 노드 시작에 있을 때)에도 사용됩니다.
참고
선택이 축소된 경우, "deleteContentForward"는 사용자가 텍스트 노드 내에서 텍스트 삭제를 요청할 때뿐만 아니라 더 복잡한 요소 삭제 또는 문단 병합 의도가 있을 때(캐럿이 텍스트 노드 끝에 있을 때)에도 사용됩니다.
참고

이 참고는 규범적이지 않습니다.

일부 스크립트 및 플랫폼에서는 축소된 선택 상태에서 텍스트 노드 내에서 뒤로 삭제할 때 전체 그래프 클러스터 [UAX29] 대신 코드 포인트 [INFRA] 하나만 삭제하는 경우가 있습니다. getTargetRanges() 메서드를 통해 브라우저가 기본적으로 텍스트 노드 내에서 삭제할 코드 포인트 [INFRA] 개수를 알 수 있습니다.
참고

이 참고는 규범적이지 않습니다.

일부 스크립트 및 플랫폼에서는 축소된 선택 상태에서 텍스트 노드 내에서 앞으로 삭제할 때 그래프 클러스터 [UAX29] 전체를 삭제하며, 코드 포인트 [INFRA] 하나만 삭제하지 않을 수도 있습니다. getTargetRanges() 메서드를 통해 브라우저가 텍스트 노드 내에서 기본적으로 삭제할 코드 포인트 [INFRA] 개수를 알 수 있습니다.

data 속성에는 문서에 추가될 평문 데이터 정보가 저장됩니다.

inputType 편집 호스트 data
"insertText" 또는 "insertCompositionText" 임의 삽입될 평문 문자열
"insertFromPaste", "insertFromPasteAsQuotation", "insertFromDrop", "insertTranspose", "insertReplacementText" 또는 "insertFromYank" input 또는 textarea 삽입될 평문 문자열
"formatSetInlineTextDirection" 또는 "formatSetBlockTextDirection" 임의 "ltr", "rtl", "auto" 또는 "null"
"formatBackColor" 또는 "formatFontColor" 임의 제안된 색상의 CSS 컴포넌트 값 직렬화 문자열 [CSSOM]
"formatFontName" 임의 font-family CSS 속성의 제안 값
"insertLink" 임의 제안된 링크의 url
나머지 모두 임의 null

dataTransfer 속성에는 DataTransfer 객체로부터 또는 문서에 추가될 리치텍스트 및 평문 데이터 정보가 저장됩니다(관련 데이터가 있을 경우).

inputType 편집 호스트 dataTransfer
"insertFromPaste", "insertFromPasteAsQuotation", "insertFromDrop", "insertTranspose", "insertReplacementText" 또는 "insertFromYank" contenteditable 미리 채워진 DataTransfer 객체로서:
  1. DataTransfer 객체의 drag data store읽기 전용 모드입니다. [HTML]
  2. DataTransfer 객체의 drag data store item list에는 drag data item type string"text/html"인 항목이 하나 있으며, kindPlain Unicode string이고, 데이터는 클립보드 또는 킬 버퍼에 있는 콘텐츠의 HTML 표현이며, 드롭 또는 추가될 콘텐츠입니다. [HTML]
  3. DataTransfer 객체의 drag data store item list에는 drag data item type string"text/plain"인 항목이 하나 있으며, kindPlain Unicode string이고, 데이터는 붙여넣기, 드롭 등으로 추가될 콘텐츠의 평문 표현입니다. [HTML]
나머지 모두 임의 null

getTargetRanges()는 이벤트가 취소되지 않을 경우 영향을 받는 StaticRanges 배열을 반환합니다.

5.1.3 메서드

inputType 편집 호스트 getTargetRanges()의 응답
"historyUndo" 또는 "historyRedo" 임의 빈 배열
나머지 모두 contenteditable 이벤트와 연결된 StaticRanges [DOM]의 배열
나머지 모두 input 또는 textarea 빈 배열

getTargetRanges()는 inputType이 "historyUndo" 또는 "historyRedo"이거나 편집 호스트가 contenteditable 요소가 아닐 경우 빈 배열을 반환합니다. 그렇지 않은 경우 배열을 반환합니다.

5.2 이벤트 정의

beforeinput
타입 beforeinput
인터페이스 InputEvent
동기/비동기 동기
버블링
신뢰된 타겟 contenteditable 속성이 활성화된 모든 Element
기본 동작 [UI-EVENTS] 상황에 따라 다름: inputType이 "insertCompositionText"인 contentEditable=typing 편집 호스트에는 'DOM 업데이트'. 모든 inputType에 대해 contentEditable="true" 편집 호스트에는 'DOM 요소 업데이트'. 그 외에는 없음.
컨텍스트
(신뢰된 이벤트)

사용자 에이전트는 사용자가 contenteditable 요소에 입력을 시도하면 반드시 이 이벤트를 디스패치 [UI-EVENTS]해야 합니다. 반드시 사용자 에이전트가 DOM을 업데이트한다는 의미는 아닙니다.

사용자 에이전트는 사용자가 입력을 시도하지 않은 이벤트(예: 시스템 이벤트)로 인해 이 이벤트를 디스패치 [UI-EVENTS]해서는 안 됩니다.

input
타입 input
인터페이스 InputEvent
동기/비동기 동기
버블링
신뢰된 타겟 contenteditable 속성이 활성화된 모든 Element
기본 동작 [UI-EVENTS] 없음
컨텍스트
(신뢰된 이벤트)
  • InputEvent.data: 요소에 추가된 데이터를 포함하는 문자열. 해당하지 않는 경우 null일 수 있음.
  • InputEvent.dataTransfer: 요소에 추가 또는 제거된 리치텍스트 데이터. 해당하지 않는 경우 null일 수 있음.

사용자 에이전트 [UI-EVENTS]는 사용자가 문서 내용을 변경하려는 의도를 표현하고 브라우저가 이를 처리하여 DOM이 업데이트된 직후 반드시 이 이벤트를 디스패치 [UI-EVENTS]해야 합니다.

6. 개인정보 및 보안 고려사항

이 섹션은 규범적이지 않습니다.

이 기능은 기존 이벤트(예: keydownkeypress [UI-EVENTS] 이벤트)를 통해 이미 이용 가능한 지문 채취 [fingerprinting-guidance] 기법 외에는 알려진 보안 또는 개인정보 영향이 없습니다.

만약 이 기능이 기존 이벤트를 대체한다면, 사용자의 의도가 기록되고, 사용자가 이 의도를 표현하는 데 사용한 특정 하드웨어 유형이 기록되지 않으므로 지문 채취 [fingerprinting-guidance] 기법의 감소로 이어질 수 있습니다.

7. 감사의 글

Michael Aufreiter, Adrian Bateman, Oliver Buchtala, Robin Berjon, Enrica Casucci, Bo Cupp, Domenic Denicola, Emil Eklund, Olivier Forget, Aryeh Gregor, Marijn Haverbeke, Yoshifumi Inoue, Koji Ishii, Gary Kacmarcik, Ian Kilpatrick, Frederico Caldeira Knabben, Takayoshi Kochi, Piotrek Koszuliński, Travis Leithead, Grisha Lyukshin, Miles Maxfield, Chaals McCathie Nevile, Masayuki Nakano, Ryosuke Niwa, Julie Parent, Ben Peters, Florian Rivoal, Morgan Smith, Hallvord R. M. Steen, Johan Sörlin, Cristian Talau, Dave Tapuska, Ojan Vafai, Léonie Watson, Xiaoqian Wu, Chong Zhang, Joanmarie, 그리고 Editing Taskforce의 모든 분들께 의견과 피드백에 감사드립니다.

A. 참고 문헌

A.1 참고용 문헌

[CSSOM]
CSS Object Model (CSSOM). Daniel Glazman; Emilio Cobos Álvarez. W3C. 2021년 8월 26일. W3C Working Draft. URL: https://www.w3.org/TR/cssom-1/
[DOM]
DOM 현행 표준. Anne van Kesteren. WHATWG. 현행 표준. URL: https://dom.spec.whatwg.org/
[fingerprinting-guidance]
Mitigating Browser Fingerprinting in Web Specifications. Nick Doty. W3C. 2019년 3월 28일. W3C Working Group Note. URL: https://www.w3.org/TR/fingerprinting-guidance/
[HTML]
HTML 현행 표준. Anne van Kesteren; Domenic Denicola; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Infra 현행 표준. Anne van Kesteren; Domenic Denicola. WHATWG. 현행 표준. URL: https://infra.spec.whatwg.org/
[INPUT-EVENTS]
Input Events Level 1. Johannes Wilm; Ben Peters. W3C. 2019년 5월 30일. W3C Working Draft. URL: https://www.w3.org/TR/input-events-1/
[UAX29]
Unicode Text Segmentation. Josh Hadley. Unicode Consortium. 2023년 8월 16일. Unicode Standard Annex #29. URL: https://www.unicode.org/reports/tr29/tr29-43.html
[UI-EVENTS]
UI 이벤트. Gary Kacmarcik; Travis Leithead. W3C. 2023년 9월 15일. W3C Working Draft. URL: https://www.w3.org/TR/uievents/
[WEBIDL]
Web IDL 현행 표준. Edgar Chen; Timothy Gu. WHATWG. 현행 표준. URL: https://webidl.spec.whatwg.org/