DOM

현행 표준 — 마지막 업데이트

참여:
GitHub whatwg/dom (새 이슈, 오픈된 이슈)
Matrix에서 채팅하기
커밋:
GitHub whatwg/dom/commits
이 커밋 기준 스냅샷
@thedomstandard
테스트:
web-platform-tests dom/ (진행 중인 작업)
번역 (비규범적):
일본어
중국어(간체)

개요

DOM은 이벤트, 작업 중단, 노드 트리에 대한 플랫폼 중립적인 모델을 정의합니다.

1. 인프라스트럭처

이 명세는 Infra Standard에 의존합니다. [INFRA]

이 명세에서 사용되는 일부 용어는 Encoding, Selectors, Web IDL, XML, 그리고 Namespaces in XML에서 정의되어 있습니다. [ENCODING] [SELECTORS4] [WEBIDL] [XML] [XML-NAMES]

확장이 필요할 때 DOM 표준은 그에 따라 업데이트할 수 있으며, 또는 새로운 표준을 작성하여 적용 가능한 명세에 대한 제공된 확장성 훅에 연결할 수 있습니다.

1.1. 트리

트리는 유한한 계층 트리 구조입니다. 트리 순서트리의 전위, 깊이 우선 탐색 방식입니다.

트리에 참여하는 객체는 트리 내에서 부모를 가지며, 이는 null이거나 객체입니다. 또한 자식을 가지는데, 이는 객체들의 순서가 있는 집합입니다. 객체 A부모가 객체 B라면, AB자식입니다.

객체의 루트부모가 null이면 자기 자신이고, 그렇지 않으면 부모의 루트입니다. 트리의 루트는 해당 트리참여하는 객체 중 부모가 null인 객체입니다.

객체 A가 객체 B후손이라고 부르려면, AB자식이거나, C자식이면서 CB후손인 경우입니다.

포함 후손은 객체 자신 또는 그의 후손 중 하나입니다.

객체 A가 객체 B조상이라고 부르려면, BA후손인 경우에만 해당합니다.

포함 조상은 객체 자신 또는 그의 조상 중 하나입니다.

객체 A가 객체 B형제이라고 부르려면, BA가 동일한 null이 아닌 부모를 공유해야 합니다.

포함 형제는 객체 자신 또는 그의 형제 중 하나입니다.

객체 A가 객체 B보다 앞선 객체라고 하려면, AB가 동일한 트리에 있고, AB보다 트리 순서상 먼저 나와야 합니다.

객체 A가 객체 B다음 객체라고 하려면, AB가 동일한 트리에 있고, AB보다 트리 순서상 나중에 나와야 합니다.

객체의 첫 번째 자식은 첫 번째 자식이거나 자식이 없으면 null입니다.

객체의 마지막 자식은 마지막 자식이거나 자식이 없으면 null입니다.

객체의 이전 형제는 첫 번째 앞선 형제이거나, 앞선 형제가 없으면 null입니다.

객체의 다음 형제는 첫 번째 다음 형제이거나, 다음 형제가 없으면 null입니다.

객체의 인덱스는 그 객체의 앞선 형제의 개수이며, 없으면 0입니다.

1.2. 순서가 있는 집합

순서가 있는 집합 파서는 문자열 input을 받아 다음 단계들을 수행합니다:

  1. inputTokensASCII 공백 문자로 input을 분할한 결과로 설정합니다.

  2. tokens를 새로운 순서가 있는 집합으로 설정합니다.

  3. inputTokens의 각 token에 대해, tokentokens에 추가합니다.

  4. tokens를 반환합니다.

순서가 있는 집합 직렬화기set을 받아 U+0020 공백 문자로 set을 이어붙여 반환합니다.

1.3. 셀렉터

셀렉터 문자열 범위 매칭을 위해 selectorsnode에 대해 수행할 때, 다음 단계들을 실행합니다:

  1. selectors선택자 구문 분석한 결과를 s로 둡니다. [SELECTORS4]

  2. s가 실패이면, "SyntaxError" DOMExceptionthrow합니다.

  3. node스코핑 루트로 사용하여 snode루트에 대해 트리에 대해 선택자 일치시킨 결과를 반환합니다. [SELECTORS4].

셀렉터 내 네임스페이스 지원은 계획되어 있지 않으며 추가되지 않을 예정입니다.

1.4. 이름 검증

문자열유효한 네임스페이스 접두어입니다 만약 길이가 1 이상이고, ASCII 공백, U+0000 NULL, U+002F (/), 또는 U+003E (>)를 포함하지 않는 경우입니다.

문자열유효한 속성 로컬 이름입니다 만약 길이가 1 이상이고, ASCII 공백, U+0000 NULL, U+002F (/), U+003D (=), 또는 U+003E (>)를 포함하지 않는 경우입니다.

문자열 name유효한 요소 로컬 이름입니다. 다음 단계들이 true를 반환하는 경우입니다:

  1. name길이가 0이면 false를 반환합니다.

  2. name의 0번째 코드 포인트ASCII 알파벳이라면:

    1. nameASCII 공백, U+0000 NULL, U+002F (/), 또는 U+003E (>)가 포함되어 있다면 false를 반환합니다.

    2. true를 반환합니다.

  3. name의 0번째 코드 포인트가 U+003A (:), U+005F (_), 또는 U+0080~U+10FFFF 범위에 포함되지 않는다면 false를 반환합니다.

  4. name의 나머지 코드 포인트들이 있다면, ASCII 알파벳, ASCII 숫자, U+002D (-), U+002E (.), U+003A (:), U+005F (_), 또는 U+0080~U+10FFFF 범위에 포함되지 않는다면 false를 반환합니다.

  5. true를 반환합니다.

이 개념은 DOM API로 요소 로컬 이름을 생성할 때 검증에 사용됩니다. HTML 파서로 생성할 수 있는 모든 이름(첫 번째 코드 포인트ASCII 알파벳인 경우)과 추가적인 가능성을 허용하려는 의도입니다. 추가적인 가능성의 경우, ASCII 범위는 역사적 이유로 제한되지만, ASCII를 넘어서는 것은 모두 허용됩니다.

다음 자바스크립트 호환 정규식은 유효한 요소 로컬 이름의 구현입니다:

/^(?:[A-Za-z][^\0\t\n\f\r\u0020/>]*|[:_\u0080-\u{10FFFF}][A-Za-z0-9-.:_\u0080-\u{10FFFF}]*)$/u

문자열유효한 doctype 이름입니다 만약 ASCII 공백, U+0000 NULL, 또는 U+003E (>)를 포함하지 않는 경우입니다.

빈 문자열도 유효한 doctype 이름입니다.

유효성 검사 및 추출을 위해 namespacequalifiedNamecontext와 함께 수행합니다:

  1. namespace가 빈 문자열이면 null로 설정합니다.

  2. prefix를 null로 설정합니다.

  3. localNamequalifiedName으로 설정합니다.

  4. qualifiedName에 U+003A (:)가 포함되어 있다면:

    1. qualifiedName과 U+003A (:)를 사용하여 strictly split을 실행한 결과를 splitResult로 둡니다.

    2. prefixsplitResult[0]으로 설정합니다.

    3. localNamesplitResult[1]로 설정합니다.

    4. prefix유효한 네임스페이스 접두사가 아니면, "InvalidCharacterError" DOMExceptionthrow합니다.

  5. Assert: prefix는 null이거나 유효한 네임스페이스 접두사입니다.

  6. context가 "attribute"이고 localName유효한 속성 로컬 이름이 아니면, "InvalidCharacterError" DOMExceptionthrow합니다.

  7. context가 "element"이고 localName유효한 요소 로컬 이름이 아니면, "InvalidCharacterError" DOMExceptionthrow합니다.

  8. prefix가 null이 아니고 namespace가 null이면, "NamespaceError" DOMExceptionthrow합니다.

  9. prefix가 "xml"이고 namespaceXML 네임스페이스가 아니면, "NamespaceError" DOMExceptionthrow합니다.

  10. qualifiedName 또는 prefix가 "xmlns"이고 namespaceXMLNS 네임스페이스가 아니면, "NamespaceError" DOMExceptionthrow합니다.

  11. namespaceXMLNS 네임스페이스이고 qualifiedNameprefix 모두 "xmlns"가 아니면, "NamespaceError" DOMExceptionthrow합니다.

  12. (namespace, prefix, localName)을 반환합니다.

이 명세의 다양한 API들은 이전에는 네임스페이스 접두어, 속성 로컬 이름, 요소 로컬 이름, 그리고 doctype 이름을 더 엄격하게 검증했습니다. 이는 다양한 XML 관련 명세와 일치하는 방식이었습니다. (하지만 모든 규칙이 적용된 것은 아니었습니다.)

웹 개발자들에게 불편하게 여겨졌으며, 특히 HTML 파서로 생성할 수 있지만 DOM API로는 생성할 수 없는 이름이 존재하게 되었습니다. 그래서 위에서 설명한 수준으로 검증이 완화되었습니다.

2. 이벤트

2.1. "DOM 이벤트" 소개

웹 플랫폼 전반에서 이벤트는 객체에 디스패치되어 네트워크 활동이나 사용자 상호작용과 같은 발생을 알립니다. 이러한 객체들은 EventTarget 인터페이스를 구현하며, 따라서 이벤트 리스너를 추가해 이벤트를 관찰할 수 있습니다. addEventListener()를 호출합니다:

obj.addEventListener("load", imgFetched)

function imgFetched(ev) {
  // great success}

이벤트 리스너removeEventListener() 메서드를 사용해, 동일한 인자를 전달하여 제거할 수 있습니다.

또는 이벤트 리스너AbortSignaladdEventListener()에 전달하고, 시그널을 소유한 컨트롤러에서 abort()를 호출하여 제거할 수도 있습니다.

이벤트도 객체이며, Event 인터페이스(또는 파생 인터페이스)를 구현합니다. 위 예시에서 ev이벤트입니다. ev이벤트 리스너콜백 (일반적으로 위와 같이 자바스크립트 함수)로 전달됩니다. 이벤트 리스너이벤트type 속성 값 ("load" 위 예시)로 동작합니다. 이벤트target 속성 값은 이벤트디스패치된 객체(obj 위 예시)를 반환합니다.

일반적으로 이벤트는 사용자 에이전트가 사용자 상호작용 또는 작업 완료의 결과로 디스패치하지만, 애플리케이션도 흔히 합성 이벤트(synthetic events)라 불리는 이벤트 디스패치를 직접 할 수 있습니다:

// 적절한 이벤트 리스너 추가
obj.addEventListener("cat", function(e) { process(e.detail) })

// 이벤트 생성 및 디스패치
var event = new CustomEvent("cat", {"detail":{"hazcheeseburger":true}})
obj.dispatchEvent(event)

신호 전달 외에도 이벤트는 때때로 애플리케이션이 작업의 다음 단계를 제어하도록 사용되기도 합니다. 예를 들어 폼 제출 과정에서 type 속성 값이 "submit"인 이벤트디스패치됩니다. 만약 이 이벤트preventDefault() 메서드가 호출되면, 폼 제출이 중단됩니다. 애플리케이션이 합성 이벤트(디스패치된 이벤트)를 통해 이 기능을 사용하려면 dispatchEvent() 메서드의 반환값을 활용할 수 있습니다:

if(obj.dispatchEvent(event)) {
  // 이벤트가 취소되지 않았으니, 이제 뭔가 마법을 실행할 차례}

이벤트디스패치 될 때, 트리에 참여하는 객체(예: 요소)에 도달하면 그 객체의 조상에 등록된 이벤트 리스너에도 도달할 수 있습니다. 즉, 해당 객체의 포함 조상에 등록된 이벤트 리스너capture가 true인 리스너가 트리 순서대로 호출됩니다. 그리고 이벤트bubbles 가 true이면, 해당 객체의 포함 조상 이벤트 리스너capture가 false인 리스너가 이제 역순 트리 순서대로 호출됩니다.

이벤트트리에서 어떻게 동작하는지 예시를 살펴봅시다:

<!doctype html>
<html>
 <head>
  <title>Boring example</title>
 </head>
 <body>
  <p>Hello <span id=x>world</span>!</p>
  <script>
   function test(e) {
     debug(e.target, e.currentTarget, e.eventPhase)
   }
   document.addEventListener("hey", test, {capture: true})
   document.body.addEventListener("hey", test)
   var ev = new Event("hey", {bubbles:true})
   document.getElementById("x").dispatchEvent(ev)
  </script>
 </body>
</html>

debug 함수는 두 번 호출됩니다. 두 번 모두 이벤트target 속성 값은 span 요소입니다. 첫 번째는 currentTarget 속성 값이 document이고, 두 번째는 body 요소입니다. eventPhase 속성 값은 CAPTURING_PHASE 에서 BUBBLING_PHASE로 전환됩니다. 만약 span 요소이벤트 리스너가 등록되어 있었다면, eventPhase 속성 값은 AT_TARGET이었을 것입니다.

2.2. 인터페이스 Event

[Exposed=*]
interface Event {
  constructor(DOMString type, optional EventInit eventInitDict = {});

  readonly attribute DOMString type;
  readonly attribute EventTarget? target;
  readonly attribute EventTarget? srcElement; // legacy
  readonly attribute EventTarget? currentTarget;
  sequence<EventTarget> composedPath();

  const unsigned short NONE = 0;
  const unsigned short CAPTURING_PHASE = 1;
  const unsigned short AT_TARGET = 2;
  const unsigned short BUBBLING_PHASE = 3;
  readonly attribute unsigned short eventPhase;

  undefined stopPropagation();
           attribute boolean cancelBubble; // legacy alias of .stopPropagation()
  undefined stopImmediatePropagation();

  readonly attribute boolean bubbles;
  readonly attribute boolean cancelable;
           attribute boolean returnValue;  // legacy
  undefined preventDefault();
  readonly attribute boolean defaultPrevented;
  readonly attribute boolean composed;

  [LegacyUnforgeable] readonly attribute boolean isTrusted;
  readonly attribute DOMHighResTimeStamp timeStamp;

  undefined initEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false); // legacy
};

dictionary EventInit {
  boolean bubbles = false;
  boolean cancelable = false;
  boolean composed = false;
};

Event 객체는 간단히 이벤트라고 부릅니다. 이는 어떤 일이 발생했음을 알릴 수 있도록 해줍니다. 예를 들어 이미지 다운로드가 완료되었음을 신호할 때 사용됩니다.

잠재적 이벤트 타겟은 null 또는 EventTarget 객체입니다.

이벤트는 연관된 타겟(잠재적 이벤트 타겟)을 가집니다. 별도의 언급이 없으면 null입니다.

이벤트는 연관된 relatedTarget(잠재적 이벤트 타겟)을 가집니다. 별도의 언급이 없으면 null입니다.

다른 명세들에서는 relatedTarget을 정의하기 위해 relatedTarget 속성을 사용합니다. [UIEVENTS]

이벤트는 연관된 터치 타겟 리스트(0개 이상의 잠재적 이벤트 타겟의 리스트)를 가집니다. 별도의 언급이 없으면 빈 리스트입니다.

터치 타겟 리스트TouchEvent 인터페이스와 관련 인터페이스 정의에만 사용됩니다. [TOUCH-EVENTS]

이벤트는 연관된 경로(path)를 가집니다. 경로구조체(struct)의 리스트입니다. 각 구조체호출 타겟(invocation target)(EventTarget 객체), 섀도우 트리 내 호출 타겟(불리언), 섀도우 조정된 타겟(잠재적 이벤트 타겟), relatedTarget(잠재적 이벤트 타겟), 터치 타겟 리스트(잠재적 이벤트 타겟의 리스트), 닫힌 트리의 루트(불리언), 닫힌 트리 내 슬롯(불리언)으로 구성됩니다. 경로는 처음에는 빈 리스트입니다.

event = new Event(type [, eventInitDict])
새로운 event를 반환하며, type 속성 값이 type으로 설정됩니다. eventInitDict 인자를 통해 bubblescancelable 속성을 같은 이름의 객체 멤버로 설정할 수 있습니다.
event . type
event의 타입을 반환합니다. 예: "click", "hashchange", "submit" 등.
event . target
event디스패치된 객체(즉, 타겟)를 반환합니다.
event . currentTarget
현재 실행 중인 이벤트 리스너콜백이 호출되는 객체를 반환합니다.
event . composedPath()
event호출 타겟 객체를 경로에서 반환합니다(리스너가 호출될 객체들). 단, 섀도우 트리에 속한 노드섀도우 루트mode가 "closed"이고 eventcurrentTarget에서 접근할 수 없는 경우는 제외됩니다.
event . eventPhase
event의 단계(phase)를 반환합니다. 값은 NONE, CAPTURING_PHASE, AT_TARGET, BUBBLING_PHASE 중 하나입니다.
event . stopPropagation()
트리 내에서 디스패치될 때, 이 메서드를 호출하면 event가 현재 객체 외 다른 객체에는 도달하지 못하게 합니다.
event . stopImmediatePropagation()
이 메서드를 호출하면 현재 리스너 실행 이후 등록된 이벤트 리스너에는 도달하지 않으며, 트리 내 디스패치 중이면 다른 객체에도 도달하지 않습니다.
event . bubbles
event가 어떻게 초기화되었는지에 따라 true 또는 false를 반환합니다. true라면 event타겟조상을 역순 트리 순서로 거칩니다. 아니면 false입니다.
event . cancelable
event가 어떻게 초기화되었는지에 따라 true 또는 false를 반환합니다. 반환값은 항상 의미가 있진 않지만, true인 경우 event디스패치된 작업의 일부를 preventDefault() 호출로 취소할 수 있음을 나타냅니다.
event . preventDefault()
cancelable 속성 값이 true이고 event의 리스너 실행 중 passive가 false로 설정되어 있으면, event디스패치하게 한 작업에 취소 신호를 보냅니다.
event . defaultPrevented
preventDefault()가 성공적으로 호출되어 취소되었음을 나타내면 true, 아니면 false를 반환합니다.
event . composed
event가 어떻게 초기화되었는지에 따라 true 또는 false를 반환합니다. true라면 eventShadowRoot 노드를 넘어 리스너를 실행하며, 해당 노드가 event루트인 경우에만 해당합니다. 아니면 false입니다.
event . isTrusted
event가 사용자 에이전트에 의해 디스패치되면 true, 그렇지 않으면 false입니다.
event . timeStamp
event의 타임스탬프를 반환하며, 발생 시점을 기준으로 측정된 밀리초 단위 숫자입니다.

type 속성은 초기화된 값을 반환해야 합니다. 이벤트가 생성될 때 이 속성은 빈 문자열로 초기화되어야 합니다.

target getter 단계는 thistarget을 반환합니다.

srcElement getter 단계는 thistarget을 반환합니다.

currentTarget 속성은 초기화된 값을 반환해야 합니다. 이벤트가 생성될 때 이 속성은 null로 초기화되어야 합니다.

composedPath() 메서드 단계는 다음과 같습니다:

  1. composedPath를 빈 리스트로 설정합니다.

  2. paththispath로 설정합니다.

  3. path비어 있다면, composedPath를 반환합니다.

  4. currentTargetthiscurrentTarget 속성 값으로 설정합니다.

  5. 단언: currentTargetEventTarget 객체여야 합니다.

  6. Append currentTargetcomposedPath에 추가합니다.

  7. currentTargetIndex를 0으로 설정합니다.

  8. currentTargetHiddenSubtreeLevel을 0으로 설정합니다.

  9. indexpath크기 − 1로 설정합니다.

  10. index가 0 이상인 동안:

    1. path[index]의 root-of-closed-tree가 true라면, currentTargetHiddenSubtreeLevel을 1 증가시킵니다.

    2. path[index]의 invocation targetcurrentTarget이면, currentTargetIndexindex로 설정하고, break합니다.

    3. path[index]의 slot-in-closed-tree가 true라면, currentTargetHiddenSubtreeLevel을 1 감소시킵니다.

    4. index를 1 감소시킵니다.

  11. currentHiddenLevelmaxHiddenLevelcurrentTargetHiddenSubtreeLevel로 설정합니다.

  12. indexcurrentTargetIndex − 1로 설정합니다.

  13. index가 0 이상인 동안:

    1. path[index]의 root-of-closed-tree가 true라면, currentHiddenLevel을 1 증가시킵니다.

    2. currentHiddenLevelmaxHiddenLevel 이하라면, prepend path[index]의 invocation targetcomposedPath에 앞에 추가합니다.

    3. path[index]의 slot-in-closed-tree가 true라면:

      1. currentHiddenLevel을 1 감소시킵니다.

      2. currentHiddenLevelmaxHiddenLevel 미만이면 maxHiddenLevelcurrentHiddenLevel로 설정합니다.

    4. index를 1 감소시킵니다.

  14. currentHiddenLevelmaxHiddenLevelcurrentTargetHiddenSubtreeLevel로 설정합니다.

  15. indexcurrentTargetIndex + 1로 설정합니다.

  16. indexpath크기 미만인 동안:

    1. path[index]의 slot-in-closed-tree가 true라면, currentHiddenLevel을 1 증가시킵니다.

    2. currentHiddenLevelmaxHiddenLevel 이하라면, append path[index]의 invocation targetcomposedPath에 추가합니다.

    3. path[index]의 root-of-closed-tree가 true라면:

      1. currentHiddenLevel을 1 감소시킵니다.

      2. currentHiddenLevelmaxHiddenLevel 미만이면 maxHiddenLevelcurrentHiddenLevel로 설정합니다.

    4. index를 1 증가시킵니다.

  17. composedPath를 반환합니다.

eventPhase 속성은 초기화된 값을 반환해야 하며, 다음 중 하나여야 합니다:

NONE (숫자값 0)
현재 디스패치되지 않은 이벤트는 이 단계에 있습니다.
CAPTURING_PHASE (숫자값 1)
이벤트디스패치되어 트리에 참여하는 객체에 도달하기 전에 이 단계에 있습니다.
AT_TARGET (숫자값 2)
이벤트디스패치되어 타겟에 도달했을 때 이 단계에 있습니다.
BUBBLING_PHASE (숫자값 3)
이벤트디스패치되어 트리에 참여하는 객체에 도달한 이후 이 단계에 있습니다.

초기에는 속성이 NONE으로 초기화되어야 합니다.


이벤트는 다음과 같은 연관 플래그를 가지며, 모두 처음에는 해제 상태입니다:

stopPropagation() 메서드 단계는 this전파 중단 플래그를 설정하는 것입니다.

cancelBubble getter 단계는 this전파 중단 플래그가 설정되어 있으면 true, 아니면 false를 반환합니다.

cancelBubble setter 단계는, 주어진 값이 true인 경우 this전파 중단 플래그를 설정하고, 아니면 아무 것도 하지 않습니다.

stopImmediatePropagation() 메서드 단계는 this전파 중단 플래그this즉시 전파 중단 플래그를 설정합니다.

bubblescancelable 속성은 초기화된 값을 반환해야 합니다.

취소 플래그 설정이벤트 event를 받아서, eventcancelable 속성이 true이고 event패시브 리스너 플래그가 해제되어 있다면 event취소됨 플래그를 설정하고, 아니면 아무 것도 하지 않습니다.

returnValue getter 단계는 this취소됨 플래그가 설정되어 있으면 false, 아니면 true를 반환합니다.

returnValue setter 단계는, 주어진 값이 false이면 취소 플래그 설정this에 대해 실행하고, 아니면 아무 것도 하지 않습니다.

preventDefault() 메서드 단계는 취소 플래그 설정this에 대해 실행하는 것입니다.

preventDefault()를 호출해도 아무 효과가 없는 상황이 있을 수 있습니다. 사용자 에이전트는 이러한 원인을 개발자 콘솔에 정확하게 기록해 디버깅을 돕는 것이 권장됩니다.

defaultPrevented getter 단계는 this취소됨 플래그가 설정되어 있으면 true, 아니면 false를 반환합니다.

composed getter 단계는 thiscomposed 플래그가 설정되어 있으면 true, 아니면 false를 반환합니다.


isTrusted 속성은 초기화된 값을 반환해야 합니다. 이벤트가 생성될 때 이 속성은 false로 초기화되어야 합니다.

isTrusted이벤트가 사용자 에이전트에 의해 디스패치되었는지(즉 dispatchEvent()를 사용한 경우가 아닌지) 편리하게 알 수 있게 해줍니다. 유일한 레거시 예외는 click()이며, 이는 사용자 에이전트가 이벤트를 디스패치할 때 isTrusted 속성을 false로 초기화하게 만듭니다.

timeStamp 속성은 초기화된 값을 반환해야 합니다.


이벤트 초기화(initialize)event에 대해, type, bubbles, cancelable와 함께 수행하려면 다음 단계들을 실행합니다:

  1. event초기화됨 플래그를 설정합니다.

  2. event전파 중단 플래그, 즉시 전파 중단 플래그, 취소됨 플래그를 해제합니다.

  3. eventisTrusted 속성을 false로 설정합니다.

  4. eventtarget을 null로 설정합니다.

  5. eventtype 속성을 type으로 설정합니다.

  6. eventbubbles 속성을 bubbles로 설정합니다.

  7. eventcancelable 속성을 cancelable로 설정합니다.

initEvent(type, bubbles, cancelable) 메서드 단계는 다음과 같습니다:

  1. this디스패치 플래그가 설정되어 있다면 return 합니다.

  2. 초기화thistype, bubbles, cancelable로 실행합니다.

initEvent()이벤트 생성자와 중복되며 composed 속성을 설정할 수 없습니다. 레거시 콘텐츠 지원을 위해 반드시 구현되어야 합니다.

2.3. Window 인터페이스에 대한 레거시 확장

partial interface Window {
  [Replaceable] readonly attribute (Event or undefined) event; // legacy
};

Window 객체는 연관된 현재 이벤트(current event)(undefined 또는 Event 객체)을 가집니다. 별도 언급이 없으면 undefined입니다.

event getter 단계는 this현재 이벤트를 반환합니다.

웹 개발자는 이벤트 리스너에 전달되는 Event 객체를 사용하는 것이 더 이식성 높은 코드를 작성할 수 있으므로 이를 권장합니다. 이 속성은 worker나 worklet에서는 사용할 수 없으며, 섀도우 트리에서 디스패치된 이벤트에는 정확하지 않습니다.

2.4. 인터페이스 CustomEvent

[Exposed=*]
interface CustomEvent : Event {
  constructor(DOMString type, optional CustomEventInit eventInitDict = {});

  readonly attribute any detail;

  undefined initCustomEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false, optional any detail = null); // legacy
};

dictionary CustomEventInit : EventInit {
  any detail = null;
};

이벤트CustomEvent 인터페이스를 사용해 커스텀 데이터를 전달할 수 있습니다.

event = new CustomEvent(type [, eventInitDict])
Event의 생성자와 유사하게 동작하지만, eventInitDict 인자를 통해 detail 속성도 설정할 수 있습니다.
event . detail
event가 생성될 때 포함된 커스텀 데이터를 반환합니다. 주로 합성 이벤트에서 사용됩니다.

detail 속성은 초기화된 값을 반환해야 합니다.

initCustomEvent(type, bubbles, cancelable, detail) 메서드 단계는 다음과 같습니다:

  1. this디스패치 플래그가 설정되어 있으면 return 합니다.

  2. 초기화thistype, bubbles, cancelable로 실행합니다.

  3. thisdetail 속성을 detail로 설정합니다.

2.5. 이벤트 생성

명세는 모든 또는 일부 이벤트에 대해 이벤트 생성 단계를 정의할 수 있습니다. 이 알고리즘은 event eventEventInit eventInitDict내부 이벤트 생성 단계에서 넘겨받습니다.

이 구조는 초기화용 딕셔너리 멤버와 IDL 속성 간 1:1 대응이 아닌 더 복잡한 구조를 가진 Event 서브클래스에서 사용할 수 있습니다.

Event 인터페이스 또는 Event 인터페이스를 상속한 인터페이스의 생성자가 호출될 때, typeeventInitDict 인자를 받아 다음 단계들을 실행해야 합니다:

  1. event를 이 인터페이스, null, now, eventInitDict내부 이벤트 생성 단계를 실행한 결과로 설정합니다.

  2. eventtype 속성을 type으로 초기화합니다.

  3. event를 반환합니다.

eventInterface를 사용하여 이벤트 생성을 하려면, eventInterfaceEvent이거나 이를 상속한 인터페이스여야 하며, 선택적으로 realm realm을 받아 다음 단계들을 실행합니다:

  1. realm이 주어지지 않았다면 null로 설정합니다.

  2. dictionary를 JavaScript 값 undefined를 eventInterface의 생성자가 받아들이는 딕셔너리 타입으로 변환한 결과로 설정합니다. (이 딕셔너리 타입은 EventInit 또는 이를 상속한 딕셔너리입니다.)

    멤버가 필수일 때는 동작하지 않습니다. whatwg/dom#600 참조.

  3. eventeventInterface, realm, 이벤트가 신호하는 발생 시각, dictionary내부 이벤트 생성 단계를 실행한 결과로 설정합니다.

    macOS에서는 입력 동작 발생 시각이 timestamp 속성을 통해 NSEvent 객체에서 제공됩니다.

  4. eventisTrusted 속성을 true로 초기화합니다.

  5. event를 반환합니다.

이벤트 생성은 단순히 이벤트 발생이 아닌, 다른 명세에서 이벤트를 개별적으로 생성하고 디스패치해야 할 때 사용됩니다. 이 과정은 이벤트의 속성이 올바른 기본값으로 초기화되도록 보장합니다.

내부 이벤트 생성 단계eventInterface, realm, time, dictionary를 받아 다음과 같이 실행됩니다:

  1. eventeventInterface를 사용하여 새 객체를 생성한 결과로 설정합니다. realm이 null이 아니면 해당 realm을 사용하고, 그렇지 않으면 Web IDL에서 정의된 기본 동작을 사용합니다.

    작성 시점 기준 Web IDL은 아직 기본 동작을 정의하지 않았음. whatwg/webidl#135 참조.

  2. event초기화됨 플래그를 설정합니다.

  3. eventtimeStamp 속성을 timeevent관련 글로벌 객체를 이용한 상대 고해상도 근사 시간으로 초기화합니다.

  4. dictionary의 각 멤버 membervalue에 대해, eventidentifiermember인 속성이 있다면 해당 속성을 value로 초기화합니다.

  5. 이벤트 생성 단계eventdictionary로 실행합니다.

  6. event를 반환합니다.

2.6. 이벤트 인터페이스 정의

일반적으로 Event를 상속하는 새로운 인터페이스를 정의할 때는 반드시 WHATWG 또는 W3C WebApps WG 커뮤니티에 피드백을 요청하세요.

CustomEvent 인터페이스를 시작점으로 사용할 수 있습니다. 하지만 init*Event()와 같은 메서드는 생성자와 중복되므로 도입하지 마세요. Event 인터페이스를 상속한 인터페이스 중 이런 메서드를 가진 경우는 오직 역사적 이유 때문입니다.

2.7. 인터페이스 EventTarget

[Exposed=*]
interface EventTarget {
  constructor();

  undefined addEventListener(DOMString type, EventListener? callback, optional (AddEventListenerOptions or boolean) options = {});
  undefined removeEventListener(DOMString type, EventListener? callback, optional (EventListenerOptions or boolean) options = {});
  boolean dispatchEvent(Event event);
};

callback interface EventListener {
  undefined handleEvent(Event event);
};

dictionary EventListenerOptions {
  boolean capture = false;
};

dictionary AddEventListenerOptions : EventListenerOptions {
  boolean passive;
  boolean once = false;
  AbortSignal signal;
};

EventTarget 객체는 어떤 일이 발생했을 때 event디스패치할 수 있는 타겟을 나타냅니다.

EventTarget 객체는 연관된 이벤트 리스너 목록(리스트로, 0개 이상의 이벤트 리스너를 포함)을 가집니다. 초기에는 빈 리스트입니다.

이벤트 리스너 는 특정 event를 관찰하는 데 사용되며 다음으로 구성됩니다:

callbackEventListener 객체이지만, 이벤트 리스너는 위에서 볼 수 있듯 더 넓은 개념입니다.

EventTarget 객체는 또한 연관된 get the parent 알고리즘을 가지며, 이는 event event를 받아 EventTarget 객체를 반환합니다. 별도 언급이 없으면 null을 반환합니다.

노드, 섀도우 루트문서get the parent 알고리즘을 재정의합니다.

EventTarget 객체는 연관된 활성화 동작(activation behavior) 알고리즘을 가질 수 있습니다. 활성화 동작 알고리즘은 event를 받아 디스패치 알고리즘에서 실행됩니다.

이는 사용자 에이전트가 특정 EventTarget 객체(예: area 요소)에 대해 합성 MouseEvent 이벤트type 속성이 click일 때 특정 동작을 수행하기 때문입니다. 웹 호환성 때문에 제거할 수 없었으며, 이제는 활성화를 정의하는 공식적인 방법으로 간주됩니다. [HTML]

활성화 동작을 가진 EventTarget 객체는 추가로 레거시 사전 활성화 동작 알고리즘과 레거시 취소된 활성화 동작 알고리즘 두 개를 모두 가질 수 있습니다.

이 알고리즘은 체크박스 및 라디오 input 요소에만 존재하며, 다른 용도로 사용되어서는 안 됩니다. [HTML]

target = new EventTarget();

새로운 EventTarget 객체를 생성하며, 개발자가 디스패치하고 이벤트를 수신하는 데 사용할 수 있습니다.

target . addEventListener(type, callback [, options])

이벤트 리스너이벤트type 속성값이 type인 경우에 대해 추가합니다. callback 인자는 callback을 설정하며, 이는 이벤트디스패치될 때 호출됩니다.

options 인자는 리스너별 옵션을 설정합니다. 호환성을 위해 이는 불리언일 수 있으며, 이 경우 메서드는 optionscapture로 지정된 값처럼 동작합니다.

만약 optionscapture가 true로 설정되면, callback이벤트eventPhase 속성값이 BUBBLING_PHASE일 때 호출되지 않습니다. false (또는 지정되지 않은 경우)에는 callback이벤트eventPhase 속성값이 CAPTURING_PHASE일 때 호출되지 않습니다. 어느 경우든, callback이벤트eventPhase 속성값이 AT_TARGET일 때 호출됩니다.

만약 optionspassive가 true로 설정되면, callbackpreventDefault()를 호출하여 이벤트를 취소하지 않습니다. 이는 § 2.8 이벤트 리스너 관찰에 설명된 성능 최적화를 가능하게 합니다.

만약 optionsonce가 true로 설정되면, callback은 한 번만 호출되며, 그 후 이벤트 리스너는 제거됩니다.

만약 optionssignalAbortSignal이 전달되면, signal이 중단될 때 이벤트 리스너는 제거됩니다.

해당 이벤트 리스너target이벤트 리스너 목록에 추가되며, 동일한 type, callback, 및 capture를 가진 경우에는 추가되지 않습니다.

target . removeEventListener(type, callback [, options])

target이벤트 리스너 목록에서 동일한 type, callback, options를 가진 이벤트 리스너를 제거합니다.

target . dispatchEvent(event)

합성 이벤트 eventtarget에 디스패치하며, eventcancelable 속성값이 false이거나, preventDefault() 메서드가 호출되지 않은 경우 true를 반환하고, 그렇지 않으면 false를 반환합니다.

options평탄화(flatten)하려면, 다음 단계를 실행합니다:

  1. options가 불리언이면, options를 반환합니다.

  2. options["capture"]를 반환합니다.

options더 평탄화(flatten more)하려면, 다음 단계를 실행합니다:

  1. capture평탄화(flatten) options의 결과로 설정합니다.

  2. once를 false로 설정합니다.

  3. passivesignal을 null로 설정합니다.

  4. options딕셔너리(dictionary)인 경우:

    1. onceoptions["once"]로 설정합니다.

    2. options["passive"] 존재하는 경우, passiveoptions["passive"]로 설정합니다.

    3. options["signal"] 존재하는 경우, signaloptions["signal"]로 설정합니다.

  5. capture, passive, once, signal을 반환합니다.

new EventTarget() 생성자의 단계는 아무것도 하지 않습니다.

다른 곳에서 명시된 기본값 때문에, 반환된 EventTargetget the parent 알고리즘은 null을 반환하며, 활성화 동작, 레거시 사전 활성화 동작, 또는 레거시 취소된 활성화 동작을 가지지 않습니다.

미래에는 사용자 지정 get the parent 알고리즘을 허용할 수도 있습니다. 이것이 귀하의 프로그램에 유용할지 알려주세요. 현재로서는, 모든 작성자가 생성한 EventTarget은 트리 구조에 참여하지 않습니다.

기본 passive 값은 이벤트 타입 typeEventTarget eventTarget이 주어졌을 때 다음과 같이 결정됩니다:

  1. 다음 조건이 모두 참이라면 true를 반환합니다:

  2. false를 반환합니다.

EventTarget 객체 eventTarget이벤트 리스너 listener가 주어졌을 때 이벤트 리스너 추가를 수행하려면 다음 단계를 실행합니다:

  1. 만약 eventTargetServiceWorkerGlobalScope 객체이고, 해당 서비스 워커스크립트 리소스평가된 적 있음 플래그가 설정되어 있고, listenertypetype 속성값 중 하나와 일치한다면, 콘솔에 경고를 출력합니다. [SERVICE-WORKERS]

  2. 만약 listenersignal이 null이 아니고 중단(aborted) 상태라면, 종료합니다.

  3. 만약 listenercallback이 null이라면, 종료합니다.

  4. 만약 listenerpassive가 null이라면, listenertypeeventTarget을 기반으로 기본 passive 값으로 설정합니다.

  5. 만약 eventTarget이벤트 리스너 목록포함하지 않는 경우, 이벤트 리스너 listener추가합니다.

  6. 만약 listenersignal이 null이 아니라면, 다음 중단 단계를 추가합니다:

    1. 이벤트 리스너 제거eventTargetlistener를 사용하여 실행합니다.

이벤트 리스너 추가 개념은 이벤트 핸들러가 동일한 코드 경로를 사용하도록 보장하기 위해 존재합니다. [HTML]

addEventListener(type, callback, options) 메서드 단계는 다음과 같습니다:

  1. capture, passive, once, signal더 평탄화(flattening more) options의 결과로 설정합니다.

  2. 이벤트 리스너 추가this와 다음 속성을 가진 이벤트 리스너로 실행합니다: typetype, callbackcallback, capturecapture, passivepassive, onceonce, signalsignal.

이벤트 리스너 제거EventTarget 객체 eventTarget이벤트 리스너 listener를 사용하여 실행하려면 다음 단계를 수행합니다:

  1. eventTargetServiceWorkerGlobalScope 객체이고, 해당 서비스 워커처리할 이벤트 타입 집합listenertype을 포함한다면, 콘솔에 경고를 출력합니다. [SERVICE-WORKERS]

  2. listener제거됨 플래그를 true로 설정하고, 제거합니다. listenereventTarget이벤트 리스너 목록에서 제거합니다.

HTML 명세에서는 이 기능을 이벤트 핸들러 정의에 사용합니다. [HTML]

모든 이벤트 리스너 제거EventTarget 객체 eventTarget를 사용하여 실행하려면, listener에 대해 eventTarget이벤트 리스너 목록에서 이벤트 리스너 제거를 실행합니다.

HTML 명세에서는 이 기능을 document.open() 정의에 사용합니다. [HTML]

removeEventListener(type, callback, options) 메서드 단계는 다음과 같습니다:

  1. capture평탄화(flattening) options의 결과로 설정합니다.

  2. this이벤트 리스너 목록포함하는 경우, 이벤트 리스너 listener이벤트 리스너 제거를 사용하여 제거합니다.

이벤트 리스너 목록은 동일한 type, callback, capture 값을 가진 여러 이벤트 리스너를 포함하지 않습니다. 이는 이벤트 리스너 추가가 이를 방지하기 때문입니다.

dispatchEvent(event) 메서드의 단계는 다음과 같습니다:

  1. event디스패치 플래그가 설정되어 있거나, 초기화 플래그가 설정되어 있지 않으면, "InvalidStateError" DOMExceptionthrow합니다.

  2. eventisTrusted 속성을 false로 초기화합니다.

  3. event디스패치하고, this로 디스패치한 결과를 반환합니다.

2.8. 이벤트 리스너 관찰

일반적으로 개발자는 이벤트 리스너의 존재가 관찰 가능한 것으로 기대하지 않습니다. 이벤트 리스너의 영향은 콜백에 의해 결정됩니다. 즉, 개발자가 아무런 동작을 하지 않는 이벤트 리스너를 추가하더라도 부작용이 없을 것으로 기대합니다.

불행히도, 일부 이벤트 API는 효율적으로 구현하기 위해 이벤트 리스너를 관찰해야만 하는 방식으로 설계되었습니다. 이는 리스너의 존재를 관찰 가능하게 만들며, 심지어 빈 리스너조차도 응용 프로그램의 동작에 극적인 성능 영향을 미칠 수 있습니다. 예를 들어, 비동기 스크롤링을 차단할 수 있는 터치 및 휠 이벤트가 있습니다. 어떤 경우에는 이벤트가 적어도 하나의 비-패시브(passive) 리스너가 있을 때만 취소 가능(cancelable) 하도록 지정함으로써 이 문제를 완화할 수 있습니다. 예를 들어, 비-패시브(passive) TouchEvent 리스너는 스크롤링을 차단해야 하지만, 모든 리스너가 패시브(passive) 라면, TouchEvent 를 취소 불가능하게 만들어 스크롤링을 병렬로 시작할 수 있게 할 수 있습니다 (즉, preventDefault() 호출을 무시). 따라서 이벤트를 디스패치하는 코드는 비-패시브(passive) 리스너가 없는 것을 관찰하고, 이를 사용하여 디스패치되는 이벤트의 취소 가능(cancelable) 속성을 지울 수 있습니다.

이상적으로는, 새로운 이벤트 API는 이러한 특성을 필요로 하지 않도록 정의되어야 합니다. (whatwg/dom에서 논의에 참여하세요.)

레거시-서비스 워커 fetch 이벤트 리스너 콜백 얻기ServiceWorkerGlobalScope global을 사용하여 실행하려면 다음 단계를 따릅니다. 이 단계는 리스트를 반환하며, EventListener 객체를 포함합니다.

  1. callbacks를 « »로 설정합니다.

  2. global이벤트 리스너 목록listener에 대해:

    1. 만약 listenertype이 "fetch"이고, listener콜백이 null이 아니라면, 추가합니다. listener콜백callbacks에 추가합니다.

  3. callbacks를 반환합니다.

2.9. 이벤트 디스패치

디스패치를 위해 eventtarget에, 선택적으로 legacy target override flag와 선택적으로 legacyOutputDidListenersThrowFlag와 함께 디스패치하려면, 다음 단계들을 실행한다:

  1. event디스패치 플래그를 설정한다.

  2. targetOverridetarget으로 한다. 만약 legacy target override flag가 주어지지 않았다면, 그리고 target연관된 Document로 한다. [HTML]

    legacy target override flag는 HTML에서만 사용되며, targetWindow 객체일 때만 사용된다.

  3. activationTarget를 null로 한다.

  4. relatedTarget리타게팅 eventrelatedTargettarget에 대해 수행한 결과로 한다.

  5. clearTargets를 false로 한다.

  6. 만약 targetrelatedTarget이 아니거나 targeteventrelatedTarget이라면:

    1. touchTargets를 새로운 리스트로 한다.

    2. 각각의 touchTargeteventtouch target list에서, append한다. 리타게팅 touchTargettarget에 대해 수행한 결과를 touchTargets에 추가한다.

    3. 이벤트 경로에 추가한다. event, target, targetOverride, relatedTarget, touchTargets, 그리고 false를 사용한다.

    4. isActivationEvent를 true로 한다. 만약 eventMouseEvent 객체이고 eventtype 속성이 "click"이면, 아니면 false로 한다.

    5. 만약 isActivationEvent가 true이고 targetactivation behavior를 가진다면, activationTargettarget으로 한다.

    6. slottabletarget으로 한다. 만약 target슬로터블 이고 할당됨이라면, 아니면 null로 한다.

    7. slot-in-closed-tree를 false로 한다.

    8. parenttargetget the parentevent로 호출한 결과로 한다.

    9. parent가 null이 아닐 때까지 반복한다:

      1. slottable이 null이 아니라면:

        1. 단언: parent슬롯이다.

        2. slottable를 null로 한다.

        3. 만약 parent루트섀도 루트이고 mode가 "closed"라면, slot-in-closed-tree를 true로 한다.

      2. parent슬로터블이고 할당됨이라면, slottableparent로 한다.

      3. relatedTarget리타게팅 eventrelatedTargetparent에 대해 수행한 결과로 한다.

      4. touchTargets를 새로운 리스트로 한다.

      5. 각각의 touchTargeteventtouch target list에서, append한다. 리타게팅 touchTargetparent에 대해 수행한 결과를 touchTargets에 추가한다.

      6. parentWindow 객체이거나, parent노드이고 target루트섀도 포함 포괄 조상 이라면:

        1. isActivationEvent가 true이고, eventbubbles 속성이 true이고, activationTarget이 null이고, parentactivation behavior를 가진다면, activationTargetparent로 한다.

        2. 이벤트 경로에 추가한다. event, parent, null, relatedTarget, touchTargets, 그리고 slot-in-closed-tree를 사용한다.

      7. 그렇지 않고 parentrelatedTarget이라면, parent를 null로 한다.

      8. 그 밖의 경우:

        1. targetparent로 한다.

        2. isActivationEvent가 true이고, activationTarget이 null이고, targetactivation behavior를 가진다면, activationTargettarget으로 한다.

        3. 이벤트 경로에 추가한다. event, parent, target, relatedTarget, touchTargets, 그리고 slot-in-closed-tree를 사용한다.

      9. parent가 null이 아니라면, parentparentget the parentevent로 호출한 결과로 한다.

      10. slot-in-closed-tree를 false로 한다.

    10. clearTargetsStructevent경로에서 shadow-adjusted target이 null이 아닌 마지막 구조체로 한다.

    11. 만약 clearTargetsStructshadow-adjusted target, clearTargetsStructrelatedTarget, 또는 EventTarget 객체가 clearTargetsStructtouch target list에 있고, 노드이며 루트섀도 루트라면, clearTargets를 true로 한다.

    12. activationTarget이 null이 아니고 activationTargetlegacy-pre-activation behavior를 가진다면, activationTargetlegacy-pre-activation behavior를 실행한다.

    13. 각각의 structevent경로에서, 역순으로:

      1. structshadow-adjusted target 이 null이 아니라면, eventeventPhase 속성을 AT_TARGET으로 설정한다.

      2. 그 밖의 경우, eventeventPhase 속성을 CAPTURING_PHASE로 설정한다.

      3. Invokestruct, event, "capturing", 그리고 legacyOutputDidListenersThrowFlag가 주어졌다면 그것과 함께 호출한다.

    14. 각각의 structevent경로에서:

      1. structshadow-adjusted target 이 null이 아니라면, eventeventPhase 속성을 AT_TARGET으로 설정한다.

      2. 그 밖의 경우:

        1. eventbubbles 속성이 false라면, continue한다.

        2. eventeventPhase 속성을 BUBBLING_PHASE로 설정한다.

      3. Invokestruct, event, "bubbling", 그리고 legacyOutputDidListenersThrowFlag가 주어졌다면 그것과 함께 호출한다.

  7. eventeventPhase 속성을 NONE로 설정한다.

  8. eventcurrentTarget 속성을 null로 설정한다.

  9. event경로를 빈 리스트로 한다.

  10. event디스패치 플래그, stop propagation 플래그, 그리고 stop immediate propagation 플래그를 해제한다.

  11. clearTargets가 true라면:

    1. eventtarget을 null로 한다.

    2. eventrelatedTarget을 null로 한다.

    3. eventtouch target list를 빈 리스트로 한다.

  12. activationTarget이 null이 아니라면:

    1. eventcanceled 플래그가 해제되어 있다면, activationTargetactivation behaviorevent와 함께 실행한다.

    2. 그 밖의 경우, activationTargetlegacy-canceled-activation behavior를 가진다면, activationTargetlegacy-canceled-activation behavior를 실행한다.

  13. eventcanceled 플래그가 설정되어 있다면 false를 반환하고, 아니면 true를 반환한다.

이벤트 경로에 추가하려면, event, invocationTarget, shadowAdjustedTarget, relatedTarget, touchTargets, 그리고 slot-in-closed-tree가 주어졌을 때, 다음 단계들을 실행한다:

  1. invocationTargetInShadowTree를 false로 한다.

  2. invocationTarget노드이고 그 루트섀도 루트라면, invocationTargetInShadowTree를 true로 한다.

  3. root-of-closed-tree를 false로 한다.

  4. invocationTarget섀도 루트이고 mode 가 "closed"라면, root-of-closed-tree를 true로 한다.

  5. Append를 사용하여 새로운 structevent경로에 추가한다. 이 struct의 invocation targetinvocationTarget, invocation-target-in-shadow-treeinvocationTargetInShadowTree, shadow-adjusted targetshadowAdjustedTarget, relatedTargetrelatedTarget, touch target listtouchTargets, root-of-closed-treeroot-of-closed-tree, 그리고 slot-in-closed-treeslot-in-closed-tree이다.

invoke를 위해, struct, event, phase, 그리고 선택적으로 legacyOutputDidListenersThrowFlag가 주어졌을 때, 다음 단계들을 실행한다:

  1. eventtargetshadow-adjusted target으로 설정한다. 이 값은 event경로에서 struct 또는 그 이전의 structshadow-adjusted target이 null이 아닌 마지막 struct의 값이다.

  2. eventrelatedTargetstructrelatedTarget으로 설정한다.

  3. eventtouch target liststructtouch target list로 설정한다.

  4. eventstop propagation 플래그가 설정되어 있다면, return한다.

  5. eventcurrentTarget 속성을 structinvocation target으로 초기화한다.

  6. listenersclone하여 eventcurrentTarget 속성 값의 event listener list를 복제한다.

    이렇게 하면 이 시점 이후에 추가된 event listener가 실행되지 않는다. 단, 삭제는 removed 필드로 인해 영향을 준다.

  7. invocationTargetInShadowTreestructinvocation-target-in-shadow-tree로 한다.

  8. foundinner invokeevent, listeners, phase, invocationTargetInShadowTree, 그리고 legacyOutputDidListenersThrowFlag가 주어졌다면 그것과 함께 실행한 결과로 한다.

  9. found가 false이고 eventisTrusted 속성이 true라면:

    1. originalEventTypeeventtype 속성 값으로 한다.

    2. eventtype 속성 값이 아래 표의 첫 번째 열에 있는 문자열과 일치하면, eventtype 속성 값을 같은 행의 두 번째 열의 문자열로 설정하고, 아니면 return한다.

      이벤트 타입 레거시 이벤트 타입
      "animationend" "webkitAnimationEnd"
      "animationiteration" "webkitAnimationIteration"
      "animationstart" "webkitAnimationStart"
      "transitionend" "webkitTransitionEnd"
    3. inner invokeevent, listeners, phase, invocationTargetInShadowTree, 그리고 legacyOutputDidListenersThrowFlag가 주어졌다면 그것과 함께 실행한다.

    4. eventtype 속성 값을 originalEventType로 설정한다.

inner invoke를 위해, event, listeners, phase, invocationTargetInShadowTree, 그리고 선택적으로 legacyOutputDidListenersThrowFlag가 주어졌을 때, 다음 단계들을 실행한다:

  1. found를 false로 한다.

  2. 각각의 listenerlisteners에서, 그 removed가 false인 경우에 대해:

    1. eventtype 속성 값이 listenertype과 다르면, continue한다.

    2. found를 true로 한다.

    3. phase가 "capturing"이고 listenercapture가 false라면, continue한다.

    4. phase가 "bubbling"이고 listenercapture가 true라면, continue한다.

    5. listeneronce가 true라면, remove an event listenereventcurrentTarget 속성 값과 listener로 실행한다.

    6. globallistenercallbackassociated realmglobal object로 한다.

    7. currentEvent를 undefined로 한다.

    8. globalWindow 객체라면:

      1. currentEventglobalcurrent event로 한다.

      2. invocationTargetInShadowTree가 false라면, globalcurrent eventevent로 설정한다.

    9. listenerpassive가 true라면, eventin passive listener flag를 설정한다.

    10. globalWindow 객체라면, 이벤트 리스너의 타이밍 정보 기록eventlistener로 실행한다.

    11. 사용자 객체의 operation 호출listenercallback, "handleEvent", « event », 그리고 eventcurrentTarget 속성 값으로 실행한다. 만약 예외 exception이 발생하면:

      1. 예외 보고exceptionlistenercallback의 해당 JavaScript 객체의 associated realmglobal object로 실행한다.

      2. legacyOutputDidListenersThrowFlag가 주어졌다면 설정한다.

        legacyOutputDidListenersThrowFlag는 Indexed Database API에서만 사용된다. [INDEXEDDB]

    12. eventin passive listener flag를 해제한다.

    13. globalWindow 객체라면, globalcurrent eventcurrentEvent로 설정한다.

    14. eventstop immediate propagation flag가 설정되어 있다면, break한다.

  3. found를 반환한다.

2.10. 이벤트 발생

이벤트 발생을 위해 e라는 이름의 이벤트를 target에서, 선택적으로 eventConstructor를 사용하여, IDL 속성 초기화 방법의 설명과 legacy target override flag와 함께, 다음 단계들을 실행한다:

  1. eventConstructor가 주어지지 않았다면, eventConstructorEvent로 한다.

  2. event이벤트 생성eventConstructortarget관련 realm에서 실행한 결과로 한다.

  3. eventtype 속성을 e로 초기화한다.

  4. 이 알고리즘 호출에서 설명된 대로 event의 다른 IDL 속성들도 초기화한다.

    이렇게 하면 isTrusted 속성을 false로 설정할 수도 있다.

  5. 디스패치eventtarget에 대해 실행한 결과를 반환한다. legacy target override flag가 설정되어 있다면 함께 사용한다.

DOM에서 fire는 생성, 초기화, 그리고 디스패치를 의미한다. 이벤트 발생은 이 과정을 더 쉽게 기술할 수 있게 해준다.

이벤트bubbles 또는 cancelable 속성을 초기화해야 한다면, "submit이라는 이름의 이벤트를 target에서 발생시키고, cancelable 속성을 true로 초기화한다"고 쓸 수 있다.

또는, 커스텀 생성자가 필요할 때는, "click이라는 이름의 이벤트를 target에서 MouseEvent 생성자를 사용하여 발생시키고, detail 속성을 1로 초기화한다"고 쓸 수 있다.

가끔 반환값이 중요할 때가 있다:

  1. doAction이벤트 발생like라는 이름으로 target에서 실행한 결과로 한다.

  2. doAction이 true라면 …

2.11. 동작과 발생의 차이

이벤트는 동작이 아니라 발생을 의미한다. 다시 말해, 알고리즘에서의 알림을 나타내며, 그 알고리즘의 향후 진행에 영향을 줄 수 있다 (예: preventDefault() 호출). 이벤트는 어떤 알고리즘을 시작시키는 동작이나 트리거로 사용되어서는 안 된다. 그것이 이벤트의 목적이 아니다.

이 부분을 명확히 하는 이유는 이전 DOM 버전에서는 이벤트에 "기본 동작" 개념이 있었기 때문에 오해가 많았다. 이벤트는 동작을 나타내거나 유발하지 않으며, 진행 중인 동작에만 영향을 줄 수 있다.

3. 진행 중인 작업 중단

프라미스에는 내장된 중단 메커니즘이 없지만, 이를 사용하는 많은 API는 중단 의미론을 필요로 한다. AbortControllerabort() 메서드를 제공하여 해당 AbortSignal 객체의 상태를 토글함으로써 이러한 요구를 지원한다. 중단을 지원하고자 하는 API는 AbortSignal 객체를 받아 그 상태를 참고하여 동작을 결정할 수 있다.

AbortController 를 사용하는 API는 abort() 호출 시, 해결되지 않은 프라미스를 AbortSignal중단 이유로 reject하는 것이 권장된다.

가상의 doAmazingness({ ... }) 메서드는 중단을 지원하기 위해 AbortSignal 객체를 다음과 같이 받을 수 있다:

const controller = new AbortController();
const signal = controller.signal;

startSpinner();

doAmazingness({ ..., signal })
    .then(result => ...)
    .catch(err => {
    if (err.name == 'AbortError') return;
    showUserErrorMessage();
    })
    .then(() => stopSpinner());

// …

controller.abort();

doAmazingness는 다음과 같이 구현할 수 있다:

function doAmazingness({signal}) {
    return new Promise((resolve, reject) => {
    signal.throwIfAborted();

    // 놀라운 작업을 시작하고, 완료 시 resolve(result)를 호출한다.
    // 또한, 시그널을 감시한다:
    signal.addEventListener('abort', () => {
        // 놀라운 작업을 중단하고:
        reject(signal.reason);
    });
    });
}

프라미스를 반환하지 않는 API는 동등하게 반응하거나 AbortSignal중단 이유를 노출하지 않을 수도 있다. addEventListener() 는 후자의 예시이다.

더 세밀한 제어가 필요한 API는 AbortControllerAbortSignal 객체를 필요에 따라 확장할 수 있다.

3.1. 인터페이스 AbortController

[Exposed=*]
interface AbortController {
    constructor();

    [SameObject] readonly attribute AbortSignal signal;

    undefined abort(optional any reason);
};
controller = new AbortController()
새로운 controller를 반환하며, 그 signal 은 새로 생성된 AbortSignal 객체로 설정된다.
controller . signal
이 객체와 연관된 AbortSignal 객체를 반환한다.
controller . abort(reason)
이 메서드를 호출하면 reason이 이 객체의 AbortSignal중단 이유에 저장되고, 관련 작업이 중단되어야 함을 관찰자에게 알린다. reason이 undefined라면, "AbortError" DOMException 이 저장된다.

AbortController 객체는 signal (즉, AbortSignal 객체)을 가진다.

new AbortController() 생성자 단계는 다음과 같다:

  1. signal을 새로운 AbortSignal 객체로 한다.

  2. thissignalsignal로 설정한다.

signal getter 단계는 thissignal을 반환한다.

abort(reason) 메서드 단계는 signal abortthisreason으로 실행한다(주어졌을 경우).

signal abortAbortController controller와 선택적 reason으로 실행하려면, signal abortcontrollersignalreason으로 실행한다(주어졌을 경우).

3.2. 인터페이스 AbortSignal

[Exposed=*]
interface AbortSignal : EventTarget {
  [NewObject] static AbortSignal abort(optional any reason);
  [Exposed=(Window,Worker), NewObject] static AbortSignal timeout([EnforceRange] unsigned long long milliseconds);
  [NewObject] static AbortSignal _any(sequence<AbortSignal> signals);

  readonly attribute boolean aborted;
  readonly attribute any reason;
  undefined throwIfAborted();

  attribute EventHandler onabort;
};
AbortSignal . abort(reason)
AbortSignal 인스턴스를 반환하며, 중단 이유reason으로 설정된다(정의되지 않은 경우 제외); 그렇지 않으면 "AbortError" DOMException이 설정된다.
AbortSignal . any(signals)
AbortSignal 인스턴스를 반환하며, signals 중 하나라도 중단되면 해당 인스턴스도 중단된다. 중단 이유는 중단을 유발한 signals 중 하나의 이유로 설정된다.
AbortSignal . timeout(milliseconds)
AbortSignal 인스턴스를 반환하며, milliseconds 밀리초 후 중단된다. 중단 이유는 "TimeoutError" DOMException으로 설정된다.
signal . aborted
signalAbortController 가 중단을 알렸으면 true, 아니면 false를 반환한다.
signal . reason
signal중단 이유를 반환한다.
signal . throwIfAborted()
signal중단 이유를 던진다. signalAbortController 가 중단을 알렸을 때만 동작하며, 그렇지 않으면 아무 것도 하지 않는다.

AbortSignal 객체는 연관된 중단 이유(JavaScript 값)를 가지며, 초기값은 undefined이다.

AbortSignal 객체는 연관된 중단 알고리즘(중단될 때 실행될 알고리즘의 집합)을 가지며, 초기에는 비어 있다.

중단 알고리즘은 복잡한 요구사항을 가진 API가 abort()에 합리적으로 반응할 수 있게 해준다. 예를 들어, 특정 API의 중단 이유는 서비스 워커와 같은 스레드 간 환경으로 전파되어야 할 수 있다.

AbortSignal 객체는 의존적인(불리언 값) 속성을 가지며, 초기값은 false이다.

AbortSignal 객체는 연관된 소스 신호(객체의 중단된 상태에 의존하는 AbortSignal 객체의 약한 집합)를 가지며, 초기에는 비어 있다.

AbortSignal 객체는 연관된 의존 신호(객체의 중단된 상태에 의존하는 AbortSignal 객체의 약한 집합)를 가지며, 초기에는 비어 있다.


정적 abort(reason) 메서드 단계는 다음과 같다:

  1. signal을 새로운 AbortSignal 객체로 한다.

  2. signal중단 이유reason이 주어졌으면 그것으로 설정하고, 그렇지 않으면 새로운 "AbortError" DOMException으로 설정한다.

  3. signal을 반환한다.

정적 timeout(milliseconds) 메서드 단계는 다음과 같다:

  1. signal을 새로운 AbortSignal 객체로 한다.

  2. globalsignal관련 전역 객체로 한다.

  3. 타임아웃 후 단계 실행global, "AbortSignal-timeout", milliseconds, 그리고 다음 단계와 함께 실행한다:

    1. 전역 태스크 큐에 추가타이머 태스크 소스global과 함께 실행하여, 중단 신호signal과 새로운 "TimeoutError" DOMException으로 보낸다.

    이 타임아웃 기간 동안, signalabort 이벤트에 대한 이벤트 리스너가 등록되어 있다면, global에서 signal로의 강한 참조가 있어야 한다.

  4. signal을 반환한다.

정적 any(signals) 메서드 단계는 의존적인 중단 신호 생성signals로부터 AbortSignal현재 realm을 사용하여 실행한 결과를 반환하는 것이다.

aborted getter 단계는 this중단되었다면 true를, 그렇지 않으면 false를 반환하는 것이다.

reason getter 단계는 this중단 이유를 반환하는 것이다.

throwIfAborted() 메서드 단계는 this중단되었다면 this중단 이유를 던지는 것이다.

이 메서드는 AbortSignal을 받는 함수가 AbortSignal을 다른 메서드에 전달하는 대신 특정 체크포인트에서 예외를 던지거나(또는 거부된 프라미스를 반환) 싶을 때 주로 유용하다. 예를 들어, 다음 함수는 조건 폴링 시도 사이에 중단을 허용한다. 이는 실제 비동기 작업(즉, await func())이 AbortSignal을 받지 않더라도 폴링 프로세스를 중단할 기회를 제공한다.

async function waitForCondition(func, targetValue, { signal } = {}) {
          while (true) {
            signal?.throwIfAborted();
        
            const result = await func();
            if (result === targetValue) {
              return;
            }
          }
        }
        

onabort 속성은 onabort 이벤트 핸들러에 대한 이벤트 핸들러 IDL 속성이며, 이벤트 핸들러 이벤트 타입abort이다.

AbortSignal 객체의 변경은 해당 AbortController 객체의 의도를 나타내지만, AbortSignal 객체를 관찰하는 API는 이를 무시할 수 있다. 예를 들어, 작업이 이미 완료된 경우이다.


AbortSignal 객체는 그 중단 이유가 undefined가 아닐 때 중단된 것이다.

알고리즘 algorithmAbortSignal 객체 signal추가하려면:

  1. signal중단되었다면, 반환한다.

  2. algorithmsignal중단 알고리즘추가한다.

알고리즘 algorithmAbortSignal signal에서 제거하려면, algorithmsignal중단 알고리즘에서 제거한다.

AbortSignal 객체 signal과 선택적 reason이 주어졌을 때, 중단 신호를 보내려면:

  1. signal중단되었다면, 반환한다.

  2. signal중단 이유reason이 주어졌으면 그것으로 설정하고, 그렇지 않으면 새로운 "AbortError" DOMException으로 설정한다.

  3. dependentSignalsToAbort를 새로운 리스트로 한다.

  4. signal의존 신호의 각 dependentSignal에 대해 반복한다:

    1. dependentSignal중단되지 않았다면:

      1. dependentSignal중단 이유signal중단 이유로 설정한다.

      2. dependentSignaldependentSignalsToAbort추가한다.

  5. signal에 대해 중단 단계를 실행한다.

  6. dependentSignalsToAbort의 각 dependentSignal에 대해 반복하며, dependentSignal에 대해 중단 단계를 실행한다.

AbortSignal signal에 대해 중단 단계 실행하려면:

  1. signal중단 알고리즘의 각 algorithm에 대해 반복하며 algorithm을 실행한다.

  2. signal중단 알고리즘비운다.

  3. abort라는 이름의 이벤트를 발생시킨다.

AbortSignal 객체 목록 signals로부터, AbortSignal 또는 이를 상속하는 인터페이스여야 하는 signalInterfacerealm을 사용하여 의존적인 중단 신호 생성하려면:

  1. resultSignalrealm을 사용하여 signalInterface를 구현하는 새로운 객체로 한다.

  2. signals의 각 signal에 대해 반복한다: signal중단되었다면, resultSignal중단 이유signal중단 이유로 설정하고 resultSignal을 반환한다.

  3. resultSignal의존적인 속성을 true로 설정한다.

  4. signals의 각 signal에 대해 반복한다:

    1. signal의존적인 속성이 false라면:

      1. signalresultSignal소스 신호추가한다.

      2. resultSignalsignal의존 신호추가한다.

    2. 그렇지 않으면, signal소스 신호의 각 sourceSignal에 대해 반복한다:

      1. 단언: sourceSignal중단되지 않았고 의존적이지 않다.

      2. sourceSignalresultSignal소스 신호추가한다.

      3. resultSignalsourceSignal의존 신호추가한다.

  5. resultSignal을 반환한다.

3.2.1. 가비지 컬렉션

중단되지 않은 의존적인 AbortSignal 객체는 소스 신호가 비어있지 않고 abort 이벤트에 대한 등록된 이벤트 리스너가 있거나 중단 알고리즘이 비어있지 않은 동안에는 가비지 컬렉션되어서는 안 된다.

3.3. API에서 AbortControllerAbortSignal 객체 사용하기

중단될 수 있는 작업을 나타내기 위해 프라미스를 사용하는 모든 웹 플랫폼 API는 다음을 준수해야 한다:

프라미스를 반환하는 메서드 doAmazingness(options)의 메서드 단계는 다음과 같을 수 있다:

  1. globalthis관련 전역 객체로 한다.

  2. p새로운 프라미스로 한다.

  3. options["signal"]이 존재한다면:

    1. signaloptions["signal"]로 한다.

    2. signal중단되었다면, signal중단 이유p거부하고 p를 반환한다.

    3. signal다음 중단 단계를 추가한다:

      1. 놀라운 일을 멈춘다.

      2. signal중단 이유p거부한다.

  4. 다음 단계를 병렬로 실행한다:

    1. amazingResult를 놀라운 일을 수행한 결과로 한다.

    2. global과 함께 놀라운 태스크 소스에서 전역 태스크를 큐에 추가하여 amazingResultp이행한다.

  5. p를 반환한다.

프라미스를 사용하지 않는 API도 가능한 한 위의 내용을 준수해야 한다.

4. 노드

4.1. "DOM" 소개

원래 의미에서 "DOM"은 문서(특히 HTML 및 XML 문서)에 접근하고 조작하기 위한 API입니다. 이 명세에서 "문서"라는 용어는 짧은 정적 문서부터 풍부한 멀티미디어를 가진 긴 에세이 또는 보고서, 그리고 완전한 인터랙티브 애플리케이션까지 모든 마크업 기반 리소스를 의미합니다.

이러한 각 문서는 노드 트리로 표현됩니다. 노드 중 일부는 트리에서 자식을 가질 수 있고, 다른 노드는 항상 리프(끝)입니다.

예를 들어, 다음 HTML 문서를 생각해보세요:

<!DOCTYPE html>
<html class=e>
 <head><title>Aliens?</title></head>
 <body>Why yes.</body>
</html>

이 문서는 다음과 같이 표현됩니다:

HTML 파싱의 마법 덕분에 모든 ASCII 공백텍스트 노드로 변환되는 것은 아니지만, 일반적인 개념은 분명합니다. 마크업이 들어가고, 트리노드가 생성됩니다.

아주 훌륭한 Live DOM Viewer 를 사용하여 이 내용을 더 자세히 탐색할 수 있습니다.

4.2. 노드 트리

노드Node구현하는 객체이다. 노드노드 트리로 알려진 트리참여한다.

실제로는 더 구체적인 객체들을 다룬다.

Node구현하는 객체들은 또한 상속된 인터페이스도 구현한다: Document, DocumentType, DocumentFragment, Element, CharacterData, 또는 Attr.

DocumentFragment를 구현하는 객체들은 때때로 ShadowRoot도 구현한다.

Element를 구현하는 객체들은 또한 일반적으로 HTMLAnchorElement와 같은 상속된 인터페이스를 구현한다.

CharacterData를 구현하는 객체들은 또한 상속된 인터페이스를 구현한다: Text, ProcessingInstruction, 또는 Comment.

Text를 구현하는 객체들은 때때로 CDATASection도 구현한다.

따라서 모든 노드주 인터페이스는 다음 중 하나이다: Document, DocumentType, DocumentFragment, ShadowRoot, Element 또는 Element의 상속된 인터페이스, Attr, Text, CDATASection, ProcessingInstruction, 또는 Comment.

간결함을 위해, 이 명세는 Node와 상속된 인터페이스 NodeInterface구현하는 객체를 NodeInterface 노드라고 부른다.

노드 트리노드와 그 가능한 자식 간의 관계로 표현되는 다음과 같은 제약을 받는다:

Document

트리 순서로:

  1. 0개 이상의 ProcessingInstruction 또는 Comment 노드.

  2. 선택적으로 하나의 DocumentType 노드.

  3. 0개 이상의 ProcessingInstruction 또는 Comment 노드.

  4. 선택적으로 하나의 Element 노드.

  5. 0개 이상의 ProcessingInstruction 또는 Comment 노드.

DocumentFragment
Element

0개 이상의 Element 또는 CharacterData 노드.

DocumentType
CharacterData
Attr

자식 없음.

Attr 노드는 역사적인 이유로 트리참여한다; 이들은 (null이 아닌) 부모자식을 절대 가지지 않으므로 트리에서 혼자 있다.

노드 node길이를 결정하려면 다음 단계를 실행한다:

  1. nodeDocumentType 또는 Attr 노드라면, 0을 반환한다.

  2. nodeCharacterData 노드라면, node데이터길이를 반환한다.

  3. node자식 수를 반환한다.

노드는 그 길이가 0이면 비어있다고 간주된다.

4.2.1. 문서 트리

문서 트리루트문서노드 트리이다.

문서문서 요소부모가 해당 문서요소이다. 존재한다면; 그렇지 않으면 null이다.

노드 트리 제약에 따라, 그러한 요소는 하나만 있을 수 있다.

노드는 그 루트문서일 때 문서 트리에 있다고 한다.

노드문서 트리에 있으면 문서에 있다고 한다. 문서에 있다는 용어는 더 이상 사용되지 않는다. 이는 이를 사용하는 표준이 섀도 트리를 고려하도록 업데이트되지 않았음을 나타낸다.

4.2.2. 섀도 트리

섀도 트리루트섀도 루트노드 트리이다.

섀도 루트는 그 호스트를 통해 항상 다른 노드 트리에 연결된다. 따라서 섀도 트리는 혼자 있지 않는다. 섀도 루트호스트노드 트리는 때때로 라이트 트리라고 불린다.

섀도 트리에 대응하는 라이트 트리는 그 자체로 섀도 트리일 수 있다.

노드는 그 섀도 포함 루트문서일 때 연결되었다고 한다.

4.2.2.1. 슬롯

섀도 트리슬롯인 0개 이상의 요소를 포함한다.

슬롯은 HTML의 slot 요소를 통해서만 생성될 수 있다.

슬롯은 연관된 이름(문자열)을 가진다. 달리 명시되지 않는 한 빈 문자열이다.

슬롯이름을 업데이트하기 위해 다음 속성 변경 단계를 사용한다:

  1. element슬롯이고, localNamename이며, namespace가 null이라면:

    1. valueoldValue와 같다면, 반환한다.

    2. value가 null이고 oldValue가 빈 문자열이라면, 반환한다.

    3. value가 빈 문자열이고 oldValue가 null이라면, 반환한다.

    4. value가 null이거나 빈 문자열이라면, element이름을 빈 문자열로 설정한다.

    5. 그렇지 않으면, element이름value로 설정한다.

    6. element루트와 함께 트리에 대한 슬롯 가능한 요소 할당을 실행한다.

섀도 트리에서 트리 순서로 첫 번째 슬롯이고 이름이 빈 문자열인 것은 때때로 "기본 슬롯"으로 알려져 있다.

슬롯은 연관된 할당된 노드(슬롯 가능한 요소의 목록)를 가진다. 달리 명시되지 않는 한 비어있다.

4.2.2.2. 슬롯 가능한 요소

ElementText 노드슬롯 가능한 요소이다.

슬롯슬롯 가능한 요소가 될 수 있다.

슬롯 가능한 요소는 연관된 이름(문자열)을 가진다. 달리 명시되지 않는 한 빈 문자열이다.

슬롯 가능한 요소이름을 업데이트하기 위해 다음 속성 변경 단계를 사용한다:

  1. localNameslot이고 namespace가 null이라면:

    1. valueoldValue와 같다면, 반환한다.

    2. value가 null이고 oldValue가 빈 문자열이라면, 반환한다.

    3. value가 빈 문자열이고 oldValue가 null이라면, 반환한다.

    4. value가 null이거나 빈 문자열이라면, element이름을 빈 문자열로 설정한다.

    5. 그렇지 않으면, element이름value로 설정한다.

    6. element할당되었다면, element할당된 슬롯에 대해 슬롯 가능한 요소 할당을 실행한다.

    7. element에 대해 슬롯 할당을 실행한다.

슬롯 가능한 요소는 연관된 할당된 슬롯(null 또는 슬롯)을 가진다. 달리 명시되지 않는 한 null이다. 슬롯 가능한 요소는 그 할당된 슬롯이 non-null일 때 할당되었다고 한다.

슬롯 가능한 요소는 연관된 수동 슬롯 할당(null 또는 슬롯)을 가진다. 달리 명시되지 않는 한 null이다.

슬롯 가능한 요소수동 슬롯 할당은 이 변수가 스크립트에서 직접 접근 가능하지 않기 때문에 슬롯에 대한 약한 참조를 사용하여 구현될 수 있다.

4.2.2.3. 슬롯과 슬롯 가능한 요소 찾기

주어진 슬롯 가능한 요소 slottable과 선택적 불리언 open(기본값 false)에 대해 슬롯 찾기를 하려면:

  1. slottable부모가 null이라면, null을 반환한다.

  2. shadowslottable부모섀도 루트로 한다.

  3. shadow가 null이라면, null을 반환한다.

  4. open이 true이고 shadow모드가 "open"이 아니라면, null을 반환한다.

  5. shadow슬롯 할당이 "manual"이라면, shadow후손수동으로 할당된 노드slottable포함하는 슬롯을 반환한다. 있다면; 그렇지 않으면 null.

  6. shadow후손트리 순서로 첫 번째이며 이름slottable이름과 같은 슬롯을 반환한다. 있다면; 그렇지 않으면 null.

주어진 슬롯 slot에 대해 슬롯 가능한 요소 찾기를 하려면:

  1. result를 « »로 한다.

  2. rootslot루트로 한다.

  3. root섀도 루트가 아니라면, result를 반환한다.

  4. hostroot호스트로 한다.

  5. root슬롯 할당이 "manual"이라면:

    1. slot수동으로 할당된 노드의 각 슬롯 가능한 요소 slottable에 대해 반복하며, 만약 slottable부모host라면, slottableresult추가한다.

  6. 그렇지 않으면, host의 각 슬롯 가능한 요소 자식 slottable에 대해 트리 순서로:

    1. foundSlotslottable을 주어서 슬롯을 찾은 결과로 한다.

    2. foundSlotslot이라면, slottableresult추가한다.

  7. result를 반환한다.

주어진 슬롯 slot에 대해 평면화된 슬롯 가능한 요소 찾기를 하려면:

  1. result를 « »로 한다.

  2. slot루트섀도 루트가 아니라면, result를 반환한다.

  3. slottablesslot을 주어서 슬롯 가능한 요소를 찾은 결과로 한다.

  4. slottables가 빈 목록이라면, slot의 각 슬롯 가능한 요소 자식트리 순서slottables에 추가한다.

  5. slottables의 각 node에 대해:

    1. node루트섀도 루트슬롯이라면:

      1. temporaryResultnode를 주어서 평면화된 슬롯 가능한 요소를 찾은 결과로 한다.

      2. temporaryResult의 각 슬롯 가능한 요소를 순서대로 result에 추가한다.

    2. 그렇지 않으면, noderesult에 추가한다.

  6. result를 반환한다.

4.2.2.4. 슬롯 가능한 요소와 슬롯 할당

슬롯 slot에 대해 슬롯 가능한 요소 할당을 하려면:

  1. slottablesslot에 대해 슬롯 가능한 요소를 찾은 결과로 한다.

  2. slottablesslot할당된 노드가 동일하지 않다면, slot에 대해 슬롯 변경 신호를 실행한다.

  3. slot할당된 노드slottables로 설정한다.

  4. slottables의 각 slottable에 대해, slottable할당된 슬롯slot으로 설정한다.

주어진 노드 root에 대해 트리에 대한 슬롯 가능한 요소 할당을 하려면, root포함 후손의 각 슬롯에 대해 트리 순서슬롯 가능한 요소 할당을 실행한다.

주어진 슬롯 가능한 요소 slottable에 대해 슬롯 할당을 하려면:

  1. slotslottable과 함께 슬롯을 찾은 결과로 한다.

  2. slot이 non-null이라면, slot에 대해 슬롯 가능한 요소 할당을 실행한다.

4.2.2.5. 슬롯 변경 신호

유사 출처 윈도우 에이전트신호 슬롯(슬롯집합)을 가지며, 이는 초기에 비어있다. [HTML]

슬롯 slot에 대해 슬롯 변경 신호를 하려면:

  1. slotslot관련 에이전트신호 슬롯추가한다.

  2. 뮤테이션 옵저버 컴파운드 마이크로태스크를 큐에 추가한다.

4.2.3. 변경 알고리즘

노드 child 앞의 노드 parent노드 node를 삽입하기 위한 사전 삽입 유효성 보장:

  1. parentDocument, DocumentFragment, 또는 Element 노드가 아니라면, "HierarchyRequestError" DOMException던진다.

  2. nodeparent호스트 포함 포괄 조상이라면, "HierarchyRequestError" DOMException던진다.

  3. child가 non-null이고 그 부모parent가 아니라면, "NotFoundError" DOMException던진다.

  4. nodeDocumentFragment, DocumentType, Element, 또는 CharacterData 노드가 아니라면, "HierarchyRequestError" DOMException던진다.

  5. nodeText 노드이고 parent문서이거나, 또는 node문서타입이고 parent문서가 아니라면, "HierarchyRequestError" DOMException던진다.

  6. parent문서이고, node구현하는 인터페이스에 따른 아래 문장 중 하나라도 참이라면, "HierarchyRequestError" DOMException던진다.

    DocumentFragment

    node가 둘 이상의 요소 자식을 가지거나 Text 노드 자식을 가지는 경우.

    그렇지 않고, node가 하나의 요소 자식을 가지고, parent요소 자식을 가지거나, child문서타입이거나, child가 non-null이고 문서타입child따르는 경우.

    Element

    parent요소 자식을 가지거나, child문서타입이거나, child가 non-null이고 문서타입child따르는 경우.

    DocumentType

    parent문서타입 자식을 가지거나, child가 non-null이고 요소child앞서거나, child가 null이고 parent요소 자식을 가지는 경우.

사전 삽입을 위해 nodeparentchild 앞에 삽입하려면 다음 단계를 실행한다:

  1. nodeparentchild 앞에 사전 삽입 유효성을 확인한다.

  2. referenceChildchild로 한다.

  3. referenceChildnode라면, referenceChildnode다음 형제로 설정한다.

  4. 삽입을 통해 nodeparentreferenceChild 앞에 삽입한다.

  5. node를 반환한다.

仕様は、すべてまたは一部のノードに対して 挿入手順 を定義する場合があります。アルゴリズムにはinsertedNodeが渡され、以下の挿入アルゴリズムで示されています。 これらの手順は、insertedNodeノードツリー参加している場合、そのノードツリーを変更したり、閲覧コンテキストを作成したり、 イベントを発火したり、 その他JavaScriptを実行したりしてはなりません。ただし、これらの処理を非同期に実行するために タスクをキューに追加することは可能です。

삽입 단계가 자바스크립트 실행(기타 동작 포함)을 할 수는 없지만, 실제로 스크립트에서 관찰 가능한 결과를 일으킬 수 있습니다. 아래 예제를 참고하세요:

const h1 = document.querySelector('h1');

const fragment = new DocumentFragment();
const script = fragment.appendChild(document.createElement('script'));
const style = fragment.appendChild(document.createElement('style'));

script.innerText= 'console.log(getComputedStyle(h1).color)'; // 'rgb(255, 0, 0)'을 로그로 출력
style.innerText = 'h1 {color: rgb(255, 0, 0);}';

document.body.append(fragment);

위 예제의 스크립트는 'rgb(255, 0, 0)'을 로그로 출력합니다. 그 이유는 다음과 같은 순서로 동작하기 때문입니다:

  1. 삽입 알고리즘이 실행되어, script style 요소들이 순서대로 삽입됩니다.

    1. HTML 표준의 삽입 단계script 요소에 대해 실행됩니다. 아무 동작도 하지 않습니다. [HTML]

    2. HTML 표준의 삽입 단계 style 요소에 대해 실행됩니다. 해당 스타일 규칙이 문서에 즉시 적용됩니다. [HTML]

    3. HTML 표준의 연결 후 단계script 요소에 대해 실행됩니다. 스크립트가 실행되며, 바로 앞 단계에서 적용된 스타일 규칙을 즉시 관찰합니다. [HTML]

명세는 모든 혹은 일부 연결 후 단계노드에 대해 정의할 수 있습니다. 알고리즘에는 아래 삽입 알고리즘에서와 같이 connectedNode가 전달됩니다.

연결 후 단계의 목적은 노드connectedNode노드 트리참여하는 것을 수정하거나, 브라우징 컨텍스트를 생성하거나, 또는 자바스크립트를 실행하는 등 연결 관련 작업을 수행할 수 있도록 하는 것입니다. 이 단계는 노드의 일괄 삽입을 스크립트 관점에서 원자적으로 처리해, 주요 부작용들이 노드 트리에 모두 삽입이 완료된 이후에 발생하게 합니다. 이를 통해 모든 노드 트리의 삽입이 완전히 끝나야만 추가 삽입이 진행될 수 있습니다.

명세는 모든 혹은 일부 자식 변경 단계노드에 대해 정의할 수 있습니다. 이 알고리즘은 인자를 받지 않으며 삽입, 제거, 데이터 교체에서 호출됩니다.

노드를 삽입하기 위해 nodeparentchild 앞에, 선택적으로 관찰자 억제 플래그와 함께 삽입하려면 다음 단계들을 실행합니다:

  1. nodeDocumentFragment 노드라면, nodesnode자식으로 설정하고, 아니라면 « node »로 설정합니다.

  2. countnodes크기로 설정합니다.

  3. count가 0이면 반환합니다.

  4. nodeDocumentFragment 노드라면:

    1. 자식들을 관찰자 억제 플래그를 설정하여 제거합니다.

    2. node에 대해 « », nodes, null, null을 가지고 트리 변화 레코드 큐에 등록합니다.

      이 단계는 관찰자 억제 플래그를 일부러 무시합니다.

  5. child가 null이 아니면:

    1. parent시작 노드이고, 시작 오프셋child인덱스보다 큰 live range마다 시작 오프셋count만큼 증가시킵니다.

    2. parent끝 노드이고, 끝 오프셋child인덱스보다 큰 live range마다 끝 오프셋count만큼 증가시킵니다.

  6. previousSiblingchild이전 형제로, child가 null이면 parent마지막 자식으로 설정합니다.

  7. nodes 내의 각 node에 대해 트리 순서로:

    1. nodeparent노드 문서채택합니다.

    2. child가 null이면 parent자식append합니다.

    3. 그 외에는 parent자식에서 child인덱스 앞에 삽입합니다.

    4. parent섀도우 호스트이고, 섀도우 루트슬롯 할당이 "named"이며, node슬롯할 수 있는 노드라면, 슬롯을 할당합니다.

    5. parent루트섀도우 루트이고, parent슬롯이며, 할당된 노드가 비어있다면, 슬롯 변경 신호를 보냅니다.

    6. node루트트리에 슬롯할 수 있는 노드 할당을 실행합니다.

    7. node의 각 섀도우 포함 포괄 자손 inclusiveDescendant에 대해 섀도우 포함 트리 순서로:

      1. 삽입 단계inclusiveDescendant로 실행합니다.

      2. inclusiveDescendant연결됨이 아니라면, 다음으로 넘어갑니다.

      3. inclusiveDescendant요소라면:

        1. inclusiveDescendant커스텀 요소 레지스트리가 null이면, inclusiveDescendant커스텀 요소 레지스트리커스텀 요소 레지스트리 조회 결과로 설정합니다.

        2. 그 외에 inclusiveDescendant커스텀 요소 레지스트리is scoped가 true라면, inclusiveDescendant노드 문서커스텀 요소 레지스트리범위 문서 집합append합니다.

        3. inclusiveDescendant커스텀이라면, 커스텀 요소 콜백 반응을 큐에 등록합니다. 콜백 이름은 "connectedCallback", 인자는 « ».

        4. 그 외에는 업그레이드 시도inclusiveDescendant로 실행합니다.

          업그레이드가 성공하면 inclusiveDescendantconnectedCallback요소 업그레이드 알고리즘에서 자동으로 큐에 등록됩니다.

      4. 그 외에 inclusiveDescendant섀도우 루트라면:

        1. inclusiveDescendant커스텀 요소 레지스트리가 null이고, keep custom element registry null이 false라면, inclusiveDescendant커스텀 요소 레지스트리커스텀 요소 레지스트리 조회 결과로 설정합니다.

        2. 그 외에 inclusiveDescendant커스텀 요소 레지스트리가 null이 아니고, 커스텀 요소 레지스트리is scoped가 true라면, inclusiveDescendant노드 문서커스텀 요소 레지스트리범위 문서 집합append합니다.

  8. 관찰자 억제 플래그가 설정되어 있지 않으면, parentnodes, « », previousSibling, child트리 변화 레코드 큐에 등록합니다.

  9. parent자식 변경 단계를 실행합니다.

  10. staticNodeList리스트로, 노드로, 처음에는 « »로 설정합니다.

    모든 노드연결 후 단계를 하나라도 호출하기 이전에 수집합니다. 연결 후 단계노드 트리를 순회하는 중간에 호출하지 않는 이유는, 연결 후 단계가 트리 구조를 수정할 수 있어, 라이브 순회가 안전하지 않고, 동일한 노드에 여러 번 연결 후 단계가 호출될 수 있기 때문입니다.

  11. nodes 내의 각 node에 대해 트리 순서로:

    1. node의 각 섀도우 포함 포괄 자손 inclusiveDescendant에 대해 섀도우 포함 트리 순서로, appendinclusiveDescendantstaticNodeList에 추가합니다.

  12. staticNodeListnode에 대해, node연결됨이라면 연결 후 단계node로 실행합니다.

명세는 모든 또는 일부 노드에 대해 이동 단계를 정의할 수 있습니다. 알고리즘에는 노드 movedNode노드-또는-null oldParent가 아래 이동 알고리즘에서와 같이 전달됩니다. 삽입 단계와 마찬가지로, 이러한 단계는 movedNode노드 트리참여하는 것을 수정하거나, 브라우징 컨텍스트를 생성하거나, 이벤트를 발생시키거나, 또는 자바스크립트를 실행하는 등의 동작을 해서는 안 됩니다. 그러나 이러한 단계에서는 이러한 작업을 비동기적으로 수행하기 위해 태스크를 큐에 등록할 수 있습니다.

노드를 이동하기 위해 노드 node노드 newParent노드-또는-null child 앞에 이동하려면:

  1. newParent섀도우 포함 루트node섀도우 포함 루트와 다르면, "HierarchyRequestError" DOMExceptionthrow합니다.

    이로 인해 newParent연결됨node연결됨과 같을 때만 이동이 수행됨이 보장됩니다.

  2. node호스트 포함 포괄 조상이라면, newParent에 대해 "HierarchyRequestError" DOMExceptionthrow합니다.

  3. child가 null이 아니고, 그 부모newParent가 아니라면, "NotFoundError" DOMExceptionthrow합니다.

  4. nodeElement 또는 CharacterData 노드가 아니면, "HierarchyRequestError" DOMExceptionthrow합니다.

  5. nodeText 노드이고, newParent문서라면, "HierarchyRequestError" DOMExceptionthrow합니다.

  6. 만약 newParentdocument이고, nodeElement node이며, newParentelement child가 있거나, childdoctype이거나, 또는 child가 null이 아니고 doctypechild 다음에 오는 경우, "HierarchyRequestError" DOMExceptionthrow합니다.

  7. oldParentnode부모로 설정합니다.

  8. Assert: oldParent는 null이 아닙니다.

  9. live range 사전 제거 단계node로 실행합니다.

  10. NodeIterator 객체 iterator마다, 그 루트노드 문서node노드 문서와 같으면, NodeIterator 사전 제거 단계nodeiterator로 실행합니다.

  11. oldPreviousSiblingnode이전 형제로 설정합니다.

  12. oldNextSiblingnode다음 형제로 설정합니다.

  13. 제거 nodeoldParent자식에서 제거합니다.

  14. node할당됨이면, 슬롯할 수 있는 노드 할당node할당 슬롯으로 실행합니다.

  15. oldParent루트섀도우 루트이고, oldParent슬롯이며, 할당된 노드비어있다면, 슬롯 변경 신호oldParent로 실행합니다.

  16. node포괄 자손슬롯이 있다면:

    1. 트리에 슬롯할 수 있는 노드 할당oldParent루트로 실행합니다.

    2. 트리에 슬롯할 수 있는 노드 할당node로 실행합니다.

  17. child가 null이 아니면:

    1. live range 중, 시작 노드newParent이고, 시작 오프셋child인덱스보다 크면, 시작 오프셋을 1 증가시킵니다.

    2. live range 중, 끝 노드newParent이고, 끝 오프셋child인덱스보다 크면, 끝 오프셋을 1 증가시킵니다.

  18. newPreviousSiblingchild가 null이 아니면 child이전 형제로, 아니면 newParent마지막 자식으로 설정합니다.

  19. child가 null이면 nodenewParent자식append합니다.

  20. 그 외에는 nodenewParent자식에서 child인덱스 앞에 삽입합니다.

  21. newParent섀도우 호스트이고, 섀도우 루트슬롯 할당이 "named"이며, node슬롯할 수 있는 노드라면, 슬롯을 할당합니다.

  22. newParent루트섀도우 루트이고, newParent슬롯이며, 할당된 노드비어있다면, 슬롯 변경 신호newParent로 실행합니다.

  23. 트리에 슬롯할 수 있는 노드 할당node루트로 실행합니다.

  24. node의 각 섀도우 포함 포괄 자손 inclusiveDescendant에 대해 섀도우 포함 트리 순서로:

    1. inclusiveDescendantnode이면 이동 단계inclusiveDescendantoldParent로 실행하고, 아니면 이동 단계inclusiveDescendant와 null로 실행합니다.

      이동 알고리즘은 삽입이나 제거와는 별개의 프리미티브이므로, inclusiveDescendant에 대해 전통적인 삽입 단계제거 단계를 호출하지 않습니다.

    2. inclusiveDescendant커스텀이고, newParent연결됨이면, 커스텀 요소 콜백 반응 큐에 등록inclusiveDescendant와 콜백 이름 "connectedMoveCallback", 인자 « »로 실행합니다.

  25. 트리 변화 레코드 큐에 등록oldParent에 대해 « », « node », oldPreviousSibling, oldNextSibling로 실행합니다.

  26. 트리 변화 레코드 큐에 등록newParent에 대해 « node », « », newPreviousSibling, child로 실행합니다.

노드 추가를 하려면 nodeparent에 추가할 때, pre-insertnodeparent에 null 앞에 삽입합니다.

노드 교체를 하려면 parent 내에서 childnode로 교체할 때, 다음 단계를 실행합니다:

  1. parentDocument, DocumentFragment, Element 노드 중 하나가 아니면, "HierarchyRequestError" DOMExceptionthrow합니다.

  2. node호스트 포함 포괄 조상이면 parent에 대해 "HierarchyRequestError" DOMExceptionthrow합니다.

  3. child부모parent가 아니면 "NotFoundError" DOMExceptionthrow합니다.

  4. nodeDocumentFragment, DocumentType, Element, CharacterData 노드 중 하나가 아니면 "HierarchyRequestError" DOMExceptionthrow합니다.

  5. nodeText 노드이고 parent문서이거나, nodedoctype이고 parent문서가 아니면, "HierarchyRequestError" DOMExceptionthrow합니다.

  6. parent문서이고 아래의 조건 중 node가 구현하는 인터페이스에 따라 true라면, "HierarchyRequestError" DOMExceptionthrow합니다.

    DocumentFragment

    node요소 자식이 2개 이상 있거나, Text 노드 자식이 있으면 true.

    그렇지 않고, 만약 node가 하나의 element child를 가지고 있고, parentchild가 아닌 element child를 가지고 있거나 또는 doctypechild 다음에 오는 경우.

    Element

    parentchild가 아닌 element child가 있거나 또는 doctypechild 다음에 오는 경우.

    DocumentType

    parentchild가 아닌 doctype child가 있거나, 또는 elementchild 앞에 오는 경우.

    위의 조건들은 pre-insert 알고리즘과 다릅니다.

  7. referenceChildchild다음 형제로 설정합니다.

  8. referenceChildnode이면 referenceChildnode다음 형제로 설정합니다.

  9. previousSiblingchild이전 형제로 설정합니다.

  10. removedNodes를 빈 집합으로 설정합니다.

  11. child부모가 null이 아니면:

    1. removedNodes를 « child »로 설정합니다.

    2. 제거 child관찰자 억제 플래그를 설정하여 제거합니다.

    위의 조건이 false가 되는 경우는 childnode일 때뿐입니다.

  12. nodesnodeDocumentFragment 노드이면 node자식으로, 아니면 « node »로 설정합니다.

  13. 삽입 nodeparentreferenceChild 앞에 관찰자 억제 플래그를 설정하여 삽입합니다.

  14. 트리 변화 레코드 큐에 등록parentnodes, removedNodes, previousSibling, referenceChild로 실행합니다.

  15. child를 반환합니다.

모두 교체를 하려면 parent 내에서 node로 모두 교체할 때, 다음 단계를 실행합니다:

  1. removedNodesparent자식으로 설정합니다.

  2. addedNodes를 빈 집합으로 설정합니다.

  3. nodeDocumentFragment 노드라면, addedNodesnode자식으로 설정합니다.

  4. 그 외에 node가 null이 아니면 addedNodes를 « node »로 설정합니다.

  5. 제거 parent의 모든 자식트리 순서관찰자 억제 플래그를 설정하여 제거합니다.

  6. node가 null이 아니면 삽입 nodeparent에 null 앞에 관찰자 억제 플래그를 설정하여 삽입합니다.

  7. addedNodes 또는 removedNodes비어있지 않으면, 트리 변화 레코드 큐에 등록parentaddedNodes, removedNodes, null, null로 실행합니다.

이 알고리즘은 노드 트리 제약조건에 대한 체크를 하지 않습니다. 명세 작성자는 신중하게 사용해야 합니다.

사전 제거를 하려면 parent에서 child를 사전 제거할 때, 다음 단계를 실행합니다:

  1. child부모parent가 아니면 "NotFoundError" DOMExceptionthrow합니다.

  2. 제거 child를 실행합니다.

  3. child를 반환합니다.

명세는 모든 또는 일부 제거 단계노드에 대해 정의할 수 있습니다. 알고리즘에는 노드 removedNode노드-또는-null oldParent가 아래 제거 알고리즘에서와 같이 전달됩니다.

노드 제거를 하려면 노드 node를 선택적으로 관찰자 억제 플래그와 함께 제거하려면 다음 단계를 실행합니다:

  1. parentnode부모로 설정합니다.

  2. Assert: parent는 null이 아닙니다.

  3. live range 사전 제거 단계node로 실행합니다.

  4. NodeIterator 객체 iterator마다, 그 루트노드 문서node노드 문서와 같으면, NodeIterator 사전 제거 단계nodeiterator로 실행합니다.

  5. oldPreviousSiblingnode이전 형제로 설정합니다.

  6. oldNextSiblingnode다음 형제로 설정합니다.

  7. 제거 nodeparent자식에서 제거합니다.

  8. node할당됨이면, 슬롯할 수 있는 노드 할당node할당 슬롯으로 실행합니다.

  9. parent루트섀도우 루트이고, parent슬롯이며, 할당된 노드가 비어있으면, 슬롯 변경 신호parent로 실행합니다.

  10. node포괄 자손슬롯이 있다면:

    1. 트리에 슬롯할 수 있는 노드 할당parent루트로 실행합니다.

    2. 트리에 슬롯할 수 있는 노드 할당node로 실행합니다.

  11. 제거 단계nodeparent로 실행합니다.

  12. isParentConnectedparent연결됨으로 설정합니다.

  13. node커스텀이고 isParentConnected가 true라면, 커스텀 요소 콜백 반응 큐에 등록node와 콜백 이름 "disconnectedCallback", 인자 « »로 실행합니다.

    현재는 커스텀 요소parent가 전달되지 않습니다. 필요하다면 향후 변경될 수 있습니다.

  14. node의 각 섀도우 포함 자손 descendant에 대해 섀도우 포함 트리 순서로:

    1. 제거 단계descendant와 null로 실행합니다.

    2. descendant커스텀이고 isParentConnected가 true라면, 커스텀 요소 콜백 반응 큐에 등록descendant와 콜백 이름 "disconnectedCallback", 인자 « »로 실행합니다.

  15. parent의 각 포괄 조상 inclusiveAncestor에 대해, 그리고 inclusiveAncestor등록된 옵저버 목록registered에 대해, registeredoptions["subtree"]가 true이면, append로 새로운 임시 등록 옵저버registered옵저버, 옵션, sourcenode등록된 옵저버 목록에 추가합니다.

  16. 관찰자 억제 플래그가 설정되어 있지 않으면, 트리 변화 레코드 큐에 등록parent에 « », « node », oldPreviousSibling, oldNextSibling로 실행합니다.

  17. 자식 변경 단계parent로 실행합니다.

4.2.4. 믹스인 NonElementParentNode

웹 호환성으로 인해 getElementById() 메서드는 요소에서(따라서 ParentNode에서도) 노출되지 않습니다.

interface mixin NonElementParentNode {
  Element? getElementById(DOMString elementId);
};
Document includes NonElementParentNode;
DocumentFragment includes NonElementParentNode;
node . getElementById(elementId)

node자손 중에서 elementId라는 ID를 가진 첫 번째 요소를 반환합니다.

getElementById(elementId) 메서드 단계는 트리 순서this자손 중에서 elementId라는 ID를 가진 첫 번째 요소를 반환합니다. 그런 요소가 없다면 null을 반환합니다.

4.2.5. 믹스인 DocumentOrShadowRoot

interface mixin DocumentOrShadowRoot {
  readonly attribute CustomElementRegistry? customElementRegistry;
};
Document includes DocumentOrShadowRoot;
ShadowRoot includes DocumentOrShadowRoot;
registry = documentOrShadowRoot . customElementRegistry

documentOrShadowRootCustomElementRegistry 객체를 반환합니다. 없다면 null을 반환합니다.

customElementRegistry getter 단계는 다음과 같습니다:

  1. this문서라면, this커스텀 요소 레지스트리를 반환합니다.

  2. Assert: thisShadowRoot 노드입니다.

  3. this커스텀 요소 레지스트리를 반환합니다.

DocumentOrShadowRoot 믹스인은 문서섀도우 루트 사이에서 API를 공유하려는 다른 표준에서도 사용할 것으로 예상됩니다.

4.2.6. 믹스인 ParentNode

노드들을 하나의 노드로 변환하려면, nodesdocument를 받아 다음 단계를 실행합니다:

  1. node를 null로 설정합니다.

  2. nodes 내의 각 문자열을, 해당 문자열을 data로 하고 노드 문서document로 하는 새로운 Text 노드로 대체합니다.

  3. nodes노드가 1개 있으면, nodenodes[0]으로 설정합니다.

  4. 그 외에는, node노드 문서document로 하는 새로운 DocumentFragment 노드로 설정하고, nodes 내의 모든 노드를(있다면) 해당 노드에 append합니다.

  5. node를 반환합니다.

interface mixin ParentNode {
  [SameObject] readonly attribute HTMLCollection children;
  readonly attribute Element? firstElementChild;
  readonly attribute Element? lastElementChild;
  readonly attribute unsigned long childElementCount;

  [CEReactions, Unscopable] undefined prepend((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined append((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined replaceChildren((Node or DOMString)... nodes);

  [CEReactions] undefined moveBefore(Node node, Node? child);

  Element? querySelector(DOMString selectors);
  [NewObject] NodeList querySelectorAll(DOMString selectors);
};
Document includes ParentNode;
DocumentFragment includes ParentNode;
Element includes ParentNode;
collection = node . children
자식 요소들을 반환합니다.
element = node . firstElementChild
첫 번째 자식요소라면 반환합니다. 없으면 null.
element = node . lastElementChild
마지막 자식요소라면 반환합니다. 없으면 null.
node . prepend(nodes)

nodesnode첫 번째 자식 앞에 삽입합니다. nodes 내의 문자열은 동등한 Text 노드로 변환됩니다.

트리 제약 조건을 위반하면 "HierarchyRequestError" DOMException을 throw합니다.

node . append(nodes)

nodesnode마지막 자식 뒤에 삽입합니다. nodes 내의 문자열은 동등한 Text 노드로 변환됩니다.

트리 제약 조건을 위반하면 "HierarchyRequestError" DOMException을 throw합니다.

node . replaceChildren(nodes)

node의 모든 자식nodes로 교체합니다. nodes 내의 문자열은 동등한 Text 노드로 변환됩니다.

트리 제약 조건을 위반하면 "HierarchyRequestError" DOMException을 throw합니다.

node . moveBefore(movedNode, child)

제거하지 않고 movedNodenode 내에서 child 뒤에 이동시킵니다. child가 null이면 node마지막 자식 뒤에 이동합니다. 이 메서드는 movedNode와 관련된 상태를 유지합니다.

트리 제약 조건을 위반하거나 이동 노드의 상태를 유지할 수 없는 경우, "HierarchyRequestError" DOMException을 throw합니다.

node . querySelector(selectors)

node자손selectors와 일치하는 첫 번째 요소를 반환합니다.

node . querySelectorAll(selectors)

node자손selectors와 일치하는 모든 요소를 반환합니다.

children getter 단계는, 컬렉션this에 루트로 두고, 요소 자식만을 포함하는 HTMLCollection을 반환합니다.

firstElementChild getter 단계는, 첫 번째 자식요소이면 반환, 아니면 null을 반환합니다.

lastElementChild getter 단계는, 마지막 자식요소이면 반환, 아니면 null을 반환합니다.

childElementCount getter 단계는, this자식요소의 개수를 반환합니다.

prepend(nodes) 메서드 단계는 다음과 같습니다:

  1. nodenodesthis노드 문서노드들을 하나의 노드로 변환한 결과로 설정합니다.

  2. nodethis첫 번째 자식 앞에 pre-insert합니다.

append(nodes) 메서드 단계는 다음과 같습니다:

  1. nodenodesthis노드 문서노드들을 하나의 노드로 변환한 결과로 설정합니다.

  2. nodethisappend합니다.

replaceChildren(nodes) 메서드 단계는 다음과 같습니다:

  1. nodenodesthis노드 문서노드들을 하나의 노드로 변환한 결과로 설정합니다.

  2. nodethis에 null 앞에 pre-insert 유효성 보장을 확인합니다.

  3. 모두 교체node와 함께 this 내에서 실행합니다.

moveBefore(node, child) 메서드 단계는 다음과 같습니다:

  1. referenceChildchild로 설정합니다.

  2. referenceChildnode이면, referenceChildnode다음 형제로 설정합니다.

  3. nodethisreferenceChild 앞에 move합니다.

querySelector(selectors) 메서드 단계는, selectorsthis에 대해 scope-match a selectors string을 실행한 첫 번째 결과를 반환합니다. 결과가 빈 리스트면 null을 반환합니다.

querySelectorAll(selectors) 메서드 단계는, selectorsthis에 대해 scope-match a selectors string을 실행한 static 결과를 반환합니다.

4.2.7. 믹스인 NonDocumentTypeChildNode

웹 호환성으로 인해 previousElementSiblingnextElementSibling 특성은 doctype에서(따라서 ChildNode에서도) 노출되지 않습니다.

interface mixin NonDocumentTypeChildNode {
  readonly attribute Element? previousElementSibling;
  readonly attribute Element? nextElementSibling;
};
Element includes NonDocumentTypeChildNode;
CharacterData includes NonDocumentTypeChildNode;
element = node . previousElementSibling
첫 번째 앞선 형제요소를 반환합니다. 없으면 null.
element = node . nextElementSibling
첫 번째 이후 형제요소를 반환합니다. 없으면 null.

previousElementSibling getter 단계는 첫 번째 앞선 형제요소를 반환합니다. 없으면 null.

nextElementSibling getter 단계는 첫 번째 이후 형제요소를 반환합니다. 없으면 null.

4.2.8. 믹스인 ChildNode

interface mixin ChildNode {
  [CEReactions, Unscopable] undefined before((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined after((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined replaceWith((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined remove();
};
DocumentType includes ChildNode;
Element includes ChildNode;
CharacterData includes ChildNode;
node . before(...nodes)

nodesnode 바로 앞에 삽입합니다. nodes 내의 문자열은 동등한 Text 노드로 변환됩니다.

트리 제약 조건을 위반하면 "HierarchyRequestError" DOMException을 throw합니다.

node . after(...nodes)

nodesnode 바로 뒤에 삽입합니다. nodes 내의 문자열은 동등한 Text 노드로 변환됩니다.

트리 제약 조건을 위반하면 "HierarchyRequestError" DOMException을 throw합니다.

node . replaceWith(...nodes)

nodenodes로 교체합니다. nodes 내의 문자열은 동등한 Text 노드로 변환됩니다.

트리 제약 조건을 위반하면 "HierarchyRequestError" DOMException을 throw합니다.

node . remove()
node를 제거합니다.

before(nodes) 메서드 단계는 다음과 같습니다:

  1. parentthis부모로 설정합니다.

  2. parent가 null이면 반환합니다.

  3. viablePreviousSiblingthis의 첫 번째 앞선 형제nodes에 포함되지 않은 것으로 설정합니다. 없으면 null.

  4. nodenodesthis노드 문서노드들을 하나의 노드로 변환한 결과로 설정합니다.

  5. viablePreviousSibling이 null이면 parent첫 번째 자식으로, 아니면 viablePreviousSibling다음 형제로 설정합니다.

  6. nodeparentviablePreviousSibling 앞에 pre-insert합니다.

after(nodes) 메서드 단계는 다음과 같습니다:

  1. parentthis부모로 설정합니다.

  2. parent가 null이면 반환합니다.

  3. viableNextSiblingthis의 첫 번째 이후 형제nodes에 포함되지 않은 것으로 설정합니다. 없으면 null.

  4. nodenodesthis노드 문서노드들을 하나의 노드로 변환한 결과로 설정합니다.

  5. nodeparentviableNextSibling 앞에 pre-insert합니다.

replaceWith(nodes) 메서드 단계는 다음과 같습니다:

  1. parentthis부모로 설정합니다.

  2. parent가 null이면 반환합니다.

  3. viableNextSiblingthis의 첫 번째 이후 형제nodes에 포함되지 않은 것으로 설정합니다. 없으면 null.

  4. nodenodesthis노드 문서노드들을 하나의 노드로 변환한 결과로 설정합니다.

  5. this부모parent이면, replacethisnode와 함께 parent에서 교체합니다.

    thisnode에 삽입되었을 수도 있습니다.

  6. 그 외에는 nodeparentviableNextSibling 앞에 pre-insert합니다.

remove() 메서드 단계는 다음과 같습니다:

  1. this부모가 null이면 반환합니다.

  2. Removethis를 제거합니다.

4.2.9. 믹스인 Slottable

interface mixin Slottable {
  readonly attribute HTMLSlotElement? assignedSlot;
};
Element includes Slottable;
Text includes Slottable;

assignedSlot getter 단계는 find a slotthis와 true로 실행한 결과를 반환합니다.

4.2.10. 구식 컬렉션: NodeListHTMLCollection

컬렉션노드들의 리스트를 나타내는 객체입니다. 컬렉션라이브 또는 정적일 수 있습니다. 별도의 언급이 없는 한, 컬렉션라이브여야 합니다.

컬렉션라이브라면, 해당 객체의 특성과 메서드는 실제 기반 데이터에 대해 동작해야 하며, 데이터의 스냅샷에 대해 동작해서는 안 됩니다.

컬렉션이 생성될 때, 필터와 루트가 연관됩니다.

컬렉션컬렉션이 나타내는 루트로 하는 서브트리의 뷰를 나타내며, 필터에 부합하는 노드만 포함합니다. 뷰는 선형적입니다. 별도의 요구사항이 없다면, 컬렉션 내의 노드는 트리 순서로 정렬되어야 합니다.

4.2.10.1. 인터페이스 NodeList

NodeList 객체는 컬렉션이며 노드들로 구성되어 있습니다.

[Exposed=Window]
interface NodeList {
  getter Node? item(unsigned long index);
  readonly attribute unsigned long length;
  iterable<Node>;
};
collection . length
컬렉션에 있는 노드의 수를 반환합니다.
element = collection . item(index)
element = collection[index]
컬렉션에서 인덱스 index에 해당하는 노드를 반환합니다. 노드트리 순서로 정렬됩니다.

이 객체의 지원되는 프로퍼티 인덱스는 0부터 노드의 개수-1까지의 숫자입니다. 만약 해당 요소가 없으면, 지원되는 프로퍼티 인덱스는 없습니다.

length 특성은 컬렉션이 나타내는 노드의 개수를 반환해야 합니다.

item(index) 메서드는 컬렉션index번째 노드를 반환해야 합니다. 만약 컬렉션index번째 노드가 없다면, 메서드는 null을 반환해야 합니다.

4.2.10.2. 인터페이스 HTMLCollection
[Exposed=Window, LegacyUnenumerableNamedProperties]
interface HTMLCollection {
  readonly attribute unsigned long length;
  getter Element? item(unsigned long index);
  getter Element? namedItem(DOMString name);
};

HTMLCollection 객체는 컬렉션이며 요소들로 구성되어 있습니다.

HTMLCollection 은 웹에서 제거할 수 없는 역사적 유물입니다. 개발자가 계속 사용해도 되지만, 새로운 API 표준 설계자는 이를 사용하지 않는 것이 좋습니다 (IDL에서 sequence<T> 사용 권장).

collection . length
컬렉션요소의 개수를 반환합니다.
element = collection . item(index)
element = collection[index]
컬렉션에서 인덱스 index에 해당하는 요소를 반환합니다. 요소트리 순서로 정렬됩니다.
element = collection . namedItem(name)
element = collection[name]
컬렉션에서 nameID 또는 name이 일치하는 첫 번째 요소를 반환합니다.

이 객체의 지원되는 프로퍼티 인덱스는 0부터 요소의 개수-1까지의 숫자입니다. 해당 요소가 없으면 지원되는 프로퍼티 인덱스가 없습니다.

length getter 단계는 컬렉션이 나타내는 노드의 개수를 반환합니다.

item(index) 메서드 단계는 컬렉션index번째 요소를 반환합니다. 만약 index번째 요소가 없으면 null을 반환해야 합니다.

지원되는 프로퍼티 이름은 아래 단계에서 반환된 리스트의 값들입니다:

  1. result를 빈 리스트로 설정합니다.

  2. 컬렉션이 나타내는element에 대해 트리 순서로:

    1. elementID를 가지고 있고, result에 없다면, elementIDresult에 추가합니다.

    2. elementHTML 네임스페이스에 있고, name 특성이 있으며, value가 빈 문자열이 아니고 result에 없다면, elementname 특성 valueresult에 추가합니다.

  3. result를 반환합니다.

namedItem(key) 메서드 단계는:

  1. key가 빈 문자열이면 null을 반환합니다.

  2. 아래 중 하나라도 true인 컬렉션 내 첫 번째 요소를 반환합니다:

    해당 요소가 없다면 null을 반환합니다.

4.3. 변이 옵저버(Mutation observers)

동일 출처 윈도우 에이전트(similar-origin window agent)변이 옵저버 마이크로태스크 대기(mutation observer microtask queued) (불리언) 값을 가지고 있으며, 초기값은 false입니다. [HTML]

동일 출처 윈도우 에이전트는 또한 대기 중인 변이 옵저버(pending mutation observers) (0개 이상의 집합(set) MutationObserver 객체)도 가지고 있으며, 초기값은 빈 집합입니다.

변이 옵저버 마이크로태스크를 큐에 등록(queue a mutation observer microtask)하려면 다음 단계들을 실행합니다:

  1. 주변 에이전트(surrounding agent)변이 옵저버 마이크로태스크 대기가 true이면 반환합니다.

  2. 주변 에이전트변이 옵저버 마이크로태스크 대기를 true로 설정합니다.

  3. 마이크로태스크를 큐에 등록하여 마이크로태스크에서 변이 옵저버에게 알림(notify mutation observers)을 실행합니다.

변이 옵저버에게 알림(notify mutation observers)을 실행하려면 다음 단계들을 따릅니다:

  1. 주변 에이전트변이 옵저버 마이크로태스크 대기를 false로 설정합니다.

  2. notifySet복제(clone)주변 에이전트대기 중인 변이 옵저버로 설정합니다.

  3. 비움(empty)으로 주변 에이전트대기 중인 변이 옵저버를 설정합니다.

  4. signalSet복제(clone)주변 에이전트signal slots로 설정합니다.

  5. 비움(empty)으로 주변 에이전트signal slots를 설정합니다.

  6. mo에 대해 notifySet에서 반복:

    1. records복제(clone)mo레코드 큐(record queue)로 설정합니다.

    2. 비움(empty)으로 mo레코드 큐(record queue)를 설정합니다.

    3. node에 대해 mo노드 리스트(node list)에서, 모든 임시 등록 옵저버(transient registered observers)observermo인 것을 node등록 옵저버 리스트에서 제거합니다.

    4. records비어있지 않으면, 콜백 함수 호출(invoke)mo콜백(callback)에 « records, mo », "report"를 인자로 전달하고, 콜백 this 값mo로 설정합니다.

  7. slot에 대해 signalSet에서 반복, 이벤트 발생(fire event) 이름은 slotchange, bubbles 속성을 true로 하여 slot에서 발생시킵니다.


노드(node)등록 옵저버 리스트 (0개 이상의 리스트(list)로, 등록 옵저버가 포함됨)를 가지고 있으며, 초기값은 빈 리스트입니다.

등록 옵저버(registered observer)observer (MutationObserver 객체)와 옵션(options) (MutationObserverInit 딕셔너리)로 이루어집니다.

임시 등록 옵저버(transient registered observer)등록 옵저버source (등록 옵저버)가 추가된 것입니다.

임시 등록 옵저버(transient registered observers)노드자손(descendants)에 대한 변이를 추적하기 위해 사용됩니다. 노드가 제거된 뒤에도, subtree노드부모(parent)에 대해 true로 설정되어 있을 때 변이 추적이 누락되지 않도록 합니다.

4.3.1. 인터페이스 MutationObserver

[Exposed=Window]
interface MutationObserver {
  constructor(MutationCallback callback);

  undefined observe(Node target, optional MutationObserverInit options = {});
  undefined disconnect();
  sequence<MutationRecord> takeRecords();
};

callback MutationCallback = undefined (sequence<MutationRecord> mutations, MutationObserver observer);

dictionary MutationObserverInit {
  boolean childList = false;
  boolean attributes;
  boolean characterData;
  boolean subtree = false;
  boolean attributeOldValue;
  boolean characterDataOldValue;
  sequence<DOMString> attributeFilter;
};

MutationObserver 객체는 트리노드 변이를 관찰하는 데 사용할 수 있습니다.

MutationObserver 객체는 다음과 같은 연관 개념을 가집니다:

observer = new MutationObserver(callback)
MutationObserver 객체를 생성하고 콜백(callback)callback으로 설정합니다. callback은 첫 번째 인자로 MutationRecord 객체 리스트, 두 번째 인자로 생성된 MutationObserver 객체를 받아 호출됩니다. observe() 메서드로 등록된 노드에 변이가 발생한 후 호출됩니다.
observer . observe(target, options)
user agent에게 target (즉, 노드)을 관찰하고, options (객체)에 따라 변이를 보고하도록 지시합니다.

options 인자를 통해 객체의 멤버로 변이 관찰 옵션을 설정할 수 있습니다. 사용할 수 있는 멤버는 다음과 같습니다:

childList
target자식 변이를 관찰하려면 true로 설정합니다.
attributes
target속성(attributes) 변이를 관찰하려면 true로 설정합니다. attributeOldValue 또는 attributeFilter 가 명시되어 있으면 생략할 수 있습니다.
characterData
targetdata 변이를 관찰하려면 true로 설정합니다. characterDataOldValue 가 명시되어 있으면 생략할 수 있습니다.
subtree
target뿐만 아니라 target자손(descendants) 변이도 관찰하려면 true로 설정합니다.
attributeOldValue
attributes 가 true 또는 생략일 때, target속성(attribute) 변경 전 값을 기록하려면 true로 설정합니다.
characterDataOldValue
characterData 가 true 또는 생략일 때, target변경 전 data를 기록하려면 true로 설정합니다.
attributeFilter
모든 속성(attribute) 변이를 관찰하지 않아도 된다면, attributes 가 true 또는 생략일 때, 관찰할 속성의 지역 이름(local names) 리스트로 설정합니다.
observer . disconnect()
observer가 변이 관찰을 중단합니다. observe() 메서드를 다시 사용할 때까지 observer콜백(callback)은 호출되지 않습니다.
observer . takeRecords()
레코드 큐(record queue)를 비우고, 그 안에 있던 값을 반환합니다.

new MutationObserver(callback) 생성자 단계는 this콜백(callback)callback으로 설정합니다.

observe(target, options) 메서드 단계는 다음과 같습니다:

  1. options["attributeOldValue"] 또는 options["attributeFilter"] 가 존재하고, options["attributes"] 가 존재하지 않으면, options["attributes"] 를 true로 설정합니다.

  2. options["characterDataOldValue"] 가 존재하고, options["characterData"] 가 존재하지 않으면, options["characterData"] 를 true로 설정합니다.

  3. options["childList"], options["attributes"], options["characterData"] 중 어느 것도 true가 아니면 TypeError를 throw합니다.

  4. options["attributeOldValue"] 가 true이고 options["attributes"] 가 false이면 TypeError를 throw합니다.

  5. options["attributeFilter"] 가 존재하고 options["attributes"] 가 false이면 TypeError를 throw합니다.

  6. options["characterDataOldValue"] 가 true이고 options["characterData"] 가 false이면 TypeError를 throw합니다.

  7. target등록 옵저버 리스트registered에 대해, registeredobserverthis인 경우:

    1. this노드 리스트node에 대해, 임시 등록 옵저버(transient registered observers)sourceregistered인 것을 node등록 옵저버 리스트에서 제거합니다.

    2. registered옵션(options)options로 설정합니다.

  8. 그 외의 경우:

    1. 새로운 등록 옵저버(registered observer)를 생성하여 observerthis로, 옵션(options)options로 하여 target등록 옵저버 리스트에 추가합니다.

    2. 약한 참조로 targetthis노드 리스트에 추가합니다.

disconnect() 메서드 단계는 다음과 같습니다:

  1. this노드 리스트node에 대해, 등록 옵저버(registered observer)thisobserver인 것을 node등록 옵저버 리스트에서 제거합니다.

  2. this레코드 큐(record queue)를 비웁니다.

takeRecords() 메서드 단계는 다음과 같습니다:

  1. records복제(clone)this레코드 큐(record queue)로 설정합니다.

  2. this레코드 큐(record queue)를 비웁니다.

  3. records를 반환합니다.

4.3.2. 변이 레코드 큐잉

변이 레코드 큐에 등록(queue a mutation record)하려면 type 유형의 target에 대해 name, namespace, oldValue, addedNodes, removedNodes, previousSibling, nextSibling을 사용하여 다음 단계를 실행합니다:

  1. interestedObservers를 빈 맵(map)으로 설정합니다.

  2. nodestarget포괄 조상(inclusive ancestors)으로 설정합니다.

  3. nodes의 각 node에 대해, 그리고 node등록 옵저버 리스트registered에 대해:

    1. optionsregistered옵션(options)으로 설정합니다.

    2. 아래 중 하나도 true가 아니면

      이면:

      1. moregisteredobserver로 설정합니다.

      2. interestedObservers[mo]가 존재하지 않으면, null로 설정합니다.

      3. type이 "attributes"이고 options["attributeOldValue"] 가 true이거나, type이 "characterData"이고 options["characterDataOldValue"] 가 true이면, interestedObservers[mo]를 oldValue로 설정합니다.

  4. interestedObserversobservermappedOldValue에 대해:

    1. record를 새로운 MutationRecord 객체로, typetype, targettarget, attributeNamename, attributeNamespacenamespace, oldValuemappedOldValue, addedNodesaddedNodes, removedNodesremovedNodes, previousSiblingpreviousSibling, nextSiblingnextSibling으로 설정합니다.

    2. recordobserver레코드 큐(record queue)에 큐잉합니다.

    3. observer주변 에이전트(surrounding agent)대기 중인 변이 옵저버(pending mutation observers)에 추가합니다.

  5. 변이 옵저버 마이크로태스크를 큐에 등록합니다.

트리 변이 레코드 큐에 등록(queue a tree mutation record)하려면 target에 대해 addedNodes, removedNodes, previousSibling, nextSibling을 사용해서 다음 단계를 실행합니다:

  1. Assert: addedNodes 또는 removedNodes비어있지 않음.

  2. 변이 레코드 큐에 등록을 "childList" 유형으로, target에 대해 null, null, null, addedNodes, removedNodes, previousSibling, nextSibling을 인자로 실행합니다.

4.3.3. 인터페이스 MutationRecord

[Exposed=Window]
interface MutationRecord {
  readonly attribute DOMString type;
  [SameObject] readonly attribute Node target;
  [SameObject] readonly attribute NodeList addedNodes;
  [SameObject] readonly attribute NodeList removedNodes;
  readonly attribute Node? previousSibling;
  readonly attribute Node? nextSibling;
  readonly attribute DOMString? attributeName;
  readonly attribute DOMString? attributeNamespace;
  readonly attribute DOMString? oldValue;
};
record . type
"attributes"는 속성(attribute) 변이일 때 반환. "characterData"는 CharacterData 노드의 변이일 때 반환. "childList"는 트리노드 변이일 때 반환.
record . target
변이가 영향을 준 노드를 반환하며, type에 따라 다름. "attributes"일 때는 요소(element)속성(attribute)이 변경된 경우. "characterData"일 때는 CharacterData 노드가 변경된 경우. "childList"일 때는 노드자식(children)이 변경된 경우.
record . addedNodes
record . removedNodes
추가된 노드와 제거된 노드를 각각 반환합니다.
record . previousSibling
record . nextSibling
추가되거나 제거된 노드이전 형제(previous sibling)다음 형제(next sibling)를 각각 반환합니다. 없으면 null.
record . attributeName
변경된 속성의 지역 이름(local name)을 반환합니다. 없으면 null.
record . attributeNamespace
변경된 속성의 네임스페이스(namespace)를 반환합니다. 없으면 null.
record . oldValue
반환 값은 type에 따라 다릅니다. "attributes"일 경우 변경된 속성의 값(value)의 변경 전 값을 반환. "characterData"일 경우 변경된 노드data의 변경 전 값을 반환. "childList"일 경우 null을 반환.

type, target, addedNodes, removedNodes, previousSibling, nextSibling, attributeName, attributeNamespace, 그리고 oldValue 특성은 초기화된 값을 반환해야 합니다.

4.4. 인터페이스 Node

[Exposed=Window]
interface Node : EventTarget {
  const unsigned short ELEMENT_NODE = 1;
  const unsigned short ATTRIBUTE_NODE = 2;
  const unsigned short TEXT_NODE = 3;
  const unsigned short CDATA_SECTION_NODE = 4;
  const unsigned short ENTITY_REFERENCE_NODE = 5; // legacy
  const unsigned short ENTITY_NODE = 6; // legacy
  const unsigned short PROCESSING_INSTRUCTION_NODE = 7;
  const unsigned short COMMENT_NODE = 8;
  const unsigned short DOCUMENT_NODE = 9;
  const unsigned short DOCUMENT_TYPE_NODE = 10;
  const unsigned short DOCUMENT_FRAGMENT_NODE = 11;
  const unsigned short NOTATION_NODE = 12; // legacy
  readonly attribute unsigned short nodeType;
  readonly attribute DOMString nodeName;

  readonly attribute USVString baseURI;

  readonly attribute boolean isConnected;
  readonly attribute Document? ownerDocument;
  Node getRootNode(optional GetRootNodeOptions options = {});
  readonly attribute Node? parentNode;
  readonly attribute Element? parentElement;
  boolean hasChildNodes();
  [SameObject] readonly attribute NodeList childNodes;
  readonly attribute Node? firstChild;
  readonly attribute Node? lastChild;
  readonly attribute Node? previousSibling;
  readonly attribute Node? nextSibling;

  [CEReactions] attribute DOMString? nodeValue;
  [CEReactions] attribute DOMString? textContent;
  [CEReactions] undefined normalize();

  [CEReactions, NewObject] Node cloneNode(optional boolean subtree = false);
  boolean isEqualNode(Node? otherNode);
  boolean isSameNode(Node? otherNode); // legacy alias of ===

  const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01;
  const unsigned short DOCUMENT_POSITION_PRECEDING = 0x02;
  const unsigned short DOCUMENT_POSITION_FOLLOWING = 0x04;
  const unsigned short DOCUMENT_POSITION_CONTAINS = 0x08;
  const unsigned short DOCUMENT_POSITION_CONTAINED_BY = 0x10;
  const unsigned short DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
  unsigned short compareDocumentPosition(Node other);
  boolean contains(Node? other);

  DOMString? lookupPrefix(DOMString? namespace);
  DOMString? lookupNamespaceURI(DOMString? prefix);
  boolean isDefaultNamespace(DOMString? namespace);

  [CEReactions] Node insertBefore(Node node, Node? child);
  [CEReactions] Node appendChild(Node node);
  [CEReactions] Node replaceChild(Node node, Node child);
  [CEReactions] Node removeChild(Node child);
};

dictionary GetRootNodeOptions {
  boolean composed = false;
};

Node는 모든 노드에서 사용되는 추상 인터페이스입니다. 직접 인스턴스를 생성할 수 없습니다.

노드는 생성 시에 설정되는 노드 문서(node document)를 가지며, 이는 문서(document)입니다.

노드노드 문서adopt 알고리즘에 의해 변경될 수 있습니다.

노드get the parent 알고리즘은 event를 받아, 노드할당됨이면 할당 슬롯을 반환하고, 아니면 부모(parent)를 반환합니다.

노드등록 옵저버 리스트도 가집니다.


node . nodeType

node의 타입에 따라 적절한 숫자를 반환합니다:

Element
Node . ELEMENT_NODE (1)
Attr
Node . ATTRIBUTE_NODE (2)
exclusive Text node
Node . TEXT_NODE (3)
CDATASection
Node . CDATA_SECTION_NODE (4)
ProcessingInstruction
Node . PROCESSING_INSTRUCTION_NODE (7)
Comment
Node . COMMENT_NODE (8)
Document
Node . DOCUMENT_NODE (9)
DocumentType
Node . DOCUMENT_TYPE_NODE (10)
DocumentFragment
Node . DOCUMENT_FRAGMENT_NODE (11)
node . nodeName

node의 타입에 따라 적절한 문자열을 반환합니다:

Element
HTML-대문자화된 정규 이름(qualified name)
Attr
정규 이름(qualified name)
exclusive Text node
"#text"
CDATASection
"#cdata-section"
ProcessingInstruction
target
Comment
"#comment"
Document
"#document"
DocumentType
name
DocumentFragment
"#document-fragment"

nodeType getter 단계는 인터페이스 thisimplements하는 것에 따라 처음으로 일치하는 경우를 반환합니다:

Element
ELEMENT_NODE (1)
Attr
ATTRIBUTE_NODE (2)
exclusive Text node
TEXT_NODE (3)
CDATASection
CDATA_SECTION_NODE (4)
ProcessingInstruction
PROCESSING_INSTRUCTION_NODE (7)
Comment
COMMENT_NODE (8)
Document
DOCUMENT_NODE (9)
DocumentType
DOCUMENT_TYPE_NODE (10)
DocumentFragment
DOCUMENT_FRAGMENT_NODE (11)

nodeName getter 단계는 인터페이스 thisimplements하는 것에 따라 처음으로 일치하는 경우를 반환합니다:

Element
자신의 HTML-대문자화된 정규 이름
Attr
자신의 정규 이름
exclusive Text node
"#text"
CDATASection
"#cdata-section"
ProcessingInstruction
자신의 target
Comment
"#comment"
Document
"#document"
DocumentType
자신의 name
DocumentFragment
"#document-fragment"

node . baseURI
node노드 문서문서 기본 URL(document base URL)을 반환합니다.

baseURI getter 단계는 this노드 문서문서 기본 URL직렬화(serialized)하여 반환합니다.


node . isConnected

node연결됨(connected)이면 true, 아니면 false를 반환합니다.

node . ownerDocument
노드 문서(node document)를 반환합니다. 문서(document)일 경우 null을 반환합니다.
node . getRootNode()
node루트(root)를 반환합니다.
node . getRootNode({ composed:true })
node섀도우 포함 루트(shadow-including root)를 반환합니다.
node . parentNode
부모(parent)를 반환합니다.
node . parentElement
부모 요소(parent element)를 반환합니다.
node . hasChildNodes()
node자식(children)이 있는지 반환합니다.
node . childNodes
자식(children)을 반환합니다.
node . firstChild
첫 번째 자식(first child)을 반환합니다.
node . lastChild
마지막 자식(last child)을 반환합니다.
node . previousSibling
이전 형제(previous sibling)를 반환합니다.
node . nextSibling
다음 형제(next sibling)를 반환합니다.

isConnected getter 단계는 this연결됨(connected)이면 true를, 아니면 false를 반환합니다.

ownerDocument getter 단계는 this문서(document)라면 null을, 아니면 this노드 문서(node document)를 반환합니다.

문서(document)노드 문서(node document)는 그 문서(document) 자체입니다. 모든 노드(node)는 항상 노드 문서(node document)를 가집니다.

getRootNode(options) 메서드 단계는 options["composed"]가 true면 this섀도우 포함 루트(shadow-including root)를 반환하고, 아니면 this루트(root)를 반환합니다.

parentNode getter 단계는 this부모(parent)를 반환합니다.

parentElement getter 단계는 this부모 요소(parent element)를 반환합니다.

hasChildNodes() 메서드 단계는 this자식(children)이 있으면 true, 아니면 false를 반환합니다.

childNodes getter 단계는 this를 루트로 하고 자식(children)만 일치하는 NodeList를 반환합니다.

firstChild getter 단계는 this첫 번째 자식(first child)을 반환합니다.

lastChild getter 단계는 this마지막 자식(last child)을 반환합니다.

previousSibling getter 단계는 this이전 형제(previous sibling)를 반환합니다.

nextSibling getter 단계는 this다음 형제(next sibling)를 반환합니다.


nodeValue getter 단계는 인터페이스 thisimplements하는 것에 따라 아래를 반환합니다:

Attr
this값(value)
CharacterData
this데이터(data)
그 외에는
Null

nodeValue setter 단계는, 주어진 값이 null이면 빈 문자열로 취급한 후, 인터페이스 this implements에 따라 아래를 실행합니다:

Attr

기존 속성 값 설정(Set an existing attribute value)this 및 주어진 값으로 실행합니다.

CharacterData

데이터 교체(Replace data)를 node this, offset 0, count this길이(length), 그리고 데이터는 주어진 값으로 실행합니다.

그 외에는

아무 것도 하지 않습니다.

get text content노드(node) node에 대해, 인터페이스 nodeimplements하는 것에 따라 다음을 반환합니다:

DocumentFragment
Element
node자손 텍스트 내용(descendant text content)
Attr
node값(value)
CharacterData
node데이터(data)
그 외에는
Null

textContent getter 단계는 get text contentthis로 실행한 결과를 반환합니다.

string replace all는 문자열 string노드(node) parent 내에서 실행하려면 다음 단계를 따릅니다:

  1. node를 null로 설정합니다.

  2. string이 빈 문자열이 아니면 nodestringdata로 하고 노드 문서(node document)parent노드 문서(node document)로 하는 새로운 Text 노드(node)로 설정합니다.

  3. 모두 교체(Replace all)node와 함께 parent 내에서 실행합니다.

set text content노드(node) node와 문자열 value에 대해, 인터페이스 nodeimplements하는 것에 따라 아래 정의대로 실행합니다:

DocumentFragment
Element

string replace allvaluenode로 실행합니다.

Attr

기존 속성 값 설정(Set an existing attribute value)nodevalue로 실행합니다.

CharacterData

데이터 교체(Replace data)를 node node, offset 0, count node길이(length), 그리고 데이터 value로 실행합니다.

그 외에는

아무 것도 하지 않습니다.

textContent setter 단계는 주어진 값이 null이면 빈 문자열로 취급한 후, set text contentthis와 주어진 값으로 실행합니다.


node . normalize()
exclusive Text 노드를 제거하고, 남아 있는 연속 exclusive Text 노드data를 첫 번째 노드에 합칩니다.

normalize() 메서드 단계는 자손(descendant) exclusive Text 노드 node에 대해 다음을 실행합니다. 이 자손들은 this의 일부입니다:

  1. lengthnode길이(length)로 설정합니다.
  2. length가 0이면, removenode를 제거하고 다음 exclusive Text 노드로 넘어갑니다(있는 경우).
  3. datanodeconcatenationdata로 설정합니다. 대상은 node연속 exclusive Text 노드(자기 자신 제외)들, 트리 순서(tree order)대로입니다.
  4. Replace data를 node node, offset length, count 0, data data로 실행합니다.
  5. currentNodenode다음 형제(next sibling)로 설정합니다.
  6. currentNodeexclusive Text 노드인 동안:

    1. currentNodelive rangestart node일 때마다, 해당 start offsetlength를 더하고, start nodenode로 설정합니다.

    2. currentNodelive rangeend node일 때마다, 해당 end offsetlength를 더하고, end nodenode로 설정합니다.

    3. currentNode부모(parent)에서 start offsetcurrentNodeindex와 같을 때, 해당 start nodenode로, start offsetlength로 설정합니다.

    4. currentNode부모(parent)에서 end offsetcurrentNodeindex와 같을 때, 해당 end nodenode로, end offsetlength로 설정합니다.

    5. currentNode길이(length)length에 더합니다.

    6. currentNode다음 형제(next sibling)로 설정합니다.

  7. Removenode연속 exclusive Text 노드(자기 자신 제외)를 트리 순서(tree order)대로 제거합니다.

node . cloneNode([subtree = false])
node의 복사본을 반환합니다. subtree가 true면 복사본에 node자손(descendants)도 포함됩니다.
node . isEqualNode(otherNode)
nodeotherNode의 속성이 동일한지 여부를 반환합니다.
스펙에서는 모든 또는 일부 노드에 대해 cloning steps를 정의할 수 있습니다. 알고리즘은 node, copy, subtreeclone a node 알고리즘에서 전달합니다.

HTML에서는 cloning stepsinput, script, template 등 여러 요소에 대해 정의합니다. SVG도 script 요소에 대해 동일하게 해야 하지만 실제로는 하지 않습니다.

clone a node노드(node) node와 선택적 문서(document) document (기본값은 node노드 문서(node document)), boolean subtree (기본값 false), 노드(node)-또는-null parent (기본값 null), null 또는 CustomElementRegistry 객체 fallbackRegistry (기본값 null)로 실행합니다:

  1. Assert: node문서(document)가 아니거나 nodedocument이어야 합니다.

  2. copycloning a single nodenode, document, fallbackRegistry를 넘겨서 생성합니다.

  3. node에 대해 다른 적용 가능한 스펙에서 정의된 cloning steps가 있다면, node, copy, subtree를 넘겨 실행합니다.

  4. parent가 null이 아니면 appendcopyparent에 추가합니다.

  5. subtree가 true면, node자식(children) 각각에 대해 트리 순서(tree order)대로: clone a nodechild로 실행하되 documentdocument, subtreesubtree, parentcopy, fallbackRegistryfallbackRegistry로 설정합니다.

  6. node요소(element)이고, 섀도우 호스트(shadow host)이며, node섀도우 루트(shadow root)clonable이 true라면:

    1. Assert: copy섀도우 호스트(shadow host)가 아니어야 합니다.

    2. shadowRootRegistrynode섀도우 루트(shadow root)custom element registry로 설정합니다.

    3. shadowRootRegistry글로벌 custom element registry이면, shadowRootRegistrydocumenteffective global custom element registry로 설정합니다.

    4. Attach a shadow rootcopy, node섀도우 루트(shadow root)mode, true, node섀도우 루트serializable, node섀도우 루트delegates focus, node섀도우 루트slot assignment, shadowRootRegistry로 실행합니다.

    5. copy섀도우 루트(shadow root)declarativenode섀도우 루트(shadow root)declarative로 설정합니다.

    6. node섀도우 루트(shadow root)자식(children) 각각에 대해 트리 순서(tree order)대로: clone a nodechild로 실행하되 documentdocument, subtreesubtree, parentcopy섀도우 루트(shadow root)로 설정합니다.

      이는 의도적으로 fallbackRegistry 인자를 전달하지 않습니다.

  7. copy를 반환합니다.

단일 노드 복제(clone a single node)node node, document document 그리고 null 또는 CustomElementRegistry 객체 fallbackRegistry로 실행하려면:

  1. copy를 null로 설정합니다.

  2. node요소(element)라면:

    1. registrynodecustom element registry로 설정합니다.

    2. registry가 null이면 registryfallbackRegistry로 설정합니다.

    3. registry글로벌 custom element registry라면, registrydocumenteffective global custom element registry로 설정합니다.

    4. copy요소 생성 결과로 설정합니다. 인자는 document, nodelocal name, nodenamespace, nodenamespace prefix, nodeis value, false, registry입니다.

    5. attribute에 대해 nodeattribute list에서:

      1. copyAttribute단일 노드 복제(cloning a single node)attribute, document, null을 넘겨서 결과로 설정합니다.

      2. 추가(Append)copyAttributecopy에 추가합니다.

  3. 그 외에는, copy노드(node)로 설정하되, node와 동일한 인터페이스를 implements하며, 아래 추가 요구사항을 만족해야 합니다. node implements에 따라:

    Document
    1. copyencoding, content type, URL, origin, type, mode, allow declarative shadow rootsnode의 값으로 설정합니다.

    2. nodecustom element registryis scoped가 true면, copycustom element registrynode의 값으로 설정합니다.

    DocumentType

    copyname, public ID, system IDnode의 값으로 설정합니다.

    Attr

    copynamespace, namespace prefix, local name, 값(value)node의 값으로 설정합니다.

    Text
    Comment

    copydatanode의 값으로 설정합니다.

    ProcessingInstruction

    copytarget, datanode의 값으로 설정합니다.

    그 외에는

    아무 것도 하지 않습니다.

  4. Assert: copy노드(node)여야 합니다.

  5. node문서(document)라면, documentcopy로 설정합니다.

  6. copy노드 문서(node document)document로 설정합니다.

  7. copy를 반환합니다.

cloneNode(subtree) 메서드 단계는 다음과 같습니다:

  1. this섀도우 루트(shadow root)라면, throw로 "NotSupportedError" DOMException 예외를 발생시킵니다.

  2. clone a nodethissubtreesubtree로 설정하여 실행한 결과를 반환합니다.

노드(node) A같음(equals)노드 B에 대해 다음 모든 조건이 true일 때입니다:

isEqualNode(otherNode) 메서드 단계는 otherNode가 null이 아니고, thisequals otherNode라면 true를, 아니면 false를 반환합니다.

isSameNode(otherNode) 메서드 단계는 otherNodethis이면 true를, 아니면 false를 반환합니다.


node . compareDocumentPosition(other)
othernode에 대해 어떤 위치에 있는지 비트마스크로 반환합니다. 설정될 수 있는 비트는 다음과 같습니다:
Node . DOCUMENT_POSITION_DISCONNECTED (1)
nodeother가 동일한 트리(tree)에 속하지 않을 때 설정됩니다.
Node . DOCUMENT_POSITION_PRECEDING (2)
othernode이전(preceding)에 있을 때 설정됩니다.
Node . DOCUMENT_POSITION_FOLLOWING (4)
othernode다음(following)에 있을 때 설정됩니다.
Node . DOCUMENT_POSITION_CONTAINS (8)
othernode조상(ancestor)일 때 설정됩니다.
Node . DOCUMENT_POSITION_CONTAINED_BY (16, 10진수로 16, 16진수로 10)
othernode자손(descendant)일 때 설정됩니다.
node . contains(other)
othernode포함 자손(inclusive descendant)이면 true를, 아니면 false를 반환합니다.

아래는 compareDocumentPosition() 이 마스크로 반환하는 상수들입니다:

compareDocumentPosition(other) 메서드 단계:

  1. thisother와 같으면 0을 반환합니다.

  2. node1other로, node2this로 설정합니다.

  3. attr1attr2를 null로 설정합니다.

  4. node1속성(attribute)이면 attr1node1로 하고, node1attr1element로 설정합니다.

  5. node2속성(attribute)이면:

    1. attr2node2로, node2attr2element로 설정합니다.

    2. attr1node1이 null이 아니고, node2node1와 같으면:

      1. attr에 대해 node2attribute list에서:

        1. attrequals attr1이면, DOCUMENT_POSITION_IMPLEMENTATION_SPECIFICDOCUMENT_POSITION_PRECEDING 을 더한 값을 반환합니다.

        2. attrequals attr2이면, DOCUMENT_POSITION_IMPLEMENTATION_SPECIFICDOCUMENT_POSITION_FOLLOWING 을 더한 값을 반환합니다.

  6. node1 또는 node2가 null이거나, node1루트(root)node2루트(root)와 다르면, DOCUMENT_POSITION_DISCONNECTED, DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC, 그리고 DOCUMENT_POSITION_PRECEDING 또는 DOCUMENT_POSITION_FOLLOWING 중 하나를 더해 반환합니다(일관성 있게).

    어떤 값을 반환할지는 보통 포인터 비교로 결정합니다. 자바스크립트 구현에서는 캐시된 Math.random() 값을 사용할 수 있습니다.

  7. node1조상(ancestor)이고 attr1이 null이거나, node1node2와 같고 attr2가 null이 아니면 DOCUMENT_POSITION_CONTAINSDOCUMENT_POSITION_PRECEDING 을 더해 반환합니다.

  8. node1자손(descendant)이고 attr2가 null이거나, node1node2와 같고 attr1이 null이 아니면 DOCUMENT_POSITION_CONTAINED_BYDOCUMENT_POSITION_FOLLOWING 을 더해 반환합니다.

  9. 만약 node1node2 앞에 오는 경우, DOCUMENT_POSITION_PRECEDING을 반환합니다.

    이 알고리즘에서 속성을 처리하는 방식 때문에, 속성이 동일한 트리참여하지 않음에도 불구하고, 노드속성은 해당 노드자식보다 앞에 오는 것으로 간주됩니다.

  10. DOCUMENT_POSITION_FOLLOWING 을 반환합니다.

contains(other) 메서드 단계는 other포함 자손(inclusive descendant)이면 true, 아니면 false를 반환합니다 (null일 때도 false).


네임스페이스 접두사 찾기(locate a namespace prefix)element에서 namespace로 실행하려면 다음 단계를 수행합니다:

  1. element네임스페이스(namespace)namespace와 같고, 네임스페이스 접두사(namespace prefix)가 null이 아니면, 네임스페이스 접두사를 반환합니다.

  2. element다음 조건을 만족하는 속성(attribute)을 가지고 있으면: 속성(attribute)네임스페이스 접두사가 "xmlns"이고, 값(value)namespace이면, element의 첫 번째 해당 속성(attribute)지역 이름(local name)을 반환합니다.

  3. element부모 요소(parent element)가 null이 아니면, 그 요소(element)에 대해 namespace네임스페이스 접두사 찾기를 실행한 결과를 반환합니다.

  4. null을 반환합니다.

네임스페이스 찾기(locate a namespace)node에서 prefix로 실행하려면, node가 구현하는 인터페이스에 따라 다음을 실행합니다:

Element
  1. prefix가 "xml"이면 XML 네임스페이스를 반환합니다.

  2. prefix가 "xmlns"이면 XMLNS 네임스페이스를 반환합니다.

  3. 네임스페이스가 null이 아니고, 네임스페이스 접두사가 prefix와 같으면 네임스페이스를 반환합니다.

  4. 다음 조건을 만족하는 속성(attribute)을 가지고 있으면: 속성(attribute)네임스페이스(namespace)가 XMLNS 네임스페이스이고, 네임스페이스 접두사가 "xmlns"이고, 지역 이름(local name)prefix와 같거나, prefix가 null이고 다음 조건을 만족하는 속성(attribute)을 가지고 있으면: 속성(attribute)의 네임스페이스가 XMLNS 네임스페이스이고, 네임스페이스 접두사가 null이고, 지역 이름이 "xmlns"이면, 값이 빈 문자열이 아니면 그 값을 반환하고, 아니면 null을 반환합니다.

  5. 부모 요소가 null이면 null을 반환합니다.

  6. 부모 요소에 대해 prefix로 네임스페이스 찾기를 실행한 결과를 반환합니다.

Document
  1. 문서 요소(document element)가 null이면 null을 반환합니다.

  2. 문서 요소(document element)에 대해 prefix로 네임스페이스 찾기를 실행한 결과를 반환합니다.

DocumentType
DocumentFragment

null을 반환합니다.

Attr
  1. 속성의 요소가 null이면 null을 반환합니다.

  2. 해당 요소에 대해 prefix로 네임스페이스 찾기를 실행한 결과를 반환합니다.

그 외의 경우
  1. 부모 요소가 null이면 null을 반환합니다.

  2. 부모 요소에 대해 prefix로 네임스페이스 찾기를 실행한 결과를 반환합니다.

lookupPrefix(namespace) 메서드 단계:

  1. namespace가 null이거나 빈 문자열이면 null을 반환합니다.

  2. this가 구현하는 인터페이스에 따라 다음을 실행합니다:

    Element

    this에 대해 namespace로 네임스페이스 접두사 찾기를 실행한 결과를 반환합니다.

    Document
    1. 문서 요소(document element)가 null이면 null을 반환합니다.

    2. 문서 요소(document element)에 대해 namespace로 네임스페이스 접두사 찾기를 실행한 결과를 반환합니다.

    DocumentType
    DocumentFragment

    null을 반환합니다.

    Attr
    1. 속성의 요소가 null이면 null을 반환합니다.

    2. 해당 요소에 대해 namespace로 네임스페이스 접두사 찾기를 실행한 결과를 반환합니다.

    그 외의 경우
    1. 부모 요소가 null이면 null을 반환합니다.

    2. 부모 요소에 대해 namespace로 네임스페이스 접두사 찾기를 실행한 결과를 반환합니다.

lookupNamespaceURI(prefix) 메서드 단계:

  1. prefix가 빈 문자열이면 null로 설정합니다.

  2. this에 대해 prefix로 네임스페이스 찾기를 실행한 결과를 반환합니다.

isDefaultNamespace(namespace) 메서드 단계:

  1. namespace가 빈 문자열이면 null로 설정합니다.

  2. defaultNamespace를 null로 this에 대해 네임스페이스 찾기를 실행한 결과로 설정합니다.

  3. defaultNamespace가 namespace와 같으면 true, 아니면 false를 반환합니다.


insertBefore(node, child) 메서드 단계는 child 앞에 node를 this에 pre-insert한 결과를 반환합니다.

appendChild(node) 메서드 단계는 node를 this에 append한 결과를 반환합니다.

replaceChild(node, child) 메서드 단계는 childnode로 this 내에서 replace한 결과를 반환합니다.

removeChild(child) 메서드 단계는 child를 this에서 pre-remove한 결과를 반환합니다.


qualifiedName qualifiedName를 가진 요소 목록(list of elements with qualified name)노드(node) root에 대해 다음 알고리즘으로 얻은 HTMLCollection입니다:

  1. qualifiedName이 U+002A(*)이면 root를 루트로 하고, 필터가 자손(descendant) 요소(elements)만 일치하는 HTMLCollection을 반환합니다.

  2. 그 외에 root노드 문서(node document)HTML 문서이면, root를 루트로 하고 필터가 다음 자손(descendant) 요소(elements)만 일치하는 HTMLCollection을 반환합니다:

  3. 그 외의 경우, root를 루트로 하고 필터가 자손(descendant) 요소(elements)qualified namequalifiedName인 요소만 일치하는 HTMLCollection을 반환합니다.

같은 인자로 호출하면, root노드 문서(node document)type이 변하지 않는 한, 이전 호출과 동일한 HTMLCollection 객체가 반환될 수 있습니다.

네임스페이스 namespace와 지역 이름(local name) localName을 가진 요소 목록(list of elements with namespace and local name)노드(node) root에 대해 다음 알고리즘으로 얻은 HTMLCollection입니다:

  1. namespace가 빈 문자열이면 null로 설정합니다.

  2. namespacelocalName이 모두 U+002A(*)이면, root를 루트로 하고 자손(descendant) 요소(elements)만 일치하는 HTMLCollection을 반환합니다.

  3. namespace가 U+002A(*)이면, root를 루트로 하고 자손(descendant) 요소(elements)지역 이름(local name)localName인 요소만 일치하는 HTMLCollection을 반환합니다.

  4. localName이 U+002A(*)이면, root를 루트로 하고 자손(descendant) 요소(elements)네임스페이스(namespace)namespace인 요소만 일치하는 HTMLCollection을 반환합니다.

  5. root를 루트로 하고 자손(descendant) 요소(elements)네임스페이스(namespace)namespace이고, 지역 이름(local name)localName인 요소만 일치하는 HTMLCollection을 반환합니다.

같은 인자로 호출하면, 이전 호출과 동일한 HTMLCollection 객체가 반환될 수 있습니다.

classNames classNames를 가진 요소 목록(list of elements with class names)노드(node) root에 대해 다음 알고리즘으로 얻은 HTMLCollection입니다:

  1. classesclassNames에 대해 ordered set parser를 실행한 결과로 설정합니다.
  2. classes가 빈 집합이면, 빈 HTMLCollection을 반환합니다.
  3. root를 루트로 하고 필터가 자손(descendant) 요소(elements) 중 모든 클래스(class)classes에 포함된 요소만 일치하는 HTMLCollection을 반환합니다.

    클래스 비교는 root노드 문서(node document)mode가 "quirks"이면 ASCII 대소문자 구분 없음으로 비교하고, 아니면 동일 문자열로 비교해야 합니다.

같은 인자로 호출하면, 이전 호출과 동일한 HTMLCollection 객체가 반환될 수 있습니다.

4.5. 인터페이스 Document

[Exposed=Window]
interface Document : Node {
  constructor();

  [SameObject] readonly attribute DOMImplementation implementation;
  readonly attribute USVString URL;
  readonly attribute USVString documentURI;
  readonly attribute DOMString compatMode;
  readonly attribute DOMString characterSet;
  readonly attribute DOMString charset; // legacy alias of .characterSet
  readonly attribute DOMString inputEncoding; // legacy alias of .characterSet
  readonly attribute DOMString contentType;

  readonly attribute DocumentType? doctype;
  readonly attribute Element? documentElement;
  HTMLCollection getElementsByTagName(DOMString qualifiedName);
  HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);

  [CEReactions, NewObject] Element createElement(DOMString localName, optional (DOMString or ElementCreationOptions) options = {});
  [CEReactions, NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName, optional (DOMString or ElementCreationOptions) options = {});
  [NewObject] DocumentFragment createDocumentFragment();
  [NewObject] Text createTextNode(DOMString data);
  [NewObject] CDATASection createCDATASection(DOMString data);
  [NewObject] Comment createComment(DOMString data);
  [NewObject] ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data);

  [CEReactions, NewObject] Node importNode(Node node, optional (boolean or ImportNodeOptions) options = false);
  [CEReactions] Node adoptNode(Node node);

  [NewObject] Attr createAttribute(DOMString localName);
  [NewObject] Attr createAttributeNS(DOMString? namespace, DOMString qualifiedName);

  [NewObject] Event createEvent(DOMString interface); // legacy

  [NewObject] Range createRange();

  // NodeFilter.SHOW_ALL = 0xFFFFFFFF
  [NewObject] NodeIterator createNodeIterator(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);
  [NewObject] TreeWalker createTreeWalker(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);
};

[Exposed=Window]
interface XMLDocument : Document {};

dictionary ElementCreationOptions {
  CustomElementRegistry customElementRegistry;
  DOMString is;
};

dictionary ImportNodeOptions {
  CustomElementRegistry customElementRegistry;
  boolean selfOnly = false;
};

Document 노드는 간단히 문서(document)라고 불립니다.

문서(document)노드 문서(node document)는 자기 자신입니다.

문서(document)인코딩(encoding)(encoding), 콘텐츠 타입(content type)(문자열), URL(URL), origin(origin), 타입(type)("xml" 또는 "html"), 모드(mode)("no-quirks", "quirks", 또는 "limited-quirks"), 선언적 섀도우 루트 허용(allow declarative shadow roots)(불리언), 커스텀 요소 레지스트리(custom element registry)(null 또는 CustomElementRegistry 객체)을 가집니다. [ENCODING] [URL] [HTML]

별도의 언급이 없는 한, 문서(document)인코딩(encoding)utf-8 encoding이고, 콘텐츠 타입(content type)은 "application/xml", URL은 "about:blank", origin불투명(origin opaque)이고, 타입(type)은 "xml", 모드(mode)는 "no-quirks", 선언적 섀도우 루트 허용(allow declarative shadow roots)은 false, 커스텀 요소 레지스트리(custom element registry)는 null입니다.

문서(document)타입(type)이 "xml"이면 XML 문서(XML document)라 하고, 그렇지 않으면 HTML 문서(HTML document)라 합니다. 문서(document)HTML 문서인지 XML 문서인지에 따라 일부 API 동작이 달라집니다.

문서(document)모드(mode)가 "no-quirks"면 no-quirks 모드(no-quirks mode), "quirks"면 quirks 모드(quirks mode), "limited-quirks"면 limited-quirks 모드(limited-quirks mode)라고 합니다.

모드(mode)는 기본값에서 달라지는 경우는 문서(document)HTML 파서(HTML parser)에 의해 DOCTYPE 문자열의 존재, 부재 또는 값에 따라 생성될 때, 그리고 새로운 탐색 컨텍스트(browsing context)(초기 "about:blank")에서만 변경됩니다. [HTML]

No-quirks 모드는 원래 "standards mode"로 불렸고, limited-quirks 모드는 한때 "almost standards mode"로 불렸습니다. 이제 표준에 의해 세부사항이 정의되므로 이름이 변경되었습니다. (그리고 Ian Hickson은 원래 이름이 말이 안 된다는 이유로 반대했습니다.)

문서(document)get the parent 알고리즘은 event를 받아, eventtype 속성 값이 "load"이거나 문서(document)탐색 컨텍스트(browsing context)가 없으면 null을 반환하고, 그렇지 않으면 문서(document)관련 전역 객체(relevant global object)를 반환합니다.


document = new Document()
새로운 문서(document)를 반환합니다.
document . implementation
documentDOMImplementation 객체를 반환합니다.
document . URL
document . documentURI
documentURL을 반환합니다.
document . compatMode
documentmode가 "quirks"이면 문자열 "BackCompat"을, 아니면 "CSS1Compat"을 반환합니다.
document . characterSet
document인코딩(encoding)을 반환합니다.
document . contentType
document콘텐츠 타입(content type)을 반환합니다.

new Document() 생성자(constructor) 단계는 thisoriginorigin으로 설정하는 것입니다. 이 origin은 현재 전역 객체(current global object)연관 Document의 origin입니다. [HTML]

createDocument()와 달리, 이 생성자는 XMLDocument 객체를 반환하지 않고, 문서(document) (Document 객체)를 반환합니다.

implementation getter 단계는 this와 연관된 DOMImplementation 객체를 반환합니다.

URLdocumentURI getter 단계는 thisURL직렬화(serialized)하여 반환합니다.

compatMode getter 단계는 thismode가 "quirks"이면 "BackCompat"을, 아니면 "CSS1Compat"을 반환합니다.

characterSet, charset, 그리고 inputEncoding getter 단계는 this인코딩(encoding)이름(name)을 반환합니다.

contentType getter 단계는 this콘텐츠 타입(content type)을 반환합니다.


document . doctype
doctype를 반환하며, 없으면 null을 반환합니다.
document . documentElement
문서 요소(document element)를 반환합니다.
collection = document . getElementsByTagName(qualifiedName)

qualifiedName이 "*"이면 모든 자손(descendant) 요소(elements)HTMLCollection을 반환합니다.

그 외의 경우, qualifiedName과 일치하는 모든 자손(descendant) 요소(elements)HTMLCollection을 반환합니다. (HTML 문서 내에서 요소(elements)HTML 네임스페이스에 속하면 대소문자를 구분하지 않고 일치합니다.)

collection = document . getElementsByTagNameNS(namespace, localName)

namespacelocalName이 모두 "*"이면 모든 자손(descendant) 요소(elements)HTMLCollection을 반환합니다.

namespace만 "*"이면 모든 자손(descendant) 요소(elements)지역 이름(local name)localName인 것의 HTMLCollection을 반환합니다.

localName만 "*"이면 모든 자손(descendant) 요소(elements)네임스페이스(namespace)namespace인 것의 HTMLCollection을 반환합니다.

그 외의 경우, 자손(descendant) 요소(elements)네임스페이스(namespace)namespace이고 지역 이름(local name)localName인 것의 HTMLCollection을 반환합니다.

collection = document . getElementsByClassName(classNames)
collection = element . getElementsByClassName(classNames)

메서드가 호출된 객체(문서 또는 요소)에서 classNames에 주어진 모든 클래스를 가진 요소(elements)HTMLCollection을 반환합니다. classNames 인자는 공백으로 구분된 클래스 리스트로 해석됩니다.

doctype getter 단계는 자식(child)thisdoctype인 것을 반환하고, 없으면 null을 반환합니다.

documentElement getter 단계는 this문서 요소(document element)를 반환합니다.

getElementsByTagName(qualifiedName) 메서드 단계는 qualifiedName qualifiedName을 가진 요소 목록this에서 반환합니다.

즉, HTML 문서에서는 document.getElementsByTagName("FOO") 호출 시 <FOO> 요소(HTML 네임스페이스가 아닌 것)와 <foo> 요소(HTML 네임스페이스인 것)는 일치하지만, <FOO> 요소(HTML 네임스페이스인 것)는 일치하지 않습니다.

getElementsByTagNameNS(namespace, localName) 메서드 단계는 네임스페이스 namespace 및 지역 이름 localName을 가진 요소 목록this에서 반환합니다.

getElementsByClassName(classNames) 메서드 단계는 classNames classNames을 가진 요소 목록this에서 반환합니다.

다음 XHTML 조각이 있다고 가정합니다:
<div id="example">
  <p id="p1" class="aaa bbb"/>
  <p id="p2" class="aaa ccc"/>
  <p id="p3" class="bbb ccc"/>
</div>

document.getElementById("example").getElementsByClassName("aaa") 을 호출하면 HTMLCollection 객체에 p1p2 두 개의 단락이 포함됩니다.

getElementsByClassName("ccc bbb") 을 호출하면 p3 한 개의 노드만 반환됩니다. 또한 document.getElementById("example").getElementsByClassName("bbb ccc ") 을 호출해도 같은 결과가 나옵니다.

getElementsByClassName("aaa,bbb") 을 호출하면 아무 노드도 반환되지 않습니다. 위 요소들 중 aaa,bbb 클래스를 가진 것은 없습니다.


element = document . createElement(localName [, options])

localName지역 이름(local name)으로 가지는 요소(element)를 반환합니다. (documentHTML 문서라면, localName은 소문자로 변환됩니다.) 요소네임스페이스(namespace)documentHTML 문서이거나 document콘텐츠 타입(content type)이 "application/xhtml+xml"일 때 HTML 네임스페이스고, 그 외에는 null입니다.

optionscustomElementRegistry 를 제공하면 CustomElementRegistry를 설정할 수 있습니다.

optionsis 를 제공하면 커스터마이즈드 내장 요소(customized built-in element)를 생성할 수 있습니다.

localName유효한 요소 지역 이름(valid element local name)이 아니면 "InvalidCharacterError" DOMException이 발생합니다.

optionscustomElementRegistryis 모두가 제공되면, "NotSupportedError" DOMException이 발생합니다.

element = document . createElementNS(namespace, qualifiedName [, options])

네임스페이스(namespace)namespace요소(element)를 반환합니다. 네임스페이스 접두사(namespace prefix)qualifiedName에서 U+003A(:) 앞부분이거나, 없으면 null입니다. 지역 이름(local name)qualifiedName에서 U+003A(:) 뒷부분이거나, 없으면 qualifiedName입니다.

optionscustomElementRegistry 를 제공하면 CustomElementRegistry를 설정할 수 있습니다.

optionsis 를 제공하면 커스터마이즈드 내장 요소(customized built-in element)를 생성할 수 있습니다.

qualifiedName이 (접두사가 있을 수 있는) 유효한 요소 지역 이름(valid element local name)이 아니면 "InvalidCharacterError" DOMException이 발생합니다.

다음 조건 중 하나라도 참이면 "NamespaceError" DOMException이 발생합니다:

optionscustomElementRegistryis 모두가 제공되면, "NotSupportedError" DOMException이 발생합니다.

documentFragment = document . createDocumentFragment()
DocumentFragment 노드(node)를 반환합니다.
text = document . createTextNode(data)
datadataText 노드(node)를 반환합니다.
text = document . createCDATASection(data)
datadataCDATASection 노드(node)를 반환합니다.
comment = document . createComment(data)
datadataComment 노드(node)를 반환합니다.
processingInstruction = document . createProcessingInstruction(target, data)
targettarget이고, datadataProcessingInstruction 노드(node)를 반환합니다. targetName 생성식에 맞지 않으면 "InvalidCharacterError" DOMException이 발생합니다. data에 "?>"가 포함되어 있으면 "InvalidCharacterError" DOMException이 발생합니다.

namenamespace에 대해 특별한 언급이 없는 한 그 요소 인터페이스(element interface)Element입니다.

예를 들어 HTML 표준에서는 htmlHTML 네임스페이스에 대해 HTMLHtmlElement 인터페이스를 사용한다고 정의합니다. [HTML]

createElement(localName, options) 메서드 단계는 다음과 같습니다:

  1. localName유효한 요소 지역 이름(valid element local name)이 아니면 throw로 "InvalidCharacterError" DOMException을 발생시킵니다.

  2. thisHTML 문서이면, localNameASCII 소문자로 변환합니다.

  3. registryis요소 생성 옵션 평탄화(flattening element creation options)optionsthis를 넘겨 얻습니다.

  4. namespaceHTML 네임스페이스로 설정합니다. thisHTML 문서이거나 this콘텐츠 타입(content type)이 "application/xhtml+xml"이면, 아니면 null로 합니다.

  5. 요소 생성(creating an element)this, localName, namespace, null, is, true, registry로 실행한 결과를 반환합니다.

내부 createElementNS 단계document, namespace, qualifiedName, options을 받아 다음을 수행합니다:

  1. (namespace, prefix, localName)를 "element"로 네임스페이스와 qualifiedName의 유효성 검증 및 추출(validating and extracting)을 통해 얻습니다.

  2. registryisoptionsthis요소 생성 옵션 평탄화(flattening element creation options)를 실행해 얻습니다.

  3. 요소 생성(creating an element)document, localName, namespace, prefix, is, true, registry로 실행한 결과를 반환합니다.

createElementNS(namespace, qualifiedName, options) 메서드 단계는 내부 createElementNS 단계this, namespace, qualifiedName, options로 실행한 결과를 반환합니다.

문자열 또는 ElementCreationOptions 딕셔너리 optionsdocument document요소 생성 옵션 평탄화(flatten element creation options)를 하려면:

  1. registry를 null로 설정합니다.

  2. is를 null로 설정합니다.

  3. options가 딕셔너리라면:

    1. options["customElementRegistry"]가 존재(exists)하면 registry를 그 값으로 설정합니다.

    2. registryis scoped가 false이고 registrydocumentcustom element registry와 다르면, throw로 "NotSupportedError" DOMException을 발생시킵니다.

    3. options["is"]가 존재(exists)하면 is를 그 값으로 설정합니다.

    4. registry가 null이 아니고 is도 null이 아니면 throw로 "NotSupportedError" DOMException을 발생시킵니다.

  4. registry가 null이면, document커스텀 요소 레지스트리 조회(looking up a custom element registry)를 실행해 registry로 설정합니다.

  5. registryis를 반환합니다.

createElement()createElementNS()options 매개변수는 웹 호환성을 위해 문자열도 허용됩니다.

createDocumentFragment() 메서드 단계는 새로운 DocumentFragment 노드(node)를 반환하며, 노드 문서(node document)this입니다.

createTextNode(data) 메서드 단계는 Text 노드(node)를 새로 반환하며, datadata, 노드 문서(node document)this입니다.

createCDATASection(data) 메서드 단계는 다음과 같습니다:

  1. thisHTML 문서이면, throw로 "NotSupportedError" DOMException을 발생시킵니다.

  2. data에 "]]>" 문자열이 포함되어 있으면 throw로 "InvalidCharacterError" DOMException을 발생시킵니다.

  3. CDATASection 노드(node)를 새로 반환하며, datadata로 설정, 노드 문서(node document)this로 설정합니다.

createComment(data) 메서드 단계는 Comment 노드(node)를 새로 반환하며, datadata, 노드 문서(node document)this입니다.

createProcessingInstruction(target, data) 메서드 단계는 다음과 같습니다:

  1. targetName 생성식에 맞지 않으면, throw로 "InvalidCharacterError" DOMException을 발생시킵니다.
  2. data에 "?>" 문자열이 포함되어 있으면, throw로 "InvalidCharacterError" DOMException을 발생시킵니다.
  3. ProcessingInstruction 노드(node)를 새로 반환하며, targettarget, datadata, 노드 문서(node document)this로 설정합니다.

clone = document . importNode(node [, options = false])

node의 복사본을 반환합니다. options가 true이거나 options가 딕셔너리이고 selfOnly 가 false이면, 복사본에는 node자손(descendants)도 포함됩니다.

optionscustomElementRegistry 를 사용하여, 요소가 커스텀 요소 레지스트리가 없을 때 설정할 수 있습니다.

node문서(document) 또는 섀도 루트(shadow root)라면, "NotSupportedError" DOMException이 발생합니다.

node = document . adoptNode(node)

node를 다른 문서(document)에서 옮기고 반환합니다.

node문서(document)라면, "NotSupportedError" DOMException이 발생하고, node섀도 루트(shadow root)라면, "HierarchyRequestError" DOMException이 발생합니다.

importNode(node, options) 메서드 단계는 다음과 같습니다:

  1. node문서(document) 또는 섀도 루트(shadow root)라면 throw로 "NotSupportedError" DOMException을 발생시킵니다.

  2. subtree를 false로 설정합니다.

  3. registry를 null로 설정합니다.

  4. options가 불리언이면 subtreeoptions로 설정합니다.

  5. 그 외의 경우:

    1. subtreeoptions["selfOnly"]의 부정으로 설정합니다.

    2. options["customElementRegistry"]가 존재(exists)하면 registry를 그 값으로 설정합니다.

    3. registryis scoped가 false이고, registrythiscustom element registry와 다르면, throw로 "NotSupportedError" DOMException을 발생시킵니다.

  6. registry가 null이면, 커스텀 요소 레지스트리 조회(looking up a custom element registry)this로 실행해 registry로 설정합니다.

  7. 노드 복제(cloning a node)node에 대해 실행합니다. documentthis, subtreesubtree, fallbackRegistryregistry로 설정합니다.

명세(specifications)는 모든 또는 일부 노드(node)에 대해 adopting steps를 정의할 수 있습니다. 알고리즘은 adopt 알고리즘에서 nodeoldDocument를 전달받아 실행합니다.

노드 채택(adopt) 알고리즘은 nodedocument로 채택하기 위해 다음 단계를 실행합니다:

  1. oldDocumentnode노드 문서(node document)로 설정합니다.

  2. node부모(parent)가 null이 아니면 remove node를 실행합니다.

  3. documentoldDocument와 다르면:

    1. node섀도 포함(inclusive) 자손들 각각에 대해:

      1. inclusiveDescendant노드 문서(node document)document로 설정합니다.

      2. inclusiveDescendant섀도 루트(shadow root)이고 inclusiveDescendant커스텀 요소 레지스트리(custom element registry)글로벌(global) 커스텀 요소 레지스트리라면, inclusiveDescendant커스텀 요소 레지스트리document효과적인 글로벌 커스텀 요소 레지스트리로 설정합니다.

      3. 그 외에 inclusiveDescendant요소(element)이면:

        1. inclusiveDescendant속성(attribute) 리스트 내 각 속성(attribute)노드 문서(node document)document로 설정합니다.

        2. inclusiveDescendant커스텀 요소 레지스트리(custom element registry)글로벌(global) 커스텀 요소 레지스트리라면, inclusiveDescendant커스텀 요소 레지스트리document효과적인 글로벌 커스텀 요소 레지스트리로 설정합니다.

    2. node섀도 포함(inclusive) 자손들커스텀(custom)인 것 각각에 대해, 커스텀 요소 콜백 리액션(enqueue a custom element callback reaction)inclusiveDescendant, 콜백 이름 "adoptedCallback", 그리고 « oldDocument, document »로 실행합니다.

    3. node섀도 포함(inclusive) 자손들 각각에 대해, 섀도 포함 트리 순서(shadow-including tree order)adopting stepsinclusiveDescendantoldDocument로 실행합니다.

adoptNode(node) 메서드 단계는 다음과 같습니다:

  1. node문서(document)라면, throw로 "NotSupportedError" DOMException을 발생시킵니다.

  2. node섀도 루트(shadow root)라면, throw로 "HierarchyRequestError" DOMException을 발생시킵니다.

  3. nodeDocumentFragment 노드(node)이고 host가 null이 아니면, 반환합니다.

  4. adopt 알고리즘을 사용해 nodethis로 채택합니다.

  5. node를 반환합니다.


null 또는 CustomElementRegistry 객체 registry글로벌 커스텀 요소 레지스트리(global custom element registry)인지 여부는 registry가 null이 아니고, registryis scoped가 false면 참입니다.

문서(document) document효과적인 글로벌 커스텀 요소 레지스트리(effective global custom element registry)는 다음과 같습니다:

  1. document커스텀 요소 레지스트리(custom element registry)글로벌 커스텀 요소 레지스트리라면, document커스텀 요소 레지스트리를 반환합니다.

  2. null을 반환합니다.


createAttribute(localName) 메서드 단계는 다음과 같습니다:

  1. localName유효한 속성 지역 이름(valid attribute local name)이 아니면, throw로 "InvalidCharacterError" DOMException을 발생시킵니다.

  2. thisHTML 문서라면, localNameASCII 소문자로 변환합니다.
  3. 새로운 속성(attribute)을 반환합니다. 지역 이름(local name)localName이고, 노드 문서(node document)this입니다.

createAttributeNS(namespace, qualifiedName) 메서드 단계는 다음과 같습니다:

  1. (namespace, prefix, localName)를 "attribute"로 네임스페이스와 qualifiedName의 유효성 검증 및 추출(validating and extracting)을 통해 얻습니다.

  2. 새로운 속성(attribute)을 반환합니다. 네임스페이스(namespace)namespace, 네임스페이스 접두사(namespace prefix)prefix, 지역 이름(local name)localName, 노드 문서(node document)this입니다.


createEvent(interface) 메서드 단계는 다음과 같습니다:

  1. constructor를 null로 설정합니다.

  2. interface가 아래 표 첫 번째 열의 문자열과 ASCII 대소문자 구분 없이 일치하면, 해당 행의 두 번째 열 인터페이스를 constructor로 설정합니다:

    문자열 인터페이스 비고
    "beforeunloadevent" BeforeUnloadEvent [HTML]
    "compositionevent" CompositionEvent [UIEVENTS]
    "customevent" CustomEvent
    "devicemotionevent" DeviceMotionEvent [DEVICE-ORIENTATION]
    "deviceorientationevent" DeviceOrientationEvent
    "dragevent" DragEvent [HTML]
    "event" Event
    "events"
    "focusevent" FocusEvent [UIEVENTS]
    "hashchangeevent" HashChangeEvent [HTML]
    "htmlevents" Event
    "keyboardevent" KeyboardEvent [UIEVENTS]
    "messageevent" MessageEvent [HTML]
    "mouseevent" MouseEvent [UIEVENTS]
    "mouseevents"
    "storageevent" StorageEvent [HTML]
    "svgevents" Event
    "textevent" TextEvent [UIEVENTS]
    "touchevent" TouchEvent [TOUCH-EVENTS]
    "uievent" UIEvent [UIEVENTS]
    "uievents"
  3. constructor가 null이면 throw로 "NotSupportedError" DOMException을 발생시킵니다.

  4. constructor가 가리키는 인터페이스가 this의 관련 전역 객체(relevant global object)에 노출되어 있지 않으면, throw로 "NotSupportedError" DOMException을 발생시킵니다.

    일반적으로 사용자 에이전트는 일부 설정에서 터치 이벤트 지원을 비활성화하므로, 이 경우 TouchEvent 인터페이스에 대해 이 절이 적용됩니다.

  5. event이벤트 생성(creating an event) 알고리즘으로 constructor를 넘겨 실행한 결과로 설정합니다.

  6. eventtype 속성 값을 빈 문자열로 초기화합니다.

  7. eventtimeStamp 속성 값을 현재 고해상도 시간(current high resolution time) 알고리즘을 this관련 전역 객체(relevant global object)로 호출한 결과로 초기화합니다.

  8. eventisTrusted 속성 값을 false로 초기화합니다.

  9. eventinitialized flag를 해제합니다.

  10. event를 반환합니다.

Event 생성자를 사용하는 것이 더 바람직합니다.


createRange() 메서드 단계는 (this, 0)을 시작점(start)끝점(end)으로 가지는 새로운 라이브 범위(live range)를 반환합니다.

Range() 생성자를 대신 사용할 수 있습니다.


createNodeIterator(root, whatToShow, filter) 메서드 단계는 다음과 같습니다:

  1. iterator를 새로운 NodeIterator 객체로 설정합니다.

  2. iteratorrootiteratorreferenceroot로 설정합니다.

  3. iteratorpointer before reference를 true로 설정합니다.

  4. iteratorwhatToShowwhatToShow로 설정합니다.

  5. iteratorfilterfilter로 설정합니다.

  6. iterator를 반환합니다.

createTreeWalker(root, whatToShow, filter) 메서드 단계는 다음과 같습니다:

  1. walker를 새로운 TreeWalker 객체로 설정합니다.

  2. walkerrootwalkercurrentroot로 설정합니다.

  3. walkerwhatToShowwhatToShow로 설정합니다.

  4. walkerfilterfilter로 설정합니다.

  5. walker를 반환합니다.

4.5.1. 인터페이스 DOMImplementation

사용자 에이전트는 문서(document)가 생성될 때마다 DOMImplementation 객체를 생성해야 하며, 해당 문서(document)에 연관시켜야 합니다.

[Exposed=Window]
interface DOMImplementation {
  [NewObject] DocumentType createDocumentType(DOMString name, DOMString publicId, DOMString systemId);
  [NewObject] XMLDocument createDocument(DOMString? namespace, [LegacyNullToEmptyString] DOMString qualifiedName, optional DocumentType? doctype = null);
  [NewObject] Document createHTMLDocument(optional DOMString title);

  boolean hasFeature(); // useless; always returns true
};
doctype = document . implementation . createDocumentType(name, publicId, systemId)
주어진 name, publicId, systemId으로 doctype을 반환합니다.

name유효한 doctype 이름이 아니면, "InvalidCharacterError" DOMException이 발생합니다.

doc = document . implementation . createDocument(namespace, qualifiedName [, doctype = null])
XMLDocument를 반환하고, 문서 요소(document element)지역 이름(local name)qualifiedName이고, 네임스페이스(namespace)namespace입니다 (단, qualifiedName이 빈 문자열일 경우는 예외), 그리고 doctype이 주어지면 doctype으로 사용합니다.

이 메서드는 createElementNS() 메서드와 동일한 예외를 namespacequalifiedName을 인자로 했을 때 발생시킵니다.

doc = document . implementation . createHTMLDocument([title])
문서(document)를 반환하며, 기본 트리(tree)가 이미 생성되어 있고 title 요소도 포함됩니다(단, title 인자를 생략하면 포함되지 않습니다).

createDocumentType(name, publicId, systemId) 메서드 단계는 다음과 같습니다:

  1. name유효한 doctype 이름이 아니면, "InvalidCharacterError" DOMException을 발생시킵니다.

  2. 새로운 doctype을 반환합니다. namename, publicIdpublic ID, systemIdsystem ID로 설정하고, 노드 문서(node document)this와 연관된 문서(document)로 설정합니다.

createDocument(namespace, qualifiedName, doctype) 메서드 단계는 다음과 같습니다:

  1. document를 새로운 XMLDocument로 설정합니다.

  2. element를 null로 설정합니다.

  3. qualifiedName이 빈 문자열이 아니면, 내부 createElementNS 단계document, namespace, qualifiedName, 빈 딕셔너리로 실행한 결과를 element로 설정합니다.

  4. doctype이 null이 아니면, append doctypedocument에 추가합니다.

  5. element가 null이 아니면, append elementdocument에 추가합니다.

  6. documentoriginthis와 연관된 문서(document)origin으로 설정합니다.

  7. document콘텐츠 타입(content type)namespace에 따라 결정됩니다:

    HTML 네임스페이스
    application/xhtml+xml
    SVG 네임스페이스
    image/svg+xml
    그 외의 네임스페이스
    application/xml
  8. document를 반환합니다.

createHTMLDocument(title) 메서드 단계는 다음과 같습니다:

  1. docHTML 문서인 새로운 문서로 둡니다.

  2. doc콘텐츠 유형을 "text/html"로 설정합니다.

  3. doc에, "html"을 그 이름으로 하고 그 노드 문서doc으로 설정한 새로운 doctype추가합니다.

  4. doc에, doc, "html", 및 HTML 네임스페이스를 지정하여 요소를 생성한 결과를 추가합니다.

  5. 앞서 생성된 html 요소에, doc, "head", 및 HTML 네임스페이스를 지정하여 요소를 생성한 결과를 추가합니다.

  6. 만약 title이 주어진 경우:

    1. 앞서 생성된 head 요소에, doc, "title", 및 HTML 네임스페이스를 지정하여 요소를 생성한 결과를 추가합니다.

    2. 앞서 생성된 title 요소에, 그 데이터title(빈 문자열일 수 있음)로 설정하고 그 노드 문서doc으로 설정한 새로운 Text 노드추가합니다.

  7. 앞서 생성된 html 요소에, doc, "body", 및 HTML 네임스페이스를 지정하여 요소를 생성한 결과를 추가합니다.

  8. doc오리진이것의 연관된 문서오리진입니다.

  9. doc를 반환합니다.

hasFeature() 메서드 단계는 true를 반환합니다.

hasFeature() 는 원래 사용자 에이전트가 특정 DOM 기능을 지원하는지 보고하는 용도였으나, 실제로는 원하는 객체, 속성, 메서드가 존재하는지 직접 확인하는 것이 훨씬 신뢰성 있고 세밀하다는 것이 입증되었습니다. 따라서 더 이상 사용하지 않으나, 옛날 페이지가 동작을 멈추지 않도록(단순히 true만 반환) 계속 존재합니다.

4.6. 인터페이스 DocumentType

[Exposed=Window]
interface DocumentType : Node {
  readonly attribute DOMString name;
  readonly attribute DOMString publicId;
  readonly attribute DOMString systemId;
};

DocumentType 노드는 간단히 doctype로 알려져 있습니다.

Doctype에는 연관된 이름, public ID, 그리고 system ID가 있습니다.

Doctype이 생성될 때, 이름은 항상 제공됩니다. Doctype이 생성될 때 명확하게 제공되지 않으면, public IDsystem ID는 빈 문자열이 됩니다.

name getter 단계는 this이름을 반환하는 것입니다.

publicId getter 단계는 thispublic ID를 반환하는 것입니다.

systemId getter 단계는 thissystem ID를 반환하는 것입니다.

4.7. 인터페이스 DocumentFragment

[Exposed=Window]
interface DocumentFragment : Node {
  constructor();
};

DocumentFragment 노드에는 연관된 host가 있습니다 (null 또는 다른 노드 트리에 속한 엘리먼트). 별도로 명시하지 않는 한 null입니다.

객체 A가 객체 Bhost를 포함하는 포괄적 조상이라면, AB포괄적 조상 이거나, B루트에 non-null host가 있고 AB루트host의 host를 포함하는 포괄적 조상일 때입니다.

DocumentFragment 노드host 개념은 HTML의 template 엘리먼트와 섀도우 루트에 유용하며, pre-insertreplace 알고리즘에 영향을 줍니다.

tree = new DocumentFragment()
새로운 DocumentFragment 노드를 반환합니다.

new DocumentFragment() 생성자 단계는 this노드 document현재 글로벌 오브젝트연관된 Document로 설정합니다.

4.8. 인터페이스 ShadowRoot

[Exposed=Window]
interface ShadowRoot : DocumentFragment {
  readonly attribute ShadowRootMode mode;
  readonly attribute boolean delegatesFocus;
  readonly attribute SlotAssignmentMode slotAssignment;
  readonly attribute boolean clonable;
  readonly attribute boolean serializable;
  readonly attribute Element host;

  attribute EventHandler onslotchange;
};

enum ShadowRootMode { "open", "closed" };
enum SlotAssignmentMode { "manual", "named" };

ShadowRoot 노드는 간단히 섀도우 루트라고 합니다.

섀도우 루트의 연관된 host는 절대 null이 아닙니다.

섀도우 루트에는 연관된 mode가 있습니다 ("open" 또는 "closed")입니다.

섀도우 루트에는 연관된 delegates focus (boolean)이 있습니다. 초기값은 false입니다.

섀도우 루트에는 연관된 available to element internals (boolean)이 있습니다. 초기값은 false입니다.

섀도우 루트에는 연관된 declarative (boolean)이 있습니다. 초기값은 false입니다.

섀도우 루트에는 연관된 slot assignment ("manual" 또는 "named")가 있습니다.

섀도우 루트에는 연관된 clonable (boolean)이 있습니다. 초기값은 false입니다.

섀도우 루트에는 연관된 serializable (boolean)이 있습니다. 초기값은 false입니다.

섀도우 루트에는 연관된 custom element registry (null 또는 CustomElementRegistry 객체)입니다. 초기값은 null입니다.

섀도우 루트에는 연관된 keep custom element registry null (boolean)이 있습니다. 초기값은 false입니다.

이 값은 선언적 섀도우 루트와 결합될 때만 true가 될 수 있습니다. 그리고 섀도우 루트custom element registry 가 null일 때만 중요합니다.


섀도우 루트get the parent 알고리즘은 event가 주어졌을 때, eventcomposed flag가 설정되지 않았고 섀도우 루트eventpath의 첫 struct의 invocation targetroot라면 null을 반환하고, 그렇지 않으면 섀도우 루트host를 반환합니다.


mode getter 단계는 thismode를 반환합니다.

delegatesFocus getter 단계는 thisdelegates focus를 반환합니다.

slotAssignment getter 단계는 thisslot assignment를 반환합니다.

clonable getter 단계는 thisclonable을 반환합니다.

serializable getter 단계는 thisserializable을 반환합니다.

host getter 단계는 thishost를 반환합니다.


onslotchange 속성은 이벤트 핸들러 IDL 속성이며, onslotchange 이벤트 핸들러이고, 이벤트 핸들러 이벤트 타입slotchange입니다.


섀도우 포함 트리 순서섀도우 포함 전위(preorder) 깊이 우선(DFS) 순회노드 트리에 대해 수행한 결과입니다. 섀도우 포함 전위 깊이 우선 순회노드 트리 tree에서 전위 깊이 우선 순회를 하며, tree에서 만나는 각 섀도우 호스트 마다, 그 엘리먼트섀도우 루트노드 트리를 만난 직후에 섀도우 포함 전위 깊이 우선 순회를 수행합니다.

섀도우 포함 루트는 객체의 루트host섀도우 포함 루트이고, 객체의 루트섀도우 루트인 경우에만 그렇고, 아니라면 객체 자신의 루트입니다.

객체 A가 객체 B섀도우 포함 자손이라면, A자손이거나, A루트섀도우 루트이고 A루트host섀도우 포함 포괄적 자손인 경우입니다.

섀도우 포함 포괄적 자손 은 객체 자신 또는 그 섀도우 포함 자손 중 하나입니다.

객체 A가 객체 B섀도우 포함 조상이라면, 그리고 오직 B섀도우 포함 자손일 때입니다.

섀도우 포함 포괄적 조상 은 객체 자신 또는 그 섀도우 포함 조상 중 하나입니다.

노드 Aclosed-shadow-hidden 상태임은 노드 B에 대해 다음 조건이 모두 true일 때입니다:

retarget은 객체 A를 객체 B에 대해 다음 단계를 반복하여 객체를 반환합니다:

  1. 다음 중 하나가 true라면

    그럼 A를 반환합니다.

  2. AA루트host로 설정합니다.

retargeting 알고리즘은 이벤트 디스패치뿐만 아니라 Fullscreen과 같은 다른 명세에서도 사용됩니다. [FULLSCREEN]

4.9. 인터페이스 Element

[Exposed=Window]
interface Element : Node {
  readonly attribute DOMString? namespaceURI;
  readonly attribute DOMString? prefix;
  readonly attribute DOMString localName;
  readonly attribute DOMString tagName;

  [CEReactions] attribute DOMString id;
  [CEReactions] attribute DOMString className;
  [SameObject, PutForwards=value] readonly attribute DOMTokenList classList;
  [CEReactions, Unscopable] attribute DOMString slot;

  boolean hasAttributes();
  [SameObject] readonly attribute NamedNodeMap attributes;
  sequence<DOMString> getAttributeNames();
  DOMString? getAttribute(DOMString qualifiedName);
  DOMString? getAttributeNS(DOMString? namespace, DOMString localName);
  [CEReactions] undefined setAttribute(DOMString qualifiedName, DOMString value);
  [CEReactions] undefined setAttributeNS(DOMString? namespace, DOMString qualifiedName, DOMString value);
  [CEReactions] undefined removeAttribute(DOMString qualifiedName);
  [CEReactions] undefined removeAttributeNS(DOMString? namespace, DOMString localName);
  [CEReactions] boolean toggleAttribute(DOMString qualifiedName, optional boolean force);
  boolean hasAttribute(DOMString qualifiedName);
  boolean hasAttributeNS(DOMString? namespace, DOMString localName);

  Attr? getAttributeNode(DOMString qualifiedName);
  Attr? getAttributeNodeNS(DOMString? namespace, DOMString localName);
  [CEReactions] Attr? setAttributeNode(Attr attr);
  [CEReactions] Attr? setAttributeNodeNS(Attr attr);
  [CEReactions] Attr removeAttributeNode(Attr attr);

  ShadowRoot attachShadow(ShadowRootInit init);
  readonly attribute ShadowRoot? shadowRoot;

  readonly attribute CustomElementRegistry? customElementRegistry;

  Element? closest(DOMString selectors);
  boolean matches(DOMString selectors);
  boolean webkitMatchesSelector(DOMString selectors); // legacy alias of .matches

  HTMLCollection getElementsByTagName(DOMString qualifiedName);
  HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);

  [CEReactions] Element? insertAdjacentElement(DOMString where, Element element); // legacy
  undefined insertAdjacentText(DOMString where, DOMString data); // legacy
};

dictionary ShadowRootInit {
  required ShadowRootMode mode;
  boolean delegatesFocus = false;
  SlotAssignmentMode slotAssignment = "named";
  boolean clonable = false;
  boolean serializable = false;
  CustomElementRegistry? customElementRegistry = null;
};

ShadowRootInit 다소 특이하게 undefinednull 모두를 customElementRegistry 멤버에 전달할 수 있게 허용합니다. 이는 웹 개발자가 ShadowRoot 노드를 딕셔너리가 아닌 attachShadow()에 전달할 수 있도록 하기 위함입니다.

Element 노드는 간단히 엘리먼트라고 합니다.

엘리먼트에는 다음과 같은 연관값이 있습니다:

네임스페이스
null 또는 빈 문자열이 아닌 문자열입니다.
네임스페이스 접두어
null 또는 빈 문자열이 아닌 문자열입니다.
로컬 이름
빈 문자열이 아닌 문자열입니다.
커스텀 엘리먼트 레지스트리
null 또는 CustomElementRegistry 객체입니다.
커스텀 엘리먼트 상태
"undefined", "failed", "uncustomized", "precustomized", 또는 "custom"입니다.
커스텀 엘리먼트 정의
null 또는 커스텀 엘리먼트 정의입니다.
is
null 또는 유효한 커스텀 엘리먼트 이름입니다.

엘리먼트생성될 때, 위 값들이 모두 초기화됩니다.

사용자 정의 요소 상태가 "uncustomized" 또는 "custom"인 요소정의되었다(defined)고 합니다. 사용자 정의 요소 상태가 "custom"인 요소사용자 정의(custom)되었다고 합니다.

요소가 정의되었는지 여부는 :defined 의사 클래스의 동작을 결정하는 데 사용됩니다. 요소가 사용자 정의되었는지 여부는 변형 알고리즘의 동작을 결정하는 데 사용됩니다. "failed" 및 "precustomized" 상태는 사용자 정의 요소 생성자가 처음 올바르게 실행되지 않을 경우, 업그레이드에 의해 다시 실행되지 않도록 하는 데 사용됩니다.

다음 코드는 각 네 가지 상태의 엘리먼트를 보여줍니다:

<!DOCTYPE html>
<script>
  window.customElements.define("sw-rey", class extends HTMLElement {})
  window.customElements.define("sw-finn", class extends HTMLElement {}, { extends: "p" })
  window.customElements.define("sw-kylo", class extends HTMLElement {
    constructor() {
      // super() intentionally omitted for this example
    }
  })
</script>

<!-- "undefined" (정의되지 않음, 커스텀 아님) -->
<sw-han></sw-han>
<p is="sw-luke"></p>
<p is="asdf"></p>

<!-- "failed" (정의되지 않음, 커스텀 아님) -->
<sw-kylo></sw-kylo>

<!-- "uncustomized" (정의됨, 커스텀 아님) -->
<p></p>
<asdf></asdf>

<!-- "custom" (정의됨, 커스텀) -->
<sw-rey></sw-rey>
<p is="sw-finn"></p>

요소는 또한 연관된 그림자 루트(null 또는 그림자 루트)를 가집니다. 별도로 명시되지 않는 한 null입니다. 요소그림자 루트가 null이 아닌 경우 해당 요소는 그림자 호스트입니다.

요소정규화된 이름네임스페이스 접두사가 null인 경우 로컬 이름이고, 그렇지 않은 경우 네임스페이스 접두사, ":", 그리고 로컬 이름이 차례로 이어집니다.

요소HTML-대문자화된 정규화된 이름은 다음 단계의 반환 값입니다:

  1. qualifiedNamethisqualified name으로 설정합니다.

  2. thisHTML 네임스페이스에 있고, 노드 documentHTML document라면, qualifiedNameASCII 대문자로 변환합니다.

  3. qualifiedName을 반환합니다.

User agent는 qualified nameHTML 대문자화된 qualified name을 내부 슬롯에 저장하여 최적화할 수 있습니다.

엘리먼트 생성document document, 문자열 localName, 문자열 또는 null namespace, 옵션으로 문자열 또는 null prefix(기본값 null), 문자열 또는 null is(기본값 null), boolean synchronousCustomElements(기본값 false), 그리고 "default", null, 또는 CustomElementRegistry 객체 registry(기본값 "default")가 주어졌을 때:

  1. result를 null로 설정합니다.

  2. registry가 "default"라면, registry커스텀 엘리먼트 레지스트리 조회 결과로 설정합니다(document 기준).

  3. definition커스텀 엘리먼트 정의 조회 결과로 설정합니다(registry, namespace, localName, is 기준).

  4. definition이 null이 아니고, definitionnamelocal name과 다르다면(definition커스텀 빌트인 엘리먼트임):

    1. interface엘리먼트 인터페이스(localName, HTML 네임스페이스)로 설정합니다.

    2. result엘리먼트 내부 생성 결과로 설정합니다(document, interface, localName, HTML 네임스페이스, prefix, "undefined", is, registry).

    3. synchronousCustomElements가 true라면, 예외를 캐치하면서 다음 단계를 실행합니다:

      1. result를 definition으로 업그레이드합니다.

      이 단계에서 예외 exception이 발생했다면:

      1. definition생성자의 해당 JavaScript 객체의 연관된 영역전역 객체에 대해 exception보고합니다.

      2. result커스텀 엘리먼트 상태를 "failed"로 설정합니다.

    4. 그렇지 않으면 result와 definition으로 커스텀 엘리먼트 업그레이드 reaction을 큐에 넣습니다.

  5. 그 밖에 definition이 null이 아니면:

    1. synchronousCustomElements가 true라면:

      1. Cdefinitionconstructor로 설정합니다.

      2. 주변 에이전트활성 사용자 정의 요소 생성자 맵[C]을 registry설정합니다.

      3. 예외를 캐치하면서 다음 단계를 실행합니다:

        1. resultC를 생성(인자 없음) 결과로 설정합니다.

        2. Assert: result커스텀 엘리먼트 상태커스텀 엘리먼트 정의가 초기화됨.

        3. Assert: result네임스페이스HTML 네임스페이스임.

          IDL은 resultHTMLElement 객체임을 보장하며, 모두 HTML 네임스페이스를 사용합니다.

        4. resultattribute list비어있지 않으면, NotSupportedError NotSupportedError DOMException 예외를 던집니다.

        5. result자식이 있다면, NotSupportedError NotSupportedError DOMException 예외를 던집니다.

        6. result부모가 null이 아니면, NotSupportedError NotSupportedError DOMException 예외를 던집니다.

        7. result노드 documentdocument가 아니면, NotSupportedError NotSupportedError DOMException 예외를 던집니다.

        8. result로컬 이름localName과 다르면, NotSupportedError NotSupportedError DOMException 예외를 던집니다.

        9. result네임스페이스 접두어prefix로 설정합니다.

        10. resultis을 null로 설정합니다.

        11. result커스텀 엘리먼트 레지스트리registry로 설정합니다.

        이 단계 중 예외 exception이 발생했다면:

        1. definition생성자의 해당 JavaScript 객체의 연관된 영역전역 객체에 대해 exception보고합니다.

        2. result엘리먼트 내부 생성 결과로 재설정합니다(document, HTMLUnknownElement, localName, HTML 네임스페이스, prefix, "failed", null, registry).

      4. 주변 에이전트활성 사용자 정의 요소 생성자 맵에서 [C]를 제거합니다.

        일반적으로 이 시점에서는 이미 제거되어 있습니다.

    2. 그 밖에:

      1. result엘리먼트 내부 생성 결과로 설정합니다(document, HTMLElement, localName, HTML 네임스페이스, prefix, "undefined", null, registry).

      2. result와 definition으로 커스텀 엘리먼트 업그레이드 reaction을 큐에 넣습니다.

  6. 그 밖에:

    1. interface엘리먼트 인터페이스(localName, namespace)로 설정합니다.

    2. result엘리먼트 내부 생성 결과로 설정합니다(document, interface, localName, namespace, prefix, "uncustomized", is, registry).

    3. namespaceHTML 네임스페이스이고, localName유효한 커스텀 엘리먼트 이름이거나 is가 null이 아니면, result커스텀 엘리먼트 상태를 "undefined"로 설정합니다.

  7. result를 반환합니다.

엘리먼트 내부 생성document document, 인터페이스 interface, 문자열 localName, 문자열 또는 null namespace, 문자열 또는 null prefix, 문자열 state, 문자열 또는 null is, 그리고 null 또는 CustomElementRegistry 객체 registry가 주어졌을 때:

  1. elementinterface를 구현하는 새로운 엘리먼트로 생성하고, 네임스페이스namespace로, 네임스페이스 접두어prefix로, 로컬 이름localName으로, 커스텀 엘리먼트 레지스트리registry로, 커스텀 엘리먼트 상태state로, 커스텀 엘리먼트 정의를 null로, isis로, 노드 documentdocument로 설정합니다.

  2. Assert: elementattribute list 가 비어 있음을 확인합니다.

  3. element를 반환합니다.

엘리먼트는 또한 attribute list를 가지며, 리스트로, NamedNodeMap을 통해 노출됩니다. 엘리먼트가 생성될 때 명확하게 지정되지 않으면 attribute list비어 있습니다.

엘리먼트has attribute A를 가진다는 것은, attribute listA포함되어 있을 때를 의미합니다.

이것과 다른 명세들은 요소에 대한 속성 변경 단계를 정의할 수 있습니다. 이 알고리즘에는 element, localName, oldValue, value, 및 namespace가 전달됩니다.

element, oldValue, 및 newValue를 사용하여 속성 attribute속성 변경을 처리하려면 다음 단계를 실행합니다.

  1. mutation record "attributes"를 element에 대해 큐에 넣으며, attributelocal name, attributenamespace, oldValue, « », « », null, null을 사용합니다.

  2. element커스텀이라면, 커스텀 엘리먼트 콜백 reaction을 큐에 넣습니다 (element, 콜백 이름 "attributeChangedCallback", 그리고 « attributelocal name, oldValue, newValue, attributenamespace »).

  3. attribute change stepselement, attributelocal name, oldValue, newValue, attributenamespace로 실행합니다.

attribute 변경attribute attributevalue로 변경하는 과정으로, 다음 단계를 따릅니다:

  1. oldValueattributevalue로 설정합니다.

  2. attributevaluevalue로 설정합니다.

  3. handle attribute changesattribute, attributeelement, oldValue, value로 실행합니다.

attribute 추가attribute attribute엘리먼트 element에 추가하는 과정으로, 다음 단계를 따릅니다:

  1. Append attributeelementattribute list에 추가합니다.

  2. attributeelementelement로 설정합니다.

  3. attribute노드 documentelement노드 document로 설정합니다.

  4. handle attribute changesattribute, element, null, attributevalue로 실행합니다.

attribute 제거attribute attribute를 제거하는 과정으로, 다음 단계를 따릅니다:

  1. elementattributeelement로 설정합니다.

  2. Remove attributeelementattribute list에서 제거합니다.
  3. attributeelement를 null로 설정합니다.

  4. handle attribute changesattribute, element, attributevalue, null로 실행합니다.

attribute 교체attribute oldAttributeattribute newAttribute로 교체하는 과정입니다:

  1. elementoldAttributeelement로 설정합니다.

  2. Replace oldAttributenewAttributeelementattribute list에서 교체합니다.

  3. newAttributeelementelement로 설정합니다.

  4. newAttribute노드 documentelement노드 document로 설정합니다.

  5. oldAttributeelement를 null로 설정합니다.

  6. handle attribute changesoldAttribute, element, oldAttributevalue, newAttributevalue로 실행합니다.


이름으로 attribute 얻기는 문자열 qualifiedName엘리먼트 element가 주어졌을 때 다음과 같이 동작합니다:

  1. elementHTML 네임스페이스에 있고, 노드 documentHTML document라면, qualifiedNameASCII 소문자로 변환합니다.

  2. elementattribute list에서 attributequalified namequalifiedName과 같은 첫 번째 attribute를 반환하고, 없으면 null을 반환합니다.

네임스페이스와 로컬 이름으로 attribute 얻기는 null 또는 문자열 namespace, 문자열 localName, 엘리먼트 element가 주어졌을 때:

  1. namespace가 빈 문자열이라면, null로 설정합니다.

  2. elementattribute list에서 attributenamespacenamespace이고 local namelocalName인 attribute를 반환하고, 없으면 null을 반환합니다.

attribute 값 얻기엘리먼트 element, 문자열 localName, 옵션으로 null 또는 문자열 namespace(기본값 null)가 주어졌을 때:

  1. attr네임스페이스와 로컬 이름으로 attribute 얻기 결과로 설정합니다(namespace, localName, element).

  2. attr가 null이면, 빈 문자열을 반환합니다.

  3. attrvalue를 반환합니다.

attribute 설정attribute attr엘리먼트 element가 주어졌을 때:

  1. attrelement가 null이 아니고 element가 아니라면, InUseAttributeError InUseAttributeError DOMException 예외를 던집니다.

  2. oldAttr네임스페이스와 로컬 이름으로 attribute 얻기 결과로 설정합니다(attrnamespace, attrlocal name, element).

  3. oldAttrattr이면, attr를 반환합니다.

  4. oldAttr가 null이 아니면, oldAttr를 attr로 교체합니다.

  5. 그렇지 않으면, attr를 element에 추가합니다.

  6. oldAttr를 반환합니다.

attribute 값 설정엘리먼트 element, 문자열 localName, 문자열 value, 옵션으로 null 또는 문자열 prefix(기본값 null), 옵션으로 null 또는 문자열 namespace(기본값 null)가 주어졌을 때:

  1. attribute네임스페이스와 로컬 이름으로 attribute 얻기 결과로 설정합니다(namespace, localName, element).
  2. attribute가 null이면, attribute를 새로 생성합니다. namespacenamespace, namespace prefixprefix, local namelocalName, valuevalue, node documentelementnode document로 설정한 뒤, element에 추가하고 반환합니다.
  3. attribute 변경attribute, value로 실행합니다.

이름으로 attribute 제거는 문자열 qualifiedName엘리먼트 element가 주어졌을 때:

  1. attr이름으로 attribute 얻기 결과로 설정합니다(qualifiedName, element).

  2. attr가 null이 아니면 attr 제거를 실행합니다.

  3. attr를 반환합니다.

네임스페이스와 로컬 이름으로 attribute 제거는 null 또는 문자열 namespace, 문자열 localName, 엘리먼트 element가 주어졌을 때:

  1. attr네임스페이스와 로컬 이름으로 attribute 얻기 결과로 설정합니다(namespace, localName, element).

  2. attr가 null이 아니면 attr 제거를 실행합니다.

  3. attr를 반환합니다.


엘리먼트는 연관된 고유 식별자(ID)를 가질 수 있습니다.

역사적으로 엘리먼트는 HTML id attribute와 DTD를 통해 여러 식별자를 가질 수 있었으나, 이 명세는 ID 를 DOM의 개념으로 만들고, 엘리먼트마다 하나만 허용하며 id attribute로 지정합니다.

attribute change steps를 사용하여 엘리먼트ID를 업데이트합니다:

  1. localNameid이고, namespace가 null이며, value가 null 또는 빈 문자열이면 elementID를 unset합니다.

  2. 그 밖에 localNameid이고 namespace가 null이면 elementIDvalue로 설정합니다.

이 명세는 class, id, slot attribute가 어떤 엘리먼트에 있어야 한다는 요구 사항은 정의하지만, 이를 사용하는 것이 적합한지(conforming) 여부는 명시하지 않습니다.


노드부모Element 타입이면, 이를 부모 엘리먼트라고 합니다. 노드부모가 다른 타입이면, 부모 엘리먼트는 null입니다.


namespace = element . namespaceURI
네임스페이스를 반환합니다.
prefix = element . prefix
네임스페이스 접두어를 반환합니다.
localName = element . localName
로컬 이름을 반환합니다.
qualifiedName = element . tagName
HTML 대문자화된 qualified name을 반환합니다.

namespaceURI getter 단계는 this네임스페이스를 반환합니다.

prefix getter 단계는 this네임스페이스 접두어를 반환합니다.

localName getter 단계는 this로컬 이름을 반환합니다.

tagName getter 단계는 thisHTML 대문자화된 qualified name을 반환합니다.


element . id [ = value ]

elementid 콘텐츠 attribute 값을 반환합니다. 값을 변경할 수도 있습니다.

element . className [ = value ]

elementclass 콘텐츠 attribute 값을 반환합니다. 값을 변경할 수도 있습니다.

element . classList

elementclass 콘텐츠 attribute를 공백으로 구분된 토큰 집합으로 DOMTokenList 객체를 통해 조작할 수 있습니다.

element . slot [ = value ]

elementslot 콘텐츠 attribute 값을 반환합니다. 값을 변경할 수도 있습니다.

문자열 name반영(reflect)하도록 정의된 IDL attribute는 다음 getter/setter 단계를 가져야 합니다:

getter 단계

attribute 값 얻기thisname으로 실행한 결과를 반환합니다.

setter 단계

attribute 값 설정thisname, 주어진 값으로 실행합니다.

id attribute는 반드시 "id"를 반영해야 합니다.

className attribute는 반드시 "class"를 반영해야 합니다.

classList getter 단계는 DOMTokenList 객체를 반환합니다. 이 객체의 연관 엘리먼트this이며, 연관 attribute로컬 이름class입니다. 이 DOMTokenList 객체의 토큰 집합엘리먼트클래스라고도 합니다.

slot attribute는 반드시 "slot"를 반영해야 합니다.

id, class, slot는 네임스페이스와 관계없이 어떤 엘리먼트에도 나타날 수 있으므로 사실상 슈퍼글로벌 attribute입니다.


element . hasAttributes()

element에 attribute가 있으면 true, 아니면 false를 반환합니다.

element . getAttributeNames()

element의 모든 qualified name을 반환합니다. 중복이 있을 수 있습니다.

element . getAttribute(qualifiedName)

elementattributequalified namequalifiedName인 첫 번째 attribute를 반환하며, 없으면 null을 반환합니다.

element . getAttributeNS(namespace, localName)

elementattributenamespacenamespace이고 local namelocalName인 attribute를 반환하며, 없으면 null을 반환합니다.

element . setAttribute(qualifiedName, value)

elementattributequalified namequalifiedName인 첫 번째 attribute의 valuevalue로 설정합니다.

element . setAttributeNS(namespace, localName, value)

elementattributenamespacenamespace이고 local namelocalName인 attribute의 valuevalue로 설정합니다.

element . removeAttribute(qualifiedName)

elementattributequalified namequalifiedName인 첫 번째 attribute를 제거합니다.

element . removeAttributeNS(namespace, localName)

elementattributenamespacenamespace이고 local namelocalName인 attribute를 제거합니다.

element . toggleAttribute(qualifiedName [, force])

force가 주어지지 않으면 qualifiedName을 "토글"합니다. 있으면 제거하고, 없으면 추가합니다. force가 true면 qualifiedName을 추가하고, false면 제거합니다.

현재 qualifiedName이 있으면 true, 아니면 false를 반환합니다.

element . hasAttribute(qualifiedName)

elementattributequalified namequalifiedName인 것이 있으면 true, 아니면 false를 반환합니다.

element . hasAttributeNS(namespace, localName)

elementattributenamespacenamespace이고 local namelocalName인 것이 있으면 true를 반환합니다.

hasAttributes() 메서드 단계는 thisattribute list비어 있으면 false를 반환하고, 그렇지 않으면 true를 반환합니다.

attributes getter 단계는 연관된 NamedNodeMap을 반환합니다.

getAttributeNames() 메서드 단계는 qualified nameattributethisattribute list에서 순서대로 반환합니다. 없으면 새로운 리스트를 반환합니다.

이 값들은 고유함이 보장되지 않습니다.

getAttribute(qualifiedName) 메서드 단계는 다음과 같습니다:

  1. attr이름으로 attribute 얻기 결과로 설정합니다(qualifiedName, this).

  2. attr가 null이면 null을 반환합니다.

  3. attrvalue를 반환합니다.

getAttributeNS(namespace, localName) 메서드 단계는 다음과 같습니다:

  1. attr네임스페이스와 로컬 이름으로 attribute 얻기 결과로 설정합니다(namespace, localName, this).

  2. attr가 null이면 null을 반환합니다.

  3. attrvalue를 반환합니다.

setAttribute(qualifiedName, value) 메서드 단계는 다음과 같습니다:

  1. qualifiedName유효한 attribute 로컬 이름이 아니면, InvalidCharacterError InvalidCharacterError DOMException 예외를 던집니다.

    매개변수 이름과 달리, qualifiedName은 이미 해당 qualified name의 attribute가 존재할 때만 qualified name으로 사용됩니다. 그렇지 않으면 새 attribute의 로컬 이름으로 사용됩니다. 후자의 경우만 유효성 검사가 필요합니다.

  2. thisHTML 네임스페이스에 있고 노드 documentHTML document라면, qualifiedNameASCII 소문자로 변환합니다.

  3. attributethisattribute list에서 attributequalified namequalifiedName인 첫 번째 attribute로 설정하고, 없으면 null로 설정합니다.

  4. attribute가 null이면, attribute를 새로 만들고, 로컬 이름qualifiedName으로, valuevalue로, 노드 documentthis노드 document로 설정한 뒤, element에 추가하고 반환합니다.

  5. attribute 변경attribute, value로 실행합니다.

setAttributeNS(namespace, qualifiedName, value) 메서드 단계는 다음과 같습니다:

  1. (namespace, prefix, localName)을 네임스페이스와 qualifiedName 검증 및 추출 결과로 설정합니다("element" 기준).

  2. attribute 값 설정thislocalName, value, prefix, namespace로 실행합니다.

removeAttribute(qualifiedName) 메서드 단계는 이름으로 attribute 제거qualifiedName, this로 실행하고 undefined를 반환합니다.

removeAttributeNS(namespace, localName) 메서드 단계는 네임스페이스와 로컬 이름으로 attribute 제거namespace, localName, this로 실행하고 undefined를 반환합니다.

hasAttribute(qualifiedName) 메서드 단계는 다음과 같습니다:

  1. thisHTML 네임스페이스에 있고 노드 documentHTML document라면, qualifiedNameASCII 소문자로 변환합니다.

  2. thisattributequalified namequalifiedName인 것이 있으면 true를, 아니면 false를 반환합니다.

toggleAttribute(qualifiedName, force) 메서드 단계는 다음과 같습니다:

  1. qualifiedName유효한 attribute 로컬 이름이 아니면, InvalidCharacterError InvalidCharacterError DOMException 예외를 던집니다.

    위의 설명을 참고하세요. local name으로 유효성 검사하는 이유가 나와 있습니다.

  2. thisHTML 네임스페이스에 있고 노드 documentHTML document라면, qualifiedNameASCII 소문자로 변환합니다.

  3. attributethisattribute list에서 attributequalified namequalifiedName인 첫 번째 attribute로 설정하고, 없으면 null로 설정합니다.

  4. attribute가 null이라면:

    1. force가 지정되지 않았거나 true라면, attribute를 새로 만들고, 로컬 이름qualifiedName으로, value를 빈 문자열로, 노드 documentthis노드 document로 설정한 뒤, element에 추가하고 true를 반환합니다.

    2. false를 반환합니다.

  5. 그 밖에, force가 지정되지 않았거나 false라면, 이름으로 attribute 제거qualifiedName, this로 실행하고 false를 반환합니다.

  6. true를 반환합니다.

hasAttributeNS(namespace, localName) 메서드 단계는 다음과 같습니다:

  1. namespace가 빈 문자열이면 null로 설정합니다.

  2. thisattributenamespacenamespace이고 local namelocalName인 것이 있으면 true를, 아니면 false를 반환합니다.

getAttributeNode(qualifiedName) 메서드 단계는 이름으로 attribute 얻기qualifiedNamethis로 실행한 결과를 반환합니다.

getAttributeNodeNS(namespace, localName) 메서드 단계는 네임스페이스와 로컬 이름으로 attribute 얻기namespace, localName, this로 실행한 결과를 반환합니다.

setAttributeNode(attr)setAttributeNodeNS(attr) 메서드 단계는 attribute 설정attr, this로 실행한 결과를 반환합니다.

removeAttributeNode(attr) 메서드 단계는 다음과 같습니다:

  1. thisattribute listattr포함되어 있지 않으면, NotFoundError NotFoundError DOMException 예외를 던집니다.

  2. attr 제거를 실행합니다.

  3. attr를 반환합니다.


shadow = element . attachShadow(init)

element섀도우 루트를 생성하고 반환합니다.

shadow = element . shadowRoot

element섀도우 루트를 반환하며, 섀도우 루트mode가 "open"일 때만 반환, 아니면 null을 반환합니다.

유효한 섀도우 호스트 이름은 다음 중 하나입니다:

attachShadow(init) 메서드 단계는 다음과 같습니다:

  1. registrythis커스텀 엘리먼트 레지스트리로 설정합니다.

  2. init["customElementRegistry"] 가 null이 아니면:

    1. registryinit["customElementRegistry"]로 설정합니다.

    2. registryis scoped가 false이고, registrythis노드 document커스텀 엘리먼트 레지스트리가 아니면, NotSupportedError NotSupportedError DOMException 예외를 던집니다.

  3. 섀도우 루트 연결this, init["mode"], init["clonable"], init["serializable"], init["delegatesFocus"], init["slotAssignment"], registry로 실행합니다.

  4. this섀도우 루트를 반환합니다.

섀도우 루트 연결엘리먼트 element, 문자열 mode, 불린값 clonable, 불린값 serializable, 불린값 delegatesFocus, 문자열 slotAssignment, null 또는 CustomElementRegistry 객체 registry가 주어졌을 때:

  1. element네임스페이스HTML 네임스페이스가 아니라면, NotSupportedError NotSupportedError DOMException 예외를 던집니다.

  2. element로컬 이름유효한 섀도우 호스트 이름이 아니면, NotSupportedError NotSupportedError DOMException 예외를 던집니다.

  3. element로컬 이름유효한 커스텀 엘리먼트 이름이거나, elementis이 null이 아니면:

    1. definition커스텀 엘리먼트 정의 조회 결과로 설정합니다(element커스텀 엘리먼트 레지스트리, 네임스페이스, 로컬 이름, is 기준).

    2. definition이 null이 아니고 definitiondisable shadow가 true면, NotSupportedError NotSupportedError DOMException 예외를 던집니다.

  4. element섀도우 호스트라면:

    1. currentShadowRootelement섀도우 루트로 설정합니다.

    2. 다음 중 하나라도 true이면:

      • currentShadowRootdeclarative가 false

      • currentShadowRootmodemode와 다름

      그러면 NotSupportedError NotSupportedError DOMException 예외를 던집니다.

    3. 그 밖의 경우:

      1. currentShadowRoot의 모든 자식트리 순서로 제거합니다.

      2. currentShadowRootdeclarative를 false로 설정합니다.

      3. 리턴합니다.

  5. shadow를 새로운 섀도우 루트로 생성합니다. 노드 documentelement노드 document, hostelement, modemode입니다.

  6. shadowdelegates focusdelegatesFocus로 설정합니다.

  7. element커스텀 엘리먼트 상태가 "precustomized" 또는 "custom"이면 shadowavailable to element internals를 true로 설정합니다.

  8. shadowslot assignmentslotAssignment로 설정합니다.

  9. shadowdeclarative를 false로 설정합니다.

  10. shadowclonableclonable로 설정합니다.

  11. shadowserializableserializable로 설정합니다.

  12. shadow커스텀 엘리먼트 레지스트리registry로 설정합니다.

  13. element섀도우 루트shadow로 설정합니다.

shadowRoot getter 단계는 다음과 같습니다:

  1. shadowthis섀도우 루트로 설정합니다.

  2. shadow가 null이거나 mode가 "closed"이면 null을 반환합니다.

  3. shadow를 반환합니다.


registry = element . customElementRegistry

elementCustomElementRegistry 객체를 반환하며, 없으면 null을 반환합니다.

customElementRegistry getter 단계는 this커스텀 엘리먼트 레지스트리를 반환합니다.


element . closest(selectors)
element를 시작점으로 하여 selectors와 매칭되는 첫 번째 포괄적 조상을 반환, 없으면 null을 반환합니다.
element . matches(selectors)
element루트에서 selectors로 매칭 결과가 element이면 true, 아니면 false를 반환합니다.

closest(selectors) 메서드 단계는 다음과 같습니다:

  1. sparse a selectorselectors에서 파싱한 결과로 설정합니다. [SELECTORS4]

  2. s가 실패(failure)이면, SyntaxError SyntaxError DOMException 예외를 던집니다.

  3. elementsthis포괄적 조상엘리먼트만 역 트리 순서로 나열한 리스트로 설정합니다.

  4. elements의 각 element에 대해 match a selector against an elements, element, scoping root this로 실행한 결과가 성공(success)이라면 element를 반환합니다. [SELECTORS4]

  5. null을 반환합니다.

matches(selectors)webkitMatchesSelector(selectors) 메서드 단계는 다음과 같습니다:

  1. sparse a selectorselectors에서 파싱한 결과로 설정합니다. [SELECTORS4]

  2. s가 실패(failure)이면, SyntaxError SyntaxError DOMException 예외를 던집니다.

  3. match a selector against an elements, this, scoping root this로 실행한 결과가 성공(success)이면 true를, 아니면 false를 반환합니다. [SELECTORS4]


getElementsByTagName(qualifiedName) 메서드 단계는 qualifiedName qualifiedName을 가진 엘리먼트 목록this에 대해 반환합니다.

getElementsByTagNameNS(namespace, localName) 메서드 단계는 네임스페이스 namespace와 로컬 이름 localName을 가진 엘리먼트 목록this에 대해 반환합니다.

getElementsByClassName(classNames) 메서드 단계는 클래스 이름 classNames을 가진 엘리먼트 목록this에 대해 반환합니다.


주변에 삽입(insert adjacent)엘리먼트 element, 문자열 where, 노드 node가 주어졌을 때, where의 첫 번째 ASCII 대소문자 구분 없음 매칭에 대해 다음 단계 실행:

"beforebegin"

element부모가 null이면 null 반환.

nodeelement부모element 앞에 pre-inserting한 결과를 반환.

"afterbegin"

nodeelementelement첫 자식 앞에 pre-inserting한 결과를 반환.

"beforeend"

nodeelement에 null 앞에 pre-inserting한 결과를 반환.

"afterend"

element부모가 null이면 null 반환.

nodeelement부모element다음 형제 앞에 pre-inserting한 결과를 반환.

그 밖의 경우

SyntaxError SyntaxError DOMException 예외를 던집니다.

insertAdjacentElement(where, element) 메서드 단계는 주변에 삽입this, where, element로 실행한 결과를 반환합니다.

insertAdjacentText(where, data) 메서드 단계는 다음과 같습니다:

  1. textText 노드로 생성하며, datadata, 노드 documentthis노드 document로 설정합니다.

  2. 주변에 삽입this, where, text로 실행합니다.

이 메서드는 설계 전에 이미 존재했으므로 반환값이 없습니다.

4.9.1. 인터페이스 NamedNodeMap

[Exposed=Window,
 LegacyUnenumerableNamedProperties]
interface NamedNodeMap {
  readonly attribute unsigned long length;
  getter Attr? item(unsigned long index);
  getter Attr? getNamedItem(DOMString qualifiedName);
  Attr? getNamedItemNS(DOMString? namespace, DOMString localName);
  [CEReactions] Attr? setNamedItem(Attr attr);
  [CEReactions] Attr? setNamedItemNS(Attr attr);
  [CEReactions] Attr removeNamedItem(DOMString qualifiedName);
  [CEReactions] Attr removeNamedItemNS(DOMString? namespace, DOMString localName);
};

NamedNodeMap 은 연관된 요소(요소)를 가집니다.

NamedNodeMap 객체의 속성 목록요소속성 목록입니다.


NamedNodeMap 객체의 지원되는 프로퍼티 인덱스는 0에서 속성 목록크기 - 1까지의 숫자입니다. 단, 속성 목록비어 있다면, 지원되는 프로퍼티 인덱스는 없습니다.

length getter 단계는 속성 목록크기를 반환하는 것입니다.

item(index) 메서드 단계는 다음과 같습니다:

  1. indexthis속성 목록크기와 같거나 크면 null을 반환합니다.

  2. 그렇지 않으면, this속성 목록[index]을 반환합니다.

NamedNodeMap 객체의 지원되는 프로퍼티 이름은 다음 단계의 반환 값입니다:

  1. names를 이 NamedNodeMap 객체의 속성 목록에 있는 속성정규화된 이름으로 하며, 중복은 생략하고, 순서를 유지합니다.

  2. NamedNodeMap 객체의 요소HTML 네임스페이스에 있고, 그 노드 문서HTML 문서인 경우, namesname에 대해:

    1. lowercaseNamenameASCII 소문자로 합니다.

    2. lowercaseNamename과 같지 않으면 names에서 name을 제거합니다.

  3. names를 반환합니다.

getNamedItem(qualifiedName) 메서드 단계는 qualifiedName요소를 받아 속성 얻기의 결과를 반환하는 것입니다.

getNamedItemNS(namespace, localName) 메서드 단계는 namespace, localName, 그리고 요소를 받아 속성 얻기의 결과를 반환하는 것입니다.

setNamedItem(attr)setNamedItemNS(attr) 메서드 단계는 attr요소를 받아 속성 설정의 결과를 반환하는 것입니다.

removeNamedItem(qualifiedName) 메서드 단계는 다음과 같습니다:

  1. attrqualifiedNameelement를 받아 속성 제거의 결과로 둡니다.

  2. 만약 attr가 null이면, throw "NotFoundError" DOMException을 던져라.

  3. attr을 반환합니다.

removeNamedItemNS(namespace, localName) 메서드 단계는 다음과 같습니다:

  1. attrnamespace, localName, 그리고 element를 받아 속성 제거의 결과로 둡니다.

  2. 만약 attr가 null이면, throw "NotFoundError" DOMException을 던진다.

  3. attr을 반환합니다.

4.9.2. 인터페이스 Attr

[Exposed=Window]
interface Attr : Node {
  readonly attribute DOMString? namespaceURI;
  readonly attribute DOMString? prefix;
  readonly attribute DOMString localName;
  readonly attribute DOMString name;
  [CEReactions] attribute DOMString value;

  readonly attribute Element? ownerElement;

  readonly attribute boolean specified; // useless; always returns true
};

Attr 노드는 단순히 속성으로 알려져 있습니다. 혼동을 피하기 위해 때때로 콘텐츠 속성이라고도 합니다.

속성네임스페이스(null 또는 비어 있지 않은 문자열), 네임스페이스 접두사(null 또는 비어 있지 않은 문자열), 로컬 이름(비어 있지 않은 문자열), (문자열), 그리고 요소(null 또는 요소)를 가집니다.

만약 오늘 설계했다면 이름과 값만 가졌을 것입니다. ☹

속성정규화된 이름네임스페이스 접두사가 null이면 로컬 이름이고, 그렇지 않으면 네임스페이스 접두사 다음에 ":" 그리고 로컬 이름이 옵니다.

사용자 에이전트는 최적화를 위해 이것을 내부 슬롯으로 가질 수 있습니다.

속성이 생성될 때, 로컬 이름이 주어집니다. 속성이 생성될 때 명시적으로 주어지지 않으면, 네임스페이스, 네임스페이스 접두사, 그리고 요소는 null로 설정되고, 은 빈 문자열로 설정됩니다.

A 속성속성로컬 이름A이고, 네임스페이스네임스페이스 접두사가 null인 속성입니다.


namespaceURI getter 단계는 this네임스페이스를 반환하는 것입니다.

prefix getter 단계는 this네임스페이스 접두사를 반환하는 것입니다.

localName getter 단계는 this로컬 이름을 반환하는 것입니다.

name getter 단계는 this정규화된 이름을 반환하는 것입니다.

value getter 단계는 this을 반환하는 것입니다.

기존 속성 값을 설정하려면 속성 attribute와 문자열 value를 받아 다음 단계를 실행합니다:

  1. attribute요소가 null이면, attributevalue로 설정합니다.

  2. 그렇지 않으면, 속성 변경attributevalue에 대해 실행합니다.

value setter 단계는 기존 속성 값을 설정this 그리고 주어진 값으로 실행하는 것입니다.


ownerElement getter 단계는 this요소를 반환하는 것입니다.


specified getter 단계는 true를 반환하는 것입니다.

4.10. 인터페이스 CharacterData

[Exposed=Window]
interface CharacterData : Node {
  attribute [LegacyNullToEmptyString] DOMString data;
  readonly attribute unsigned long length;
  DOMString substringData(unsigned long offset, unsigned long count);
  undefined appendData(DOMString data);
  undefined insertData(unsigned long offset, DOMString data);
  undefined deleteData(unsigned long offset, unsigned long count);
  undefined replaceData(unsigned long offset, unsigned long count, DOMString data);
};

CharacterData 는 추상 인터페이스입니다. 직접 인스턴스를 얻을 수 없습니다. Text, ProcessingInstruction, 그리고 Comment 노드에서 사용됩니다.

노드CharacterData 인터페이스를 상속받으면, 연관된 변경 가능한 문자열 데이터를 가집니다.

replace data는 노드 node에 대해 offset offset, count count, data data가 주어졌을 때 다음 단계를 수행합니다:

  1. lengthnodelength로 설정합니다.
  2. offsetlength보다 크면 IndexSizeError IndexSizeError DOMException 예외를 던집니다.
  3. offset + countlength보다 크면 countlength - offset으로 설정합니다.
  4. mutation record "characterData"를 node에 대해 큐에 넣고, null, null, nodedata, « », « », null, null을 사용합니다.

  5. datanodedata에서 offset 코드 유닛 뒤에 삽입합니다.
  6. delete offsetoffset + data길이로 설정합니다.
  7. delete offset 코드 유닛부터 count 코드 유닛nodedata에서 제거합니다.
  8. live rangestart nodenode이고, start offsetoffset보다 크고 offset + count 이하라면, start offsetoffset으로 설정합니다.

  9. live rangeend nodenode이고, end offsetoffset보다 크고 offset + count 이하라면, end offsetoffset으로 설정합니다.

  10. live rangestart nodenode이고, start offsetoffset + count보다 크면, start offsetdata길이만큼 증가시키고, count만큼 감소시킵니다.

  11. live rangeend nodenode이고, end offsetoffset + count보다 크면, end offsetdata길이만큼 증가시키고, count만큼 감소시킵니다.

  12. node부모가 null이 아니면, children changed stepsnode부모에 대해 실행합니다.

substring data는 노드 node, offset offset, count count가 주어졌을 때 다음 단계를 수행합니다:

  1. lengthnodelength로 설정합니다.
  2. offsetlength보다 크면 IndexSizeError IndexSizeError DOMException 예외를 던집니다.
  3. offset + countlength보다 크면, 코드 유닛 기준으로 offset번째부터 끝까지 nodedata를 반환합니다.
  4. 코드 유닛 기준으로 offset번째부터 offset+count번째까지 nodedata를 반환합니다.

data getter 단계는 thisdata를 반환합니다. setter는 노드 this에 대해 offset 0, count thislength, 새 값으로 replace data를 실행해야 합니다.

length getter 단계는 thislength를 반환합니다.

substringData(offset, count) 메서드 단계는 노드 this, offset offset, count count에 대해 substring data를 실행한 결과를 반환합니다.

appendData(data) 메서드 단계는 노드 this, offset thislength, count 0, data datareplace data를 실행합니다.

insertData(offset, data) 메서드 단계는 노드 this, offset offset, count 0, data datareplace data를 실행합니다.

deleteData(offset, count) 메서드 단계는 노드 this, offset offset, count count, data는 빈 문자열로 replace data를 실행합니다.

replaceData(offset, count, data) 메서드 단계는 노드 this, offset offset, count count, data datareplace data를 실행합니다.

4.11. 인터페이스 Text

[Exposed=Window]
interface Text : CharacterData {
  constructor(optional DOMString data = "");

  [NewObject] Text splitText(unsigned long offset);
  readonly attribute DOMString wholeText;
};
text = new Text([data = ""])
Text 노드를 새로 생성하며, datadata입니다.
text . splitText(offset)
data를 지정한 offset에서 분할(split)하고, 나머지를 Text 노드로 반환합니다.
text . wholeText
모든 직접 Text 노드 형제data를 결합하여 반환합니다.

배타적 Text 노드Text 노드이지만, CDATASection 노드는 아닙니다.

연속 Text 노드들노드 node에 대해 node, node이전 형제 Text 노드가 있으면 그것과 그 연속 Text 노드들, 그리고 node다음 형제 Text 노드가 있으면 그것과 그 연속 Text 노드들을 포함하며, 중복은 제외합니다.

연속 배타적 Text 노드들노드 node에 대해 node, node이전 형제 배타적 Text 노드가 있으면 그것과 그 연속 배타적 Text 노드들, 그리고 node다음 형제 배타적 Text 노드가 있으면 그것과 그 연속 배타적 Text 노드들을 포함하며, 중복은 제외합니다.

자식 텍스트 콘텐츠노드 node연결된 모든 데이터의 합이며, Text 노드 자식들node에 속한 것들을 트리 순서대로 연결한 것입니다.

자손 텍스트 콘텐츠노드 node연결된 모든 데이터의 합이며, Text 노드 자손node에 속한 것들을 트리 순서대로 연결한 것입니다.


new Text(data) 생성자 단계는 thisdatadata로 설정하고, this노드 documentcurrent global object연관 Document로 설정합니다.

Text 노드 분할(split a Text node)Text 노드 node와 offset offset이 주어졌을 때 다음 단계를 수행합니다:

  1. lengthnodelength로 설정합니다.
  2. offsetlength보다 크면 IndexSizeError IndexSizeError DOMException 예외를 던집니다.
  3. countlength - offset으로 설정합니다.
  4. new datasubstring datanode, offset offset, count count에 대해 실행한 결과로 설정합니다.
  5. new nodeText 노드로 새로 만들고, node와 같은 노드 document를 사용합니다. new nodedatanew data로 설정합니다.
  6. parentnode부모로 설정합니다.
  7. parent가 null이 아니면:

    1. new nodeparentnode다음 형제 앞에 삽입합니다.

    2. live rangestart nodenode이고, start offsetoffset보다 크면, start nodenew node로 설정하고, start offsetoffset만큼 감소시킵니다.

    3. live rangeend nodenode이고, end offsetoffset보다 크면, end nodenew node로 설정하고, end offsetoffset만큼 감소시킵니다.

    4. live rangestart nodeparent이고, start offsetnode의 인덱스 + 1이면, start offset을 1만큼 증가시킵니다.

    5. live rangeend nodeparent이고, end offsetnode의 인덱스 + 1이면, end offset을 1만큼 증가시킵니다.

  8. Replace data 를 노드 node, offset offset, count count, data는 빈 문자열로 실행합니다.
  9. new node를 반환합니다.

splitText(offset) 메서드 단계는 splitthis, offset offset으로 실행합니다.

wholeText getter 단계는 연결(concatenation)data로, 연속 Text 노드들this의 것을 트리 순서로 반환합니다.

4.12. 인터페이스 CDATASection

[Exposed=Window]
interface CDATASection : Text {
};

4.13. 인터페이스 ProcessingInstruction

[Exposed=Window]
interface ProcessingInstruction : CharacterData {
  readonly attribute DOMString target;
};

ProcessingInstruction 노드는 연관된 target(대상)을 가집니다.

target getter 단계는 thistarget을 반환합니다.

4.14. 인터페이스 Comment

[Exposed=Window]
interface Comment : CharacterData {
  constructor(optional DOMString data = "");
};
comment = new Comment([data = ""])
Comment 노드를 새로 생성하며, datadata로 설정됩니다.

new Comment(data) 생성자 단계는 thisdatadata로 설정하고, this노드 documentcurrent global object연관 Document로 설정합니다.

5. 범위(Ranges)

5.1. "DOM Ranges" 소개

StaticRangeRange 객체(범위(range))는 노드 트리(node tree) 내의 콘텐츠 시퀀스를 나타냅니다. 각 범위시작점(start)끝점(end)을 가지며, 이는 경계점(boundary points)입니다. 경계점튜플(tuple)로, 노드오프셋(offset)으로 구성됩니다. 다시 말해, 범위(range)노드 트리 내에서 두 경계점 사이의 콘텐츠 조각을 나타냅니다.

범위(range)는 편집 시 콘텐츠 선택 및 복사 등에 자주 사용됩니다.

노드 트리(node tree)에서 범위(range)를 사용해 “syndata is awes”라는 시퀀스를 나타낼 수 있습니다. pp 엘리먼트에, emem 엘리먼트에 할당되었다고 가정하면, 다음과 같이 구현할 수 있습니다:

var range = new Range(),
    firstText = p.childNodes[1],
    secondText = em.firstChild
range.setStart(firstText, 9) // do not forget the leading space
range.setEnd(secondText, 4)
// range now stringifies to the aforementioned quote

속성(attribute)들(src, alt 등)은 위 노드 트리에서 범위(range)로 표현할 수 없습니다. 범위(range)는 오직 노드에만 적용됩니다.

Range 객체는 StaticRange 객체와 달리 노드 트리(node tree)의 변화에 영향을 받습니다. 그래서 라이브 범위(live range)라고도 부릅니다. 이런 변화(mutation)가 발생해도 범위는 무효화되지 않고, 동일한 콘텐츠 부분을 나타내려고 시도합니다. 반드시 라이브 범위(live range) 자체도 콘텐츠 일부가 변경될 때 노드 트리 변화에 따라 수정될 수 있습니다.

삽입(insert)제거(remove) 알고리즘, normalize() 메서드, 그리고 replace datasplit 알고리즘에 대한 세부 내용은 해당 부분을 참고하세요.

라이브 범위(live range)노드 트리의 변화에 따라 업데이트하는 작업은 비용이 많이 들 수 있습니다. 노드 트리의 변경마다 영향을 받는 모든 Range 객체를 업데이트해야 합니다. 애플리케이션이 어떤 라이브 범위에 관심이 없더라도, 변화가 있을 때 최신 상태를 유지하는 비용을 지불해야 합니다.

StaticRange 객체는 범위(range)의 경량 버전이며, 노드 트리(node tree)가 변해도 업데이트되지 않습니다. 그래서 라이브 범위와 같은 유지 비용이 발생하지 않습니다.

5.2. 경계점(boundary points)

경계점(boundary point)튜플(tuple)로, 노드(node) (노드)와 오프셋(offset) (0 이상의 정수)로 구성됩니다.

올바른 경계점(boundary point)오프셋(offset)은 0과 해당 경계점(boundary point)노드(node)길이(length) 사이(포함)입니다.

경계점의 위치(position)경계점(boundary point) (nodeA, offsetA)가 경계점(boundary point) (nodeB, offsetB)에 대해 이전(before), 동일(equal), 또는 이후(after)인지 반환하는 단계입니다:

  1. Assert: nodeAnodeB는 같은 루트(root)를 가집니다.

  2. nodeAnodeB와 같다면, offsetAoffsetB가 같으면 동일(equal), offsetAoffsetB보다 작으면 이전(before), offsetAoffsetB보다 크면 이후(after)를 반환합니다.
  3. nodeAnodeB를 뒤따르는(following) 노드라면, (nodeB, offsetB)와 (nodeA, offsetA)의 위치(position)이전(before)이면 이후(after), 이후(after)이전(before)을 반환합니다.

  4. nodeAnodeB의 조상(ancestor)이라면:

    1. childnodeB로 설정합니다.

    2. childnodeA의 자식(child)이 아니라면, child를 부모(parent)로 설정합니다.

    3. child인덱스(index)offsetA보다 작으면 이후(after)를 반환합니다.

  5. 이전(before)을 반환합니다.

5.3. 인터페이스 AbstractRange

[Exposed=Window]
interface AbstractRange {
  readonly attribute Node startContainer;
  readonly attribute unsigned long startOffset;
  readonly attribute Node endContainer;
  readonly attribute unsigned long endOffset;
  readonly attribute boolean collapsed;
};

AbstractRange 인터페이스를 구현하는 객체는 범위(range)라고 합니다.

범위(range)는 두 개의 경계점(boundary point)시작(start)끝(end) — 을 가집니다.

편의를 위해, 범위(range)시작 노드(start node)시작(start)노드(node)이고, 시작 오프셋(start offset)시작(start)오프셋(offset)이며, 끝 노드(end node)끝(end)노드(node), 그리고 끝 오프셋(end offset)끝(end)오프셋(offset)입니다.

범위(range)접힘(collapsed) 상태라면, 시작 노드(start node)끝 노드(end node)가 같으며, 시작 오프셋(start offset)끝 오프셋(end offset)도 같은 경우입니다.

node = range . startContainer
range시작 노드(start node)를 반환합니다.
offset = range . startOffset
range시작 오프셋(start offset)을 반환합니다.
node = range . endContainer
range끝 노드(end node)를 반환합니다.
offset = range . endOffset
range끝 오프셋(end offset)을 반환합니다.
collapsed = range . collapsed
range접힘(collapsed) 상태이면 true, 아니면 false를 반환합니다.

startContainer getter 단계는 this시작 노드(start node)를 반환합니다.

startOffset getter 단계는 this시작 오프셋(start offset)을 반환합니다.

endContainer getter 단계는 this끝 노드(end node)를 반환합니다.

endOffset getter 단계는 this끝 오프셋(end offset)을 반환합니다.

collapsed getter 단계는 this접힘(collapsed) 상태이면 true, 아니면 false를 반환합니다.

5.4. 인터페이스 StaticRange

dictionary StaticRangeInit {
  required Node startContainer;
  required unsigned long startOffset;
  required Node endContainer;
  required unsigned long endOffset;
};

[Exposed=Window]
interface StaticRange : AbstractRange {
  constructor(StaticRangeInit init);
};
staticRange = new StaticRange(init)

노드 트리(node tree)가 변경되어도 업데이트되지 않는 새로운 범위(range) 객체를 반환합니다.

new StaticRange(init) 생성자 단계는 다음과 같습니다:

  1. init["startContainer"] 또는 init["endContainer"] 가 DocumentType 또는 Attr 노드라면, InvalidNodeTypeError InvalidNodeTypeError DOMException 예외를 던집니다.

  2. thisstart를 (init["startContainer"], init["startOffset"]) 로, end를 (init["endContainer"], init["endOffset"])로 설정합니다.

StaticRange 는 다음 조건을 모두 만족하면 유효(valid)합니다:

5.5. 인터페이스 Range

[Exposed=Window]
interface Range : AbstractRange {
  constructor();

  readonly attribute Node commonAncestorContainer;

  undefined setStart(Node node, unsigned long offset);
  undefined setEnd(Node node, unsigned long offset);
  undefined setStartBefore(Node node);
  undefined setStartAfter(Node node);
  undefined setEndBefore(Node node);
  undefined setEndAfter(Node node);
  undefined collapse(optional boolean toStart = false);
  undefined selectNode(Node node);
  undefined selectNodeContents(Node node);

  const unsigned short START_TO_START = 0;
  const unsigned short START_TO_END = 1;
  const unsigned short END_TO_END = 2;
  const unsigned short END_TO_START = 3;
  short compareBoundaryPoints(unsigned short how, Range sourceRange);

  [CEReactions] undefined deleteContents();
  [CEReactions, NewObject] DocumentFragment extractContents();
  [CEReactions, NewObject] DocumentFragment cloneContents();
  [CEReactions] undefined insertNode(Node node);
  [CEReactions] undefined surroundContents(Node newParent);

  [NewObject] Range cloneRange();
  undefined detach();

  boolean isPointInRange(Node node, unsigned long offset);
  short comparePoint(Node node, unsigned long offset);

  boolean intersectsNode(Node node);

  stringifier;
};

Range 인터페이스를 구현하는 객체는 라이브 범위(live range)라고 합니다.

트리(tree)를 변경하는 알고리즘(특히 삽입(insert), 제거(remove), 이동(move), 데이터 교체(replace data), 그리고 분할(split) 알고리즘)은 해당 트리에 연결된 라이브 범위(live range)도 수정합니다.

루트(root)라이브 범위(live range)시작 노드(start node)루트(root)입니다.

노드(node) node포함(contained) 된 상태라면 라이브 범위(live range) range에 대해 node루트(root)range루트(root)와 같고, (node, 0)이 range시작(start)보다 이후(after)이며, (node, node길이(length))가 range끝(end)보다 이전(before)일 때입니다.

노드(node)부분적으로 포함(partially contained)된 상태라면 라이브 범위(live range)시작 노드(start node)포괄적 조상(inclusive ancestor)이지만 끝 노드(end node)는 아니거나, 반대의 경우입니다.

이 정의를 더 잘 이해하기 위한 몇 가지 사실:

라이브 범위 pre-remove 단계노드(node) node가 주어졌을 때 다음과 같습니다:

  1. parentnode부모(parent)로 설정합니다.

  2. Assert: parent는 null이 아닙니다.

  3. indexnode인덱스(index)로 설정합니다.

  4. 라이브 범위(live range)시작 노드(start node)node의 포괄적 자손(inclusive descendant)인 경우, 해당 범위의 시작(start)을 (parent, index)로 설정합니다.

  5. 라이브 범위(live range)끝 노드(end node)node의 포괄적 자손(inclusive descendant)인 경우, 해당 범위의 끝(end)을 (parent, index)로 설정합니다.

  6. 라이브 범위(live range)시작 노드(start node)parent이고 시작 오프셋(start offset)index보다 크면, 해당 범위의 시작 오프셋(start offset)을 1만큼 감소시킵니다.

  7. 라이브 범위(live range)끝 노드(end node)parent이고 끝 오프셋(end offset)index보다 크면, 해당 범위의 끝 오프셋(end offset)을 1만큼 감소시킵니다.


range = new Range()
새로운 라이브 범위(live range)를 반환합니다.

new Range() 생성자 단계는 thisstartend를 (현재 글로벌 객체(current global object)연관 Document, 0)으로 설정합니다.


container = range . commonAncestorContainer
문서(document)로부터 가장 멀리 떨어진, range시작 노드(start node)끝 노드(end node) 모두의 조상(ancestor)노드(node)를 반환합니다.

commonAncestorContainer getter 단계:

  1. container시작 노드(start node)로 설정합니다.
  2. container끝 노드(end node)포괄적 조상(inclusive ancestor)이 아닐 때까지, containercontainer부모(parent)로 바꿉니다.
  3. container를 반환합니다.

start 또는 end 설정 range경계점(boundary point) (node, offset)으로 설정하려면 다음 단계 실행:

  1. nodedoctype이면, InvalidNodeTypeError InvalidNodeTypeError DOMException 예외를 던집니다.
  2. offsetnode길이(length)보다 크면 IndexSizeError IndexSizeError DOMException 예외를 던집니다.
  3. bp경계점(boundary point) (node, offset)로 설정합니다.
  4. "set the start"로 호출된 경우
    1. range루트(root)node루트(root)와 다르거나, bprangeend보다 이후(after)라면, rangeendbp로 설정합니다.
    2. rangestartbp로 설정합니다.
    "set the end"로 호출된 경우
    1. range루트(root)node루트(root)와 다르거나, bprangestart보다 이전(before)이면, rangestartbp로 설정합니다.
    2. rangeendbp로 설정합니다.

setStart(node, offset) 메서드 단계는 start 설정this에 대해 경계점(boundary point) (node, offset)으로 실행합니다.

setEnd(node, offset) 메서드 단계는 end 설정this에 대해 경계점(boundary point) (node, offset)으로 실행합니다.

setStartBefore(node) 메서드 단계:

  1. parentnode부모(parent)로 설정합니다.
  2. parent가 null이면 InvalidNodeTypeError InvalidNodeTypeError DOMException 예외를 던집니다.
  3. start 설정this에 대해 경계점(boundary point) (parent, nodeindex)로 실행합니다.

setStartAfter(node) 메서드 단계:

  1. parentnode부모(parent)로 설정합니다.

  2. parent가 null이면 InvalidNodeTypeError InvalidNodeTypeError DOMException 예외를 던집니다.

  3. start 설정this에 대해 경계점(boundary point) (parent, nodeindex + 1)로 실행합니다.

setEndBefore(node) 메서드 단계:

  1. parentnode부모(parent)로 설정합니다.
  2. parent가 null이면 InvalidNodeTypeError InvalidNodeTypeError DOMException 예외를 던집니다.
  3. end 설정this에 대해 경계점(boundary point) (parent, nodeindex)로 실행합니다.

setEndAfter(node) 메서드 단계:

  1. parentnode부모(parent)로 설정합니다.

  2. parent가 null이면 InvalidNodeTypeError InvalidNodeTypeError DOMException 예외를 던집니다.

  3. end 설정this에 대해 경계점(boundary point) (parent, nodeindex + 1)로 실행합니다.

collapse(toStart) 메서드 단계는 toStart가 true면 endstart로, 아니면 startend로 설정합니다.

노드 선택(select)노드(node) node범위(range) range 내에서 선택하려면 다음 단계 실행:

  1. parentnode부모(parent)로 설정합니다.

  2. parent가 null이면 InvalidNodeTypeError InvalidNodeTypeError DOMException 예외를 던집니다.

  3. indexnodeindex로 설정합니다.

  4. rangestart경계점(boundary point) (parent, index)로 설정합니다.

  5. rangeend경계점(boundary point) (parent, index + 1)로 설정합니다.

selectNode(node) 메서드 단계는 노드 선택(select)node에 대해 this에서 실행합니다.

selectNodeContents(node) 메서드 단계:

  1. nodedoctype이면, InvalidNodeTypeError InvalidNodeTypeError DOMException 예외를 던집니다.

  2. lengthnode길이(length)로 설정합니다.

  3. start경계점(boundary point) (node, 0)으로 설정합니다.

  4. end경계점(boundary point) (node, length)로 설정합니다.


compareBoundaryPoints(how, sourceRange) 메서드 단계는 다음과 같습니다:

  1. how이 아래 값 중 하나가 아니면

    이면 NotSupportedError NotSupportedError DOMException 예외를 던집니다.

  2. this루트(root)sourceRange루트(root)와 다르면 WrongDocumentError WrongDocumentError DOMException 예외를 던집니다.
  3. how이 다음 중 하나라면:
    START_TO_START:
    this pointthisstart로 설정. other pointsourceRangestart로 설정.
    START_TO_END:
    this pointthisend로 설정. other pointsourceRangestart로 설정.
    END_TO_END:
    this pointthisend로 설정. other pointsourceRangeend로 설정.
    END_TO_START:
    this pointthisstart로 설정. other pointsourceRangeend로 설정.
  4. this pointother point에 대한 위치(position)

    before
    −1을 반환.
    equal
    0을 반환.
    after
    1을 반환.

deleteContents() 메서드 단계는 다음과 같습니다:

  1. thiscollapsed 상태면, 반환합니다.

  2. original start node, original start offset, original end node, original end offset를 각각 thisstart node, start offset, end node, 그리고 end offset로 설정합니다.
  3. original start nodeoriginal end node와 같고, CharacterData 노드(node)면, replace data를 node original start node, offset original start offset, count original end offsetoriginal start offset, 그리고 data는 빈 문자열로 실행한 뒤 반환합니다.

  4. nodes to remove포함(contained)된 모든 노드(node)의 리스트로 설정하고, 트리 순서(tree order)로 정렬합니다. 단, 부모가 포함(contained)된 경우는 제외합니다.
  5. original start node포괄적 조상(inclusive ancestor)이라면 new nodeoriginal start node로, new offsetoriginal start offset로 설정합니다.
  6. 그렇지 않으면:
    1. reference nodeoriginal start node로 설정합니다.
    2. reference node부모(parent)가 null이 아니고 포괄적 조상(inclusive ancestor)이 아니면, reference node를 부모로 설정합니다.
    3. new nodereference node부모(parent)로 설정하고, new offsetreference nodeindex + 1로 설정합니다.

      만약 reference node부모(parent)가 null이라면, 그 노드는 루트(root)이므로, this포괄적 조상(inclusive ancestor)이 되어, 이 단계에 도달하지 않습니다.

  7. original start nodeCharacterData 노드(node)면, replace data를 node original start node, offset original start offset, count original start node길이(length)original start offset, data는 빈 문자열로 실행합니다.

  8. nodes to remove에 있는 각 node트리 순서(tree order)대로 remove로 제거합니다.

  9. original end nodeCharacterData 노드(node)면, replace data를 node original end node, offset 0, count original end offset, data는 빈 문자열로 실행합니다.

  10. startend를 (new node, new offset)로 설정합니다.

추출(extract)라이브 범위(live range) range에 대해 다음 단계를 실행합니다:

  1. fragmentrangestart nodenode document로 설정된 새로운 DocumentFragment 노드(node)로 만듭니다.

  2. rangecollapsed 상태면, fragment를 반환합니다.

  3. original start node, original start offset, original end node, original end offsetrangestart node, start offset, end node, 그리고 end offset로 설정합니다.
  4. original start nodeoriginal end node와 같고, CharacterData 노드(node)라면:

    1. clonecloneoriginal start node로 만듭니다.
    2. clonedatasubstringing data로 node original start node, offset original start offset, count original end offsetoriginal start offset의 결과로 설정합니다.
    3. append clonefragment에 추가합니다.
    4. replace data를 node original start node, offset original start offset, count original end offsetoriginal start offset, data는 빈 문자열로 실행합니다.
    5. fragment를 반환합니다.
  5. common ancestororiginal start node로 설정합니다.
  6. common ancestor포괄적 조상(inclusive ancestor)이 아닐 때까지, common ancestor를 자신의 부모(parent)로 설정합니다.
  7. first partially contained child를 null로 설정합니다.
  8. original start node포괄적 조상(inclusive ancestor)이 아니라면 first partially contained childcommon ancestor의 자식 중 부분적으로 포함(partially contained)된 첫 번째 child로 설정합니다.
  9. last partially contained child를 null로 설정합니다.
  10. original end node포괄적 조상(inclusive ancestor)이 아니라면 last partially contained childcommon ancestor의 자식 중 부분적으로 포함(partially contained)된 마지막 child로 설정합니다.

    이 변수 할당은 실제로 항상 의미가 있습니다. 예를 들어, original start node포함하는 조상original end node가 아닌 경우, original start noderange에서 부분적으로 포함된 상태가 되고, common ancestor자식이 될 때까지 모든 조상도 부분적으로 포함됩니다. common ancestororiginal start node가 될 수 없습니다. 왜냐하면 original end node포함하는 조상이어야 하기 때문입니다. 다른 경우도 유사합니다. 또한, 두 자식이 모두 정의되어 있을 때 서로 같아지는 일은 없습니다.

  11. contained childrencommon ancestor포함(contained)된 모든 자식(children) 리스트로 설정하고, 트리 순서(tree order)로 정렬합니다.
  12. contained childrendoctype이 포함되어 있으면 HierarchyRequestError HierarchyRequestError DOMException 예외를 던집니다.

    첫 번째나 마지막 부분적으로 포함된 노드는 신경 쓸 필요 없습니다. doctype은 부분적으로 포함될 수 없으므로, 범위의 경계점이 될 수 없고, 어떤 것의 조상도 될 수 없습니다.

  13. original start node포괄적 조상(inclusive ancestor)이라면 new nodeoriginal start node로, new offsetoriginal start offset로 설정합니다.
  14. 그렇지 않으면:
    1. reference nodeoriginal start node로 설정합니다.
    2. reference node부모(parent)가 null이 아니고 포괄적 조상(inclusive ancestor)이 아니면, reference node를 부모로 설정합니다.
    3. new nodereference node부모(parent)로 설정하고, new offsetreference nodeindex + 1로 설정합니다.

      만약 reference node부모(parent)가 null이면, 그 노드는 루트(root)이므로, range포괄적 조상(inclusive ancestor)이 되어, 이 단계에 도달하지 않습니다.

  15. first partially contained childCharacterData 노드(node)라면:

    이 경우 first partially contained childoriginal start node입니다.

    1. clonecloneoriginal start node로 만듭니다.

    2. clonedatasubstringing data로 node original start node, offset original start offset, count original start node길이(length)original start offset의 결과로 설정합니다.

    3. append clonefragment에 추가합니다.

    4. replace data를 node original start node, offset original start offset, count original start node길이(length)original start offset, data는 빈 문자열로 실행합니다.

  16. 그렇지 않고 first partially contained child가 null이 아니면:
    1. cloneclonefirst partially contained child로 만듭니다.
    2. append clonefragment에 추가합니다.
    3. subrange를 새로운 라이브 범위(live range)로 만드는데, start가 (original start node, original start offset)이고, end가 (first partially contained child, first partially contained child길이(length))입니다.
    4. subfragmentextractsubrange의 결과로 만듭니다.

    5. append subfragmentclone에 추가합니다.
  17. contained children의 각 contained childappendfragment에 추가합니다.
  18. last partially contained childCharacterData 노드(node)라면:

    이 경우 last partially contained childoriginal end node입니다.

    1. clonecloneoriginal end node로 만듭니다.
    2. clonedatasubstringing data로 node original end node, offset 0, count original end offset로 설정합니다.
    3. append clonefragment에 추가합니다.
    4. replace data를 node original end node, offset 0, count original end offset, data는 빈 문자열로 실행합니다.
  19. 그렇지 않고 last partially contained child가 null이 아니면:
    1. cloneclonelast partially contained child로 만듭니다.
    2. append clonefragment에 추가합니다.
    3. subrange를 새로운 라이브 범위(live range)로 만드는데, start가 (last partially contained child, 0)이고, end가 (original end node, original end offset)입니다.
    4. subfragmentextractsubrange의 결과로 만듭니다.

    5. append subfragmentclone에 추가합니다.
  20. rangestartend를 (new node, new offset)로 설정합니다.
  21. fragment를 반환합니다.

extractContents() 메서드 단계는 추출(extract)this에 대해 실행한 결과를 반환합니다.

콘텐츠 복제(clone the contents)라이브 범위(live range) range에 대해 다음 단계를 실행합니다:

  1. fragmentrangestart nodenode document를 가진 새로운 DocumentFragment 노드(node)로 만듭니다.

  2. rangecollapsed 상태면, fragment를 반환합니다.

  3. original start node, original start offset, original end node, original end offset를 각각 rangestart node, start offset, end node, end offset로 설정합니다.
  4. original start nodeoriginal end node가 같고 CharacterData 노드(node)라면:

    1. clonecloneoriginal start node로 만듭니다.
    2. clonedatasubstringing data로 node original start node, offset original start offset, count original end offsetoriginal start offset의 결과로 설정합니다.
    3. append clonefragment에 추가합니다.
    4. fragment를 반환합니다.
  5. common ancestororiginal start node로 설정합니다.
  6. common ancestor포괄적 조상(inclusive ancestor)이 아닐 때까지, common ancestor를 자신의 부모(parent)로 설정합니다.
  7. first partially contained child를 null로 설정합니다.
  8. original start node포괄적 조상(inclusive ancestor)이 아니라면 first partially contained childcommon ancestor의 자식 중 부분적으로 포함(partially contained)된 첫 번째 child로 설정합니다.
  9. last partially contained child를 null로 설정합니다.
  10. original end node포괄적 조상(inclusive ancestor)이 아니라면 last partially contained childcommon ancestor의 자식 중 부분적으로 포함(partially contained)된 마지막 child로 설정합니다.

    이 변수 할당은 실제로 항상 의미가 있습니다. 예를 들어, original start node포함하는 조상original end node가 아니라면, original start noderange에서 부분적으로 포함된 상태가 되고, common ancestor자식이 될 때까지 모든 조상도 부분적으로 포함됩니다. common ancestororiginal start node가 될 수 없습니다. 왜냐하면 original end node포함하는 조상이어야 하기 때문입니다. 다른 경우도 유사합니다. 또한, 두 자식이 모두 정의되어 있을 때 서로 같아지는 일은 없습니다.

  11. contained childrencommon ancestor포함(contained)된 모든 자식(children) 리스트로 설정하고, 트리 순서(tree order)로 정렬합니다.
  12. contained childrendoctype이 포함되어 있으면 HierarchyRequestError HierarchyRequestError DOMException 예외를 던집니다.

    첫 번째나 마지막 부분적으로 포함된 노드는 신경 쓸 필요 없습니다. doctype은 부분적으로 포함될 수 없으므로, 범위의 경계점이 될 수 없고, 어떤 것의 조상도 될 수 없습니다.

  13. first partially contained childCharacterData 노드(node)라면:

    이 경우 first partially contained childoriginal start node입니다.

    1. clonecloneoriginal start node로 만듭니다.

    2. clonedatasubstringing data로 node original start node, offset original start offset, count original start node길이(length)original start offset의 결과로 설정합니다.

    3. append clonefragment에 추가합니다.

  14. 그렇지 않고 first partially contained child가 null이 아니면:
    1. cloneclonefirst partially contained child로 만듭니다.
    2. append clonefragment에 추가합니다.
    3. subrange를 새로운 라이브 범위(live range)로 만드는데, start가 (original start node, original start offset)이고, end가 (first partially contained child, first partially contained child길이(length))입니다.
    4. subfragmentclone the contentssubrange의 결과로 만듭니다.

    5. append subfragmentclone에 추가합니다.
  15. contained children의 각 contained child에 대해:
    1. cloneclonecontained child(clone children flag 설정)로 만듭니다.
    2. append clonefragment에 추가합니다.
  16. last partially contained childCharacterData 노드(node)라면:

    이 경우 last partially contained childoriginal end node입니다.

    1. clonecloneoriginal end node로 만듭니다.
    2. clonedatasubstringing data로 node original end node, offset 0, count original end offset로 설정합니다.
    3. append clonefragment에 추가합니다.
  17. 그렇지 않고 last partially contained child가 null이 아니면:
    1. cloneclonelast partially contained child로 만듭니다.
    2. append clonefragment에 추가합니다.
    3. subrange를 새로운 라이브 범위(live range)로 만드는데, start가 (last partially contained child, 0)이고, end가 (original end node, original end offset)입니다.
    4. subfragmentclone the contentssubrange의 결과로 만듭니다.

    5. append subfragmentclone에 추가합니다.
  18. fragment를 반환합니다.

cloneContents() 메서드 단계는 콘텐츠 복제(clone the contents)this에 대해 실행한 결과를 반환합니다.

삽입(insert)노드(node) node라이브 범위(live range) range에 삽입하려면 다음 단계를 실행합니다:

  1. rangestart nodeProcessingInstruction 또는 Comment 노드(node)이거나, Text 노드(node)이고, parent가 null이거나, 또는 node와 같으면, HierarchyRequestError HierarchyRequestError DOMException 예외를 던집니다.
  2. referenceNode를 null로 설정합니다.
  3. rangestart nodeText 노드(node)이면, referenceNode를 해당 Text 노드(node)로 설정합니다.
  4. 그렇지 않으면 referenceNodestart node자식(child)indexstart offset인 자식으로, 없다면 null로 설정합니다.
  5. parentreferenceNode가 null이면 rangestart node로, 아니면 referenceNodeparent로 설정합니다.
  6. Ensure pre-insert validitynodeparentreferenceNode 앞에 대해 실행합니다.
  7. rangestart nodeText 노드(node)면, referenceNodesplit 결과로, offset은 rangestart offset으로 실행합니다.
  8. nodereferenceNode와 같으면, referenceNodenext sibling으로 설정합니다.
  9. nodeparent가 null이 아니면, removenode를 제거합니다.

  10. newOffsetreferenceNode가 null이면 parentlength로, 아니면 referenceNodeindex로 설정합니다.

  11. nodeDocumentFragment 노드(node)nodelength만큼, 아니면 1만큼 newOffset을 증가시킵니다.

  12. pre-insertnodeparentreferenceNode 앞에 삽입합니다.
  13. rangecollapsed 상태면, rangeend를 (parent, newOffset)로 설정합니다.

insertNode(node) 메서드 단계는 삽입(insert)node에 대해 this에서 실행합니다.

surroundContents(newParent) 메서드 단계는 다음과 같습니다:

  1. 비-Text 노드(node)부분적으로 포함(partially contained)되어 있으면, InvalidStateError InvalidStateError DOMException 예외를 던집니다.

  2. newParentDocument, DocumentType, 또는 DocumentFragment 노드(node)면, InvalidNodeTypeError InvalidNodeTypeError DOMException 예외를 던집니다.

    역사적 이유로 CharacterData 노드(node)는 여기서 체크되지 않고, 나중에 부수 효과로 예외가 발생합니다.

  3. fragment추출(extract)this에 대해 실행한 결과로 만듭니다.

  4. newParent자식(children)이 있으면, replace all을 null로 newParent 내에서 실행합니다.

  5. 삽입(insert)newParent에 대해 this에 실행합니다.

  6. appendfragmentnewParent에 추가합니다.

  7. 선택(select)newParent에 대해 this에 실행합니다.

cloneRange() 메서드 단계는 같은 startend를 가진 새로운 라이브 범위(live range)를 반환합니다.

detach() 메서드 단계는 아무 동작도 하지 않습니다. 이 기능(Range 객체 비활성화)은 제거되었으나, 메서드 자체는 호환성을 위해 남아있습니다.


position = range . comparePoint(node, offset)
점이 범위 이전이면 −1, 범위 안에 있으면 0, 범위 이후이면 1을 반환합니다.
intersects = range . intersectsNode(node)
rangenode와 교차하는지 여부를 반환합니다.

isPointInRange(node, offset) 메서드 단계는 다음과 같습니다:

  1. node루트(root)this루트(root)와 다르면 false를 반환합니다.
  2. nodedoctype이면, InvalidNodeTypeError InvalidNodeTypeError DOMException 예외를 던집니다.
  3. offsetnodelength보다 크면, IndexSizeError IndexSizeError DOMException 예외를 던집니다.

  4. (node, offset)이 before start이거나 after end이면 false를 반환합니다.
  5. true를 반환합니다.

comparePoint(node, offset) 메서드 단계는 다음과 같습니다:

  1. node루트(root)this루트(root)와 다르면 WrongDocumentError WrongDocumentError DOMException 예외를 던집니다.
  2. nodedoctype이면, InvalidNodeTypeError InvalidNodeTypeError DOMException 예외를 던집니다.
  3. offsetnodelength보다 크면, IndexSizeError IndexSizeError DOMException 예외를 던집니다.

  4. (node, offset)이 before start이면 −1을 반환합니다.
  5. (node, offset)이 after end이면 1을 반환합니다.
  6. 0을 반환합니다.

intersectsNode(node) 메서드 단계는 다음과 같습니다:

  1. node루트(root)this루트(root)와 다르면 false를 반환합니다.
  2. parentnodeparent로 설정합니다.
  3. parent가 null이면 true를 반환합니다.
  4. offsetnodeindex로 설정합니다.
  5. (parent, offset)이 before end이고, (parent, offset + 1)이 after start이면 true를 반환합니다.
  6. false를 반환합니다.

문자열화(stringification behavior)는 다음 단계를 실행해야 합니다:

  1. s를 빈 문자열로 둡니다.

  2. 만약 이것시작 노드이것끝 노드이고 Text 노드인 경우, 해당 Text 노드데이터에서 이것시작 오프셋에서 시작하여 이것끝 오프셋에서 끝나는 부분 문자열을 반환합니다.

  3. 만약 이것시작 노드Text 노드인 경우, 해당 노드데이터이것시작 오프셋부터 끝까지의 부분 문자열을 s에 추가합니다.

  4. 이것포함된 모든 Text 노드데이터트리 순서대로 연결한 것을 s에 추가합니다.

  5. 만약 이것끝 노드Text 노드인 경우, 해당 노드데이터의 시작부터 이것끝 오프셋까지의 부분 문자열을 s에 추가합니다.

  6. s를 반환합니다.


createContextualFragment(), getClientRects(), 그리고 getBoundingClientRect() 메서드는 다른 명세에서 정의되어 있습니다. [DOM-Parsing] [CSSOM-VIEW]

6. 트래버설(Traversal)

NodeIteratorTreeWalker 객체는 노드(node) 트리(tree)를 필터링하고 탐색하는 데 사용할 수 있습니다.

NodeIteratorTreeWalker 객체는 active flag(활성 플래그)를 가지고, 재귀 호출을 방지합니다. 초기에는 설정되어 있지 않습니다.

NodeIteratorTreeWalker 객체는 또한 root(루트)(노드(node)), whatToShow(whatToShow)(비트마스크), 그리고 filter(필터)(콜백)을 가집니다.

필터(filter)노드(node) node에 대해 NodeIterator 또는 TreeWalker 객체 traverser 내에서 실행하려면 다음 단계를 따릅니다:

  1. traverseractive flag(활성 플래그)가 설정되어 있으면, "InvalidStateError" DOMException 예외를 던집니다.

  2. nnodenodeType 속성 값에서 1을 뺀 값으로 설정합니다.

  3. traverserwhatToShown번째 비트(0이 가장 낮은 비트)가 설정되어 있지 않으면, FILTER_SKIP을 반환합니다.

  4. traverserfilter가 null이면, FILTER_ACCEPT을 반환합니다.

  5. traverseractive flag(활성 플래그)를 설정합니다.

  6. result사용자 객체의 연산 호출traverserfilter, "acceptNode", 그리고 « node »로 실행한 반환값으로 설정합니다. 만약 예외가 발생하면 traverseractive flag(활성 플래그)를 해제하고 예외를 다시 던집니다.

  7. traverseractive flag(활성 플래그)를 해제합니다.

  8. result를 반환합니다.

6.1. 인터페이스 NodeIterator

[Exposed=Window]
interface NodeIterator {
  [SameObject] readonly attribute Node root;
  readonly attribute Node referenceNode;
  readonly attribute boolean pointerBeforeReferenceNode;
  readonly attribute unsigned long whatToShow;
  readonly attribute NodeFilter? filter;

  Node? nextNode();
  Node? previousNode();

  undefined detach();
};

NodeIterator 객체는 Document 객체의 createNodeIterator() 메서드를 사용하여 생성할 수 있습니다.

NodeIterator 객체는 관련된 iterator collection(이터레이터 컬렉션)을 가지며, 이는 해당 NodeIterator 객체의 root(루트)에서 시작되는 컬렉션(collection)이고, 필터는 모든 노드(node)에 매칭됩니다.

NodeIterator 객체는 또 reference(참조)(노드(node))와 pointer before reference(참조 앞 포인터)(불리언)을 가집니다.

앞서 언급했듯이, NodeIterator 객체는 관련된 active flag(활성 플래그), root(루트), whatToShow, 그리고 filter(필터) 또한 가지고 있습니다.

NodeIterator 사전-제거 단계(pre-remove steps)nodeIteratortoBeRemovedNode가 주어졌을 때 다음과 같습니다:

  1. toBeRemovedNodenodeIteratorreference(참조)포괄적 조상(inclusive ancestor)이 아니거나, toBeRemovedNodenodeIteratorroot(루트)라면, 반환합니다.

  2. nodeIteratorpointer before reference(참조 앞 포인터)가 true라면:

    1. nexttoBeRemovedNode의 첫 following(뒤따르는) 노드(node) 중, nodeIteratorroot(루트)포괄적 자손(inclusive descendant)인 것이면서, toBeRemovedNode포괄적 자손(inclusive descendant)이 아닌 첫 노드(node)로 설정하고, 없다면 null로 설정합니다.

    2. next가 null이 아니면, nodeIteratorreference(참조)next로 설정하고 반환합니다.

    3. 그렇지 않으면, nodeIteratorpointer before reference(참조 앞 포인터)를 false로 설정합니다.

      여기서 단계가 종료되는 것은 아닙니다.

  3. toBeRemovedNodeprevious sibling(이전 형제)이 null이면 nodeIteratorreference(참조)toBeRemovedNodeparent(부모)로, 아니면 toBeRemovedNodeprevious sibling(이전 형제)트리 순서(tree order)상 가장 마지막에 등장하는 포괄적 자손(inclusive descendant)으로 설정합니다.


root getter 단계는 thisroot(루트)를 반환합니다.

referenceNode getter 단계는 thisreference(참조)를 반환합니다.

pointerBeforeReferenceNode getter 단계는 thispointer before reference(참조 앞 포인터)를 반환합니다.

whatToShow getter 단계는 thiswhatToShow를 반환합니다.

filter getter 단계는 thisfilter(필터)를 반환합니다.

탐색(traverse)NodeIterator 객체 iterator와 방향 direction이 주어졌을 때 다음 단계를 실행합니다:

  1. nodeiteratorreference(참조)로 설정합니다.

  2. beforeNodeiteratorpointer before reference(참조 앞 포인터)로 설정합니다.

  3. while true:

    1. direction에 따라 분기합니다:

      next

      beforeNode가 false면, nodeiteratoriterator collection(이터레이터 컬렉션) 내에서 node를 뒤따르는(following) 첫 노드(node)로 설정합니다. 만약 해당 노드(node)가 없으면 null을 반환합니다.

      beforeNode가 true면, 이를 false로 설정합니다.

      previous

      beforeNode가 true면, nodeiteratoriterator collection(이터레이터 컬렉션) 내에서 node를 앞서는(preceding) 첫 노드(node)로 설정합니다. 만약 해당 노드(node)가 없으면 null을 반환합니다.

      beforeNode가 false면, 이를 true로 설정합니다.

    2. resultfilter(필터링)nodeiterator로 실행한 결과로 설정합니다.

    3. resultFILTER_ACCEPT이면, break합니다.

  4. iteratorreference(참조)node로 설정합니다.

  5. iteratorpointer before reference(참조 앞 포인터)beforeNode로 설정합니다.

  6. node를 반환합니다.

nextNode() 메서드 단계는 탐색(traverse)this와 next로 실행한 결과를 반환합니다.

previousNode() 메서드 단계는 탐색(traverse)this와 previous로 실행한 결과를 반환합니다.

detach() 메서드 단계는 아무 동작도 하지 않습니다. 이 기능(NodeIterator 객체 비활성화)은 제거되었으나, 메서드 자체는 호환성을 위해 남아있습니다.

6.2. 인터페이스 TreeWalker

[Exposed=Window]
interface TreeWalker {
  [SameObject] readonly attribute Node root;
  readonly attribute unsigned long whatToShow;
  readonly attribute NodeFilter? filter;
           attribute Node currentNode;

  Node? parentNode();
  Node? firstChild();
  Node? lastChild();
  Node? previousSibling();
  Node? nextSibling();
  Node? previousNode();
  Node? nextNode();
};

TreeWalker 객체는 Document 객체의 createTreeWalker() 메서드를 사용하여 생성할 수 있습니다.

TreeWalker 객체는 current(현재)(노드(node))를 가지고 있습니다.

앞서 언급했듯이 TreeWalker 객체는 관련된 root(루트), whatToShow, 그리고 filter(필터)도 가지고 있습니다.

root getter 단계는 thisroot(루트)를 반환합니다.

whatToShow getter 단계는 thiswhatToShow를 반환합니다.

filter getter 단계는 thisfilter(필터)를 반환합니다.

currentNode getter 단계는 thiscurrent(현재)를 반환합니다.

currentNode setter 단계는 thiscurrent(현재)를 주어진 값으로 설정합니다.


parentNode() 메서드 단계는 다음과 같습니다:

  1. nodethiscurrent(현재)로 설정합니다.

  2. node가 null이 아니고 thisroot(루트)가 아닐 때까지:

    1. nodenodeparent(부모)로 설정합니다.

    2. node가 null이 아니고 filter(필터링)nodethis로 실행한 결과가 FILTER_ACCEPT이면, thiscurrent(현재)node로 설정하고 node를 반환합니다.

  3. null을 반환합니다.

자식 탐색(traverse children)walkertype이 주어졌을 때 다음 단계를 실행합니다:

  1. nodewalkercurrent(현재)로 설정합니다.

  2. type이 first면 nodenode첫 번째 자식(first child)으로, last면 node마지막 자식(last child)으로 설정합니다.

  3. node가 null이 아닐 때까지:

    1. resultfilter(필터링)nodewalker로 실행한 결과로 설정합니다.

    2. resultFILTER_ACCEPT이면, walkercurrent(현재)node로 설정하고 node를 반환합니다.

    3. resultFILTER_SKIP이면:

      1. type이 first면 childnode첫 번째 자식(first child)으로, last면 childnode마지막 자식(last child)으로 설정합니다.

      2. child가 null이 아니면 nodechild로 설정하고 continue합니다.

    4. node가 null이 아닐 때까지:

      1. type이 first면 siblingnode다음 형제(next sibling)로, last면 siblingnode이전 형제(previous sibling)로 설정합니다.

      2. sibling이 null이 아니면 nodesibling으로 설정하고 break합니다.

      3. parentnodeparent(부모)로 설정합니다.

      4. parent가 null이거나 walkerroot(루트)이거나, walkercurrent(현재)이면 null을 반환합니다.

      5. nodeparent로 설정합니다.

  4. null을 반환합니다.

firstChild() 메서드 단계는 자식 탐색(traverse children)this와 first로 실행합니다.

lastChild() 메서드 단계는 자식 탐색(traverse children)this와 last로 실행합니다.

형제 탐색(traverse siblings)walkertype이 주어졌을 때 다음 단계를 실행합니다:

  1. nodewalkercurrent(현재)로 설정합니다.

  2. noderoot(루트)이면 null을 반환합니다.

  3. while true:

    1. type이 next면 siblingnode다음 형제(next sibling)로, previous면 siblingnode이전 형제(previous sibling)로 설정합니다.

    2. sibling이 null이 아닐 때까지:

      1. nodesibling으로 설정합니다.

      2. resultfilter(필터링)nodewalker로 실행한 결과로 설정합니다.

      3. resultFILTER_ACCEPT이면, walkercurrent(현재)node로 설정하고 node를 반환합니다.

      4. type이 next면 siblingnode첫 번째 자식(first child)으로, previous면 siblingnode마지막 자식(last child)으로 설정합니다.

      5. resultFILTER_REJECT 이거나 sibling이 null이면, type이 next면 siblingnode다음 형제(next sibling)로, previous면 siblingnode이전 형제(previous sibling)로 설정합니다.

    3. nodenodeparent(부모)로 설정합니다.

    4. node가 null이거나 walkerroot(루트)이면 null을 반환합니다.

    5. filter(필터링)nodewalker로 실행한 값이 FILTER_ACCEPT이면 null을 반환합니다.

nextSibling() 메서드 단계는 형제 탐색(traverse siblings)this와 next로 실행합니다.

previousSibling() 메서드 단계는 형제 탐색(traverse siblings)this와 previous로 실행합니다.

previousNode() 메서드 단계는 다음과 같습니다:

  1. nodethiscurrent(현재)로 설정합니다.

  2. nodethisroot(루트)가 아닐 때까지:

    1. siblingnode이전 형제(previous sibling)로 설정합니다.

    2. sibling이 null이 아닐 때까지:

      1. nodesibling으로 설정합니다.

      2. resultfilter(필터링)nodethis로 실행한 결과로 설정합니다.

      3. resultFILTER_REJECT가 아니고 node자식(child)을 가지고 있다면:

        1. nodenode마지막 자식(last child)으로 설정합니다.

        2. resultfilter(필터링)nodethis로 실행한 결과로 설정합니다.

      4. resultFILTER_ACCEPT이면, thiscurrent(현재)node로 설정하고 node를 반환합니다.

      5. siblingnode이전 형제(previous sibling)로 설정합니다.

    3. nodethisroot(루트)이거나 nodeparent(부모)가 null이면 null을 반환합니다.

    4. nodenodeparent(부모)로 설정합니다.

    5. filter(필터링)nodethis로 실행한 결과가 FILTER_ACCEPT이면 thiscurrent(현재)node로 설정하고 node를 반환합니다.

  3. null을 반환합니다.

nextNode() 메서드 단계는 다음과 같습니다:

  1. nodethiscurrent(현재)로 설정합니다.

  2. resultFILTER_ACCEPT로 설정합니다.

  3. while true:

    1. resultFILTER_REJECT가 아니고 node자식(child)을 가지고 있다면:

      1. nodenode첫 번째 자식(first child)으로 설정합니다.

      2. resultfilter(필터링)nodethis로 실행한 결과로 설정합니다.

      3. resultFILTER_ACCEPT이면, thiscurrent(현재)node로 설정하고 node를 반환합니다.

    2. sibling을 null로 설정합니다.

    3. temporarynode로 설정합니다.

    4. temporary가 null이 아닐 때까지:

      1. temporarythisroot(루트)이면 null을 반환합니다.

      2. siblingtemporary다음 형제(next sibling)로 설정합니다.

      3. sibling이 null이 아니면 nodesibling으로 설정하고 break합니다.

      4. temporarytemporaryparent(부모)로 설정합니다.

    5. resultfilter(필터링)nodethis로 실행한 결과로 설정합니다.

    6. resultFILTER_ACCEPT이면, thiscurrent(현재)node로 설정하고 node를 반환합니다.

6.3. 인터페이스 NodeFilter

[Exposed=Window]
callback interface NodeFilter {
  // Constants for acceptNode()
  const unsigned short FILTER_ACCEPT = 1;
  const unsigned short FILTER_REJECT = 2;
  const unsigned short FILTER_SKIP = 3;

  // Constants for whatToShow
  const unsigned long SHOW_ALL = 0xFFFFFFFF;
  const unsigned long SHOW_ELEMENT = 0x1;
  const unsigned long SHOW_ATTRIBUTE = 0x2;
  const unsigned long SHOW_TEXT = 0x4;
  const unsigned long SHOW_CDATA_SECTION = 0x8;
  const unsigned long SHOW_ENTITY_REFERENCE = 0x10; // legacy
  const unsigned long SHOW_ENTITY = 0x20; // legacy
  const unsigned long SHOW_PROCESSING_INSTRUCTION = 0x40;
  const unsigned long SHOW_COMMENT = 0x80;
  const unsigned long SHOW_DOCUMENT = 0x100;
  const unsigned long SHOW_DOCUMENT_TYPE = 0x200;
  const unsigned long SHOW_DOCUMENT_FRAGMENT = 0x400;
  const unsigned long SHOW_NOTATION = 0x800; // legacy

  unsigned short acceptNode(Node node);
};

NodeFilter 객체는 filter(필터)로써 NodeIteratorTreeWalker 객체에 사용할 수 있으며, whatToShow 비트마스크에 사용할 수 있는 상수도 제공합니다. NodeFilter 객체는 일반적으로 JavaScript 함수로 구현됩니다.

이 상수들은 filter(필터) 반환값으로 사용할 수 있습니다:

이 상수들은 whatToShow에 사용할 수 있습니다:

7. 집합(Sets)

예, DOMTokenList 라는 이름은 유감스러운 레거시 오류입니다.

7.1. 인터페이스 DOMTokenList

[Exposed=Window]
interface DOMTokenList {
  readonly attribute unsigned long length;
  getter DOMString? item(unsigned long index);
  boolean contains(DOMString token);
  [CEReactions] undefined add(DOMString... tokens);
  [CEReactions] undefined remove(DOMString... tokens);
  [CEReactions] boolean toggle(DOMString token, optional boolean force);
  [CEReactions] boolean replace(DOMString token, DOMString newToken);
  boolean supports(DOMString token);
  [CEReactions] stringifier attribute DOMString value;
  iterable<DOMString>;
};

DOMTokenList 객체는 토큰 집합(token set)(집합(set))을 가지고 있으며, 처음에는 비어 있습니다.

DOMTokenList 객체는 또한 관련된 element(요소)attribute(속성)local name(지역 이름)도 갖고 있습니다.

명세서지원 토큰(supported tokens)DOMTokenList의 관련 attribute(속성)local name(지역 이름)에 대해 정의할 수 있습니다.

DOMTokenList 객체의 검증 단계(validation steps)token을 대상으로 다음과 같습니다:

  1. 관련 attribute(속성)local name(지역 이름)지원 토큰(supported tokens)을 정의하지 않으면 TypeError를 던집니다.

  2. lowercase tokentokenASCII 소문자 복사본으로 설정합니다.

  3. lowercase token지원 토큰(supported tokens)에 포함되어 있으면 true를 반환합니다.

  4. false를 반환합니다.

DOMTokenList 객체의 업데이트 단계(update steps)는 다음과 같습니다:

  1. 관련 element(요소)가 관련 attribute(속성)를 갖고 있지 않고, 토큰 집합(token set)이 비어 있다면, 반환합니다.

  2. 관련 속성 값 설정(attribute value set)을 관련 element(요소)에 대해, 관련 attribute(속성)local name(지역 이름)ordered set serializer(정렬된 집합 직렬 변환기)의 결과로 설정합니다.

DOMTokenList 객체의 직렬화 단계(serialize steps)는 관련 속성 값 조회(get an attribute value)를 관련 element(요소)와 관련 attribute(속성)local name(지역 이름)으로 실행한 결과를 반환합니다.


DOMTokenList 객체는 관련 속성 변경 단계(attribute change steps)를 관련 element(요소)에 대해 갖고 있습니다:

  1. localName이 관련 속성의 local name(지역 이름)이고, namespace가 null이며, value가 null이면 빈(empty) 토큰 집합(token set)으로 설정합니다.

  2. 그렇지 않고 localName이 관련 속성의 local name(지역 이름)이고, namespace가 null이면 토큰 집합(token set)value파싱(parsed)한 값으로 설정합니다.

DOMTokenList 객체가 생성될 때:

  1. element를 관련 element(요소)로 설정합니다.

  2. localName을 관련 속성의 local name(지역 이름)으로 설정합니다.

  3. value속성 값 조회(get an attribute value)elementlocalName으로 실행한 결과로 설정합니다.

  4. 속성 변경 단계(attribute change steps)element, localName, value, value, null로 실행합니다.

tokenlist . length

토큰의 개수를 반환합니다.

tokenlist . item(index)
tokenlist[index]

index가 index인 토큰을 반환합니다.

tokenlist . contains(token)

token이 있으면 true, 없으면 false를 반환합니다.

tokenlist . add(tokens…)

이미 존재하는 토큰을 제외하고 모든 전달된 인자를 추가합니다.

인자 중 하나가 빈 문자열이면 "SyntaxError" DOMException을 던집니다.

인자 중 하나에 ASCII 공백이 포함되어 있으면 "InvalidCharacterError" DOMException을 던집니다.

tokenlist . remove(tokens…)

전달된 인자가 있으면 제거합니다.

인자 중 하나가 빈 문자열이면 "SyntaxError" DOMException을 던집니다.

인자 중 하나에 ASCII 공백이 포함되어 있으면 "InvalidCharacterError" DOMException을 던집니다.

tokenlist . toggle(token [, force])

force가 없으면 token을 "토글"하여, 있으면 제거하고 없으면 추가합니다. force가 true면 token을 추가합니다 (add()와 동일). force가 false면 token을 제거합니다 (remove()와 동일).

token이 있으면 true, 없으면 false를 반환합니다.

token이 빈 문자열이면 "SyntaxError" DOMException을 던집니다.

token에 공백이 있으면 "InvalidCharacterError" DOMException을 던집니다.

tokenlist . replace(token, newToken)

tokennewToken으로 바꿉니다.

tokennewToken으로 변경되면 true, 아니면 false를 반환합니다.

인자 중 하나가 빈 문자열이면 "SyntaxError" DOMException을 던집니다.

인자 중 하나에 공백이 있으면 "InvalidCharacterError" DOMException을 던집니다.

tokenlist . supports(token)

token이 관련 속성의 지원 토큰에 있으면 true, 아니면 false를 반환합니다.

관련 속성에 지원 토큰이 정의되어 있지 않으면 TypeError를 던집니다.

tokenlist . value

관련 집합을 문자열로 반환합니다.

값을 설정하면 관련 속성이 변경됩니다.

length 속성의 getter는 this토큰 집합(token set)크기(size)를 반환해야 합니다.

객체의 지원되는 속성 인덱스(supported property indices)는 0부터 객체의 토큰 집합(token set)크기(size) - 1까지의 숫자입니다. 단, 토큰 집합(token set)비어 있으면 지원되는 속성 인덱스가 없습니다.

item(index) 메서드 단계는 다음과 같습니다:

  1. indexthis토큰 집합(token set)크기(size) 이상이면 null을 반환합니다.

  2. this토큰 집합(token set)[index]을 반환합니다.

contains(token) 메서드 단계는 this토큰 집합(token set)[token]이 존재하면(exists) true, 아니면 false를 반환합니다.

add(tokens…) 메서드 단계는 다음과 같습니다:

  1. tokentokens에서:

    1. token이 빈 문자열이면 SyntaxError SyntaxError DOMException을 던집니다.

    2. tokenASCII 공백이 포함되어 있으면 InvalidCharacterError InvalidCharacterError DOMException을 던집니다.

  2. tokentokens에서 appendtokenthis토큰 집합(token set)에 추가합니다.

  3. 업데이트 단계(update steps)를 실행합니다.

remove(tokens…) 메서드 단계는 다음과 같습니다:

  1. tokentokens에서:

    1. token이 빈 문자열이면 SyntaxError SyntaxError DOMException을 던집니다.

    2. tokenASCII 공백이 포함되어 있으면 InvalidCharacterError InvalidCharacterError DOMException을 던집니다.

  2. tokentokens에서 removetokenthis토큰 집합(token set)에서 제거합니다.

  3. 업데이트 단계(update steps)를 실행합니다.

toggle(token, force) 메서드 단계는 다음과 같습니다:

  1. token이 빈 문자열이면 SyntaxError SyntaxError DOMException을 던집니다.

  2. tokenASCII 공백이 있으면 InvalidCharacterError InvalidCharacterError DOMException을 던집니다.

  3. this토큰 집합(token set)[token]이 존재하면(exists):

    1. force가 없거나 false면 removetokenthis토큰 집합(token set)에서 제거하고, 업데이트 단계(update steps)를 실행한 뒤 false를 반환합니다.

    2. true를 반환합니다.

  4. 그렇지 않고 force가 없거나 true면 appendtokenthis토큰 집합(token set)에 추가하고, 업데이트 단계(update steps)를 실행한 뒤 true를 반환합니다.

  5. false를 반환합니다.

업데이트 단계(update steps)는 웹 호환성을 위해 toggle()에서 항상 실행되지 않을 수 있습니다.

replace(token, newToken) 메서드 단계는 다음과 같습니다:

  1. token 또는 newToken이 빈 문자열이면 SyntaxError SyntaxError DOMException을 던집니다.

  2. token 또는 newTokenASCII 공백이 있으면 InvalidCharacterError InvalidCharacterError DOMException을 던집니다.

  3. this토큰 집합(token set)token포함되지 않으면 false를 반환합니다.

  4. replacetokenthis토큰 집합(token set)에서 newToken으로 변경합니다.

  5. 업데이트 단계(update steps)를 실행합니다.

  6. true를 반환합니다.

업데이트 단계(update steps)는 웹 호환성을 위해 replace()에서 항상 실행되지 않을 수 있습니다.

supports(token) 메서드 단계는 다음과 같습니다:

  1. result검증 단계(validation steps)token으로 실행한 반환값으로 설정합니다.

  2. result를 반환합니다.

value 속성은 this직렬화 단계(serialize steps)를 실행한 결과를 반환해야 합니다.

value 속성에 값을 설정하면 관련 속성 값 설정(attribute value set)을 관련 element(요소)에 대해, 관련 attribute(속성)local name(지역 이름)과 주어진 값으로 실행해야 합니다.

8. XPath

DOM Level 3 XPathXPath 1.0 표현식을 평가하는 API를 정의했습니다. 이 API들은 널리 구현되어 있지만 유지 관리되고 있지 않습니다. 인터페이스 정의는 Web IDL이 변경될 때 업데이트할 수 있도록 여기에서 유지되고 있습니다. 이러한 API의 전체 정의는 여전히 필요하며, 관련 작업은 whatwg/dom#67에서 추적 및 기여할 수 있습니다. [DOM-Level-3-XPath] [XPath] [WEBIDL]

8.1. 인터페이스 XPathResult

[Exposed=Window]
interface XPathResult {
  const unsigned short ANY_TYPE = 0;
  const unsigned short NUMBER_TYPE = 1;
  const unsigned short STRING_TYPE = 2;
  const unsigned short BOOLEAN_TYPE = 3;
  const unsigned short UNORDERED_NODE_ITERATOR_TYPE = 4;
  const unsigned short ORDERED_NODE_ITERATOR_TYPE = 5;
  const unsigned short UNORDERED_NODE_SNAPSHOT_TYPE = 6;
  const unsigned short ORDERED_NODE_SNAPSHOT_TYPE = 7;
  const unsigned short ANY_UNORDERED_NODE_TYPE = 8;
  const unsigned short FIRST_ORDERED_NODE_TYPE = 9;

  readonly attribute unsigned short resultType;
  readonly attribute unrestricted double numberValue;
  readonly attribute DOMString stringValue;
  readonly attribute boolean booleanValue;
  readonly attribute Node? singleNodeValue;
  readonly attribute boolean invalidIteratorState;
  readonly attribute unsigned long snapshotLength;

  Node? iterateNext();
  Node? snapshotItem(unsigned long index);
};

8.2. 인터페이스 XPathExpression

[Exposed=Window]
interface XPathExpression {
  // XPathResult.ANY_TYPE = 0
  XPathResult evaluate(Node contextNode, optional unsigned short type = 0, optional XPathResult? result = null);
};

8.3. 믹스인 XPathEvaluatorBase

callback interface XPathNSResolver {
  DOMString? lookupNamespaceURI(DOMString? prefix);
};

interface mixin XPathEvaluatorBase {
  [NewObject] XPathExpression createExpression(DOMString expression, optional XPathNSResolver? resolver = null);
  Node createNSResolver(Node nodeResolver); // legacy
  // XPathResult.ANY_TYPE = 0
  XPathResult evaluate(DOMString expression, Node contextNode, optional XPathNSResolver? resolver = null, optional unsigned short type = 0, optional XPathResult? result = null);
};
Document includes XPathEvaluatorBase;

createNSResolver(nodeResolver) 메서드의 단계는 nodeResolver를 반환하는 것입니다.

이 메서드는 오직 역사적 이유로 존재합니다.

8.4. 인터페이스 XPathEvaluator

[Exposed=Window]
interface XPathEvaluator {
  constructor();
};

XPathEvaluator includes XPathEvaluatorBase;

역사적 이유로 XPathEvaluator를 직접 생성하거나, Document에서 동일한 메서드에 접근할 수 있습니다.

9. XSLT

XSL Transformations (XSLT)는 XML 문서를 다른 XML 문서로 변환하는 언어입니다. 이 섹션에서 정의된 API는 널리 구현되어 있으며, Web IDL이 변경될 때 업데이트될 수 있도록 이곳에서 유지 관리됩니다. 이러한 API의 전체 정의는 여전히 필요하며, 관련 작업은 whatwg/dom#181에서 추적 및 기여할 수 있습니다. [XSLT]

9.1. 인터페이스 XSLTProcessor

[Exposed=Window]
interface XSLTProcessor {
  constructor();
  undefined importStylesheet(Node style);
  [CEReactions] DocumentFragment transformToFragment(Node source, Document output);
  [CEReactions] Document transformToDocument(Node source);
  undefined setParameter([LegacyNullToEmptyString] DOMString namespaceURI, DOMString localName, any value);
  any getParameter([LegacyNullToEmptyString] DOMString namespaceURI, DOMString localName);
  undefined removeParameter([LegacyNullToEmptyString] DOMString namespaceURI, DOMString localName);
  undefined clearParameters();
  undefined reset();
};

10. 보안 및 개인정보 보호 고려 사항

이 표준에는 알려진 보안 또는 개인정보 보호 고려 사항이 없습니다.

11. 과거(Historical)

이 표준에는 제거된 여러 인터페이스와 인터페이스 멤버가 있었습니다.

아래 인터페이스들이 제거되었습니다:

그리고 아래 인터페이스 멤버들이 제거되었습니다:

Attr
  • schemaTypeInfo
  • isId
Document
  • createEntityReference()
  • xmlEncoding
  • xmlStandalone
  • xmlVersion
  • strictErrorChecking
  • domConfig
  • normalizeDocument()
  • renameNode()
DocumentType
  • entities
  • notations
  • internalSubset
DOMImplementation
  • getFeature()
Element
  • schemaTypeInfo
  • setIdAttribute()
  • setIdAttributeNS()
  • setIdAttributeNode()
Node
  • isSupported
  • getFeature()
  • getUserData()
  • setUserData()
NodeIterator
  • expandEntityReferences
Text
  • isElementContentWhitespace
  • replaceWholeText()
TreeWalker
  • expandEntityReferences

감사의 글

DOM의 상호운용성을 높이고 이 표준의 목표를 발전시키는 데 수많은 사람들이 오랜 세월 동안 도움을 주었습니다. 마찬가지로, 오늘날 이 표준이 이 자리에 오기까지 많은 분들이 기여해 주셨습니다.

이에 감사의 마음을 전합니다: Adam Klein, Adrian Bateman, Ahmid snuggs, Alex Komoroske, Alex Russell, Alexey Shvayka, Andreas Kling, Andreu Botella, Anthony Ramine, Arkadiusz Michalski, Arnaud Le Hors, Arun Ranganathan, Benjamin Gruenbaum, Björn Höhrmann, Boris Zbarsky, Brandon Payton, Brandon Slade, Brandon Wallace, Brian Kardell, C. Scott Ananian, Cameron McCormack, Chris Dumez, Chris Paris, Chris Rebert, Cyrille Tuzi, Dan Burzo, Daniel Clark, Daniel Glazman, Darien Maillet Valentine, Darin Fisher, David Baron, David Bruant, David Flanagan, David Håsäther, David Hyatt, Deepak Sherveghar, Dethe Elza, Dimitri Glazkov, Domenic Denicola, Dominic Cooney, Dominique Hazaël-Massieux, Don Jordan, Doug Schepers, Edgar Chen, Elisée Maurer, Elliott Sprehn, Emilio Cobos Álvarez, Eric Bidelman, Erik Arvidsson, François Daoust, François Remy, Gary Kacmarcik, Gavin Nicol, Giorgio Liscio, Glen Huang, Glenn Adams, Glenn Maynard, Hajime Morrita, Harald Alvestrand, Hayato Ito, Henri Sivonen, Hongchan Choi, Hunan Rostomyan, Ian Hickson, Igor Bukanov, Jacob Rossi, Jake Archibald, Jake Verbaten, James Graham, James Greene, James M Snell, James Robinson, Jeffrey Yasskin, Jens Lindström, Jeremy Davis, Jesse McCarthy, Jinho Bang, João Eiras, Joe Kesselman, John Atkins, John Dai, Jonas Sicking, Jonathan Kingston, Jonathan Robie, Joris van der Wel, Joshua Bell, J. S. Choi, Jungkee Song, Justin Summerlin, Kagami Sascha Rosylight, 呂康豪 (Kang-Hao Lu), 田村健人 (Kent TAMURA), Kevin J. Sung, Kevin Sweeney, Kirill Topolyan, Koji Ishii, Lachlan Hunt, Lauren Wood, Luca Casonato, Luke Zielinski, Magne Andersson, Majid Valipour, Malte Ubl, Manish Goregaokar, Manish Tripathi, Marcos Caceres, Mark Miller, Martijn van der Ven, Mason Freed, Mats Palmgren, Mounir Lamouri, Michael Stramel, Michael™ Smith, Mike Champion, Mike Taylor, Mike West, Nicolás Peña Moreno, Nidhi Jaju, Ojan Vafai, Oliver Nightingale, Olli Pettay, Ondřej Žára, Peter Sharpe, Philip Jägenstedt, Philippe Le Hégaret, Piers Wombwell, Pierre-Marie Dartus, prosody—Gab Vereable Context(, Rafael Weinstein, Rakina Zata Amni, Richard Bradshaw, Rick Byers, Rick Waldron, Robbert Broersma, Robin Berjon, Roland Steiner, Rune F. Halvorsen, Russell Bicknell, Ruud Steltenpool, Ryosuke Niwa, Sam Dutton, Sam Sneddon, Samuel Giles, Sanket Joshi, Scott Haseley, Sebastian Mayr, Seo Sanghyeon, Sergey G. Grekhov, Shiki Okasaka, Shinya Kawanaka, Simon Pieters, Simon Wülker, Stef Busking, Steve Byrne, Stig Halvorsen, Tab Atkins, Takashi Sakamoto, Takayoshi Kochi, Theresa O’Connor, Theodore Dubois, timeless, Timo Tijhof, Tobie Langel, Tom Pixley, Travis Leithead, Trevor Rowbotham, triple-underscore, Tristan Fraipont, Veli Şenol, Vidur Apparao, Warren He, Xidorn Quan, Yash Handa, Yehuda Katz, Yoav Weiss, Yoichi Osato, Yoshinori Sano, Yu Han, Yusuke Abe, and Zack Weinberg 여러분 모두 정말 훌륭합니다!

이 표준은 Anne van Kesteren (Apple, annevk@annevk.nl) 그리고 Aryeh Gregor(ayg@aryeh.name), Ms2ger(ms2ger@gmail.com)의 큰 기여로 작성되었습니다.

지적재산권(Intellectual property rights)

커스텀 요소 관련 통합 지점의 개정 이력 일부는 custom elements에서 볼 수 있으며, w3c/webcomponents 저장소에서 확인할 수 있습니다. 해당 저장소는 W3C 소프트웨어 및 문서 라이선스로 제공됩니다.

Copyright © WHATWG (Apple, Google, Mozilla, Microsoft). 이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다. 일부가 소스 코드에 통합되는 경우, 해당 부분은 BSD 3-Clause License로 소스 코드에 적용됩니다.

이 문서는 Living Standard입니다. 특허 심사 버전에 관심 있는 분들은 Living Standard Review Draft를 참고하세요.

색인

이 명세에서 정의된 용어

참조에 의해 정의된 용어

참고 문헌

규범적 참고 문헌

[CONSOLE]
Dominic Farolino; Robert Kowalski; Terin Stock. Console Standard. Living Standard. URL: https://console.spec.whatwg.org/
[DEVICE-ORIENTATION]
Reilly Grant; Marcos Caceres. Device Orientation and Motion. URL: https://w3c.github.io/deviceorientation/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. Encoding Standard. Living Standard. URL: https://encoding.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[LONG-ANIMATION-FRAMES]
Long Animation Frames API. Editor's Draft. URL: https://w3c.github.io/long-animation-frames/
[SELECTORS4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. URL: https://drafts.csswg.org/selectors/
[SERVICE-WORKERS]
Yoshisato Yanagisawa; Monica CHINTALA. Service Workers. URL: https://w3c.github.io/ServiceWorker/
[TOUCH-EVENTS]
Doug Schepers; et al. Touch Events. URL: https://w3c.github.io/touch-events/
[UIEVENTS]
Gary Kacmarcik; Travis Leithead. UI Events. URL: https://w3c.github.io/uievents/
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/
[XML]
Tim Bray; et al. Extensible Markup Language (XML) 1.0 (Fifth Edition). 26 November 2008. REC. URL: https://www.w3.org/TR/xml/
[XML-NAMES]
Tim Bray; et al. Namespaces in XML 1.0 (Third Edition). 8 December 2009. REC. URL: https://www.w3.org/TR/xml-names/

정보 제공 참고 문헌

[CSSOM-VIEW]
Simon Pieters. CSSOM View Module. URL: https://drafts.csswg.org/cssom-view/
[DOM-Level-3-XPath]
Ray Whitmer. Document Object Model (DOM) Level 3 XPath Specification. 3 November 2020. NOTE. URL: https://www.w3.org/TR/DOM-Level-3-XPath/
[DOM-Parsing]
Travis Leithead. DOM Parsing and Serialization. URL: https://w3c.github.io/DOM-Parsing/
[FULLSCREEN]
Philip Jägenstedt. Fullscreen API Standard. Living Standard. URL: https://fullscreen.spec.whatwg.org/
[INDEXEDDB]
Nikunj Mehta; et al. Indexed Database API. URL: https://w3c.github.io/IndexedDB/
[XPath]
James Clark; Steven DeRose. XML Path Language (XPath) Version 1.0. 16 November 1999. REC. URL: https://www.w3.org/TR/xpath-10/
[XSLT]
James Clark. XSL Transformations (XSLT) Version 1.0. 16 November 1999. REC. URL: https://www.w3.org/TR/xslt-10/

IDL 색인

[Exposed=*]
interface Event {
  constructor(DOMString type, optional EventInit eventInitDict = {});

  readonly attribute DOMString type;
  readonly attribute EventTarget? target;
  readonly attribute EventTarget? srcElement; // legacy
  readonly attribute EventTarget? currentTarget;
  sequence<EventTarget> composedPath();

  const unsigned short NONE = 0;
  const unsigned short CAPTURING_PHASE = 1;
  const unsigned short AT_TARGET = 2;
  const unsigned short BUBBLING_PHASE = 3;
  readonly attribute unsigned short eventPhase;

  undefined stopPropagation();
           attribute boolean cancelBubble; // legacy alias of .stopPropagation()
  undefined stopImmediatePropagation();

  readonly attribute boolean bubbles;
  readonly attribute boolean cancelable;
           attribute boolean returnValue;  // legacy
  undefined preventDefault();
  readonly attribute boolean defaultPrevented;
  readonly attribute boolean composed;

  [LegacyUnforgeable] readonly attribute boolean isTrusted;
  readonly attribute DOMHighResTimeStamp timeStamp;

  undefined initEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false); // legacy
};

dictionary EventInit {
  boolean bubbles = false;
  boolean cancelable = false;
  boolean composed = false;
};

partial interface Window {
  [Replaceable] readonly attribute (Event or undefined) event; // legacy
};

[Exposed=*]
interface CustomEvent : Event {
  constructor(DOMString type, optional CustomEventInit eventInitDict = {});

  readonly attribute any detail;

  undefined initCustomEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false, optional any detail = null); // legacy
};

dictionary CustomEventInit : EventInit {
  any detail = null;
};

[Exposed=*]
interface EventTarget {
  constructor();

  undefined addEventListener(DOMString type, EventListener? callback, optional (AddEventListenerOptions or boolean) options = {});
  undefined removeEventListener(DOMString type, EventListener? callback, optional (EventListenerOptions or boolean) options = {});
  boolean dispatchEvent(Event event);
};

callback interface EventListener {
  undefined handleEvent(Event event);
};

dictionary EventListenerOptions {
  boolean capture = false;
};

dictionary AddEventListenerOptions : EventListenerOptions {
  boolean passive;
  boolean once = false;
  AbortSignal signal;
};

[Exposed=*]
interface AbortController {
  constructor();

  [SameObject] readonly attribute AbortSignal signal;

  undefined abort(optional any reason);
};

[Exposed=*]
interface AbortSignal : EventTarget {
  [NewObject] static AbortSignal abort(optional any reason);
  [Exposed=(Window,Worker), NewObject] static AbortSignal timeout([EnforceRange] unsigned long long milliseconds);
  [NewObject] static AbortSignal _any(sequence<AbortSignal> signals);

  readonly attribute boolean aborted;
  readonly attribute any reason;
  undefined throwIfAborted();

  attribute EventHandler onabort;
};
interface mixin NonElementParentNode {
  Element? getElementById(DOMString elementId);
};
Document includes NonElementParentNode;
DocumentFragment includes NonElementParentNode;

interface mixin DocumentOrShadowRoot {
  readonly attribute CustomElementRegistry? customElementRegistry;
};
Document includes DocumentOrShadowRoot;
ShadowRoot includes DocumentOrShadowRoot;

interface mixin ParentNode {
  [SameObject] readonly attribute HTMLCollection children;
  readonly attribute Element? firstElementChild;
  readonly attribute Element? lastElementChild;
  readonly attribute unsigned long childElementCount;

  [CEReactions, Unscopable] undefined prepend((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined append((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined replaceChildren((Node or DOMString)... nodes);

  [CEReactions] undefined moveBefore(Node node, Node? child);

  Element? querySelector(DOMString selectors);
  [NewObject] NodeList querySelectorAll(DOMString selectors);
};
Document includes ParentNode;
DocumentFragment includes ParentNode;
Element includes ParentNode;

interface mixin NonDocumentTypeChildNode {
  readonly attribute Element? previousElementSibling;
  readonly attribute Element? nextElementSibling;
};
Element includes NonDocumentTypeChildNode;
CharacterData includes NonDocumentTypeChildNode;

interface mixin ChildNode {
  [CEReactions, Unscopable] undefined before((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined after((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined replaceWith((Node or DOMString)... nodes);
  [CEReactions, Unscopable] undefined remove();
};
DocumentType includes ChildNode;
Element includes ChildNode;
CharacterData includes ChildNode;

interface mixin Slottable {
  readonly attribute HTMLSlotElement? assignedSlot;
};
Element includes Slottable;
Text includes Slottable;

[Exposed=Window]
interface NodeList {
  getter Node? item(unsigned long index);
  readonly attribute unsigned long length;
  iterable<Node>;
};

[Exposed=Window, LegacyUnenumerableNamedProperties]
interface HTMLCollection {
  readonly attribute unsigned long length;
  getter Element? item(unsigned long index);
  getter Element? namedItem(DOMString name);
};

[Exposed=Window]
interface MutationObserver {
  constructor(MutationCallback callback);

  undefined observe(Node target, optional MutationObserverInit options = {});
  undefined disconnect();
  sequence<MutationRecord> takeRecords();
};

callback MutationCallback = undefined (sequence<MutationRecord> mutations, MutationObserver observer);

dictionary MutationObserverInit {
  boolean childList = false;
  boolean attributes;
  boolean characterData;
  boolean subtree = false;
  boolean attributeOldValue;
  boolean characterDataOldValue;
  sequence<DOMString> attributeFilter;
};

[Exposed=Window]
interface MutationRecord {
  readonly attribute DOMString type;
  [SameObject] readonly attribute Node target;
  [SameObject] readonly attribute NodeList addedNodes;
  [SameObject] readonly attribute NodeList removedNodes;
  readonly attribute Node? previousSibling;
  readonly attribute Node? nextSibling;
  readonly attribute DOMString? attributeName;
  readonly attribute DOMString? attributeNamespace;
  readonly attribute DOMString? oldValue;
};

[Exposed=Window]
interface Node : EventTarget {
  const unsigned short ELEMENT_NODE = 1;
  const unsigned short ATTRIBUTE_NODE = 2;
  const unsigned short TEXT_NODE = 3;
  const unsigned short CDATA_SECTION_NODE = 4;
  const unsigned short ENTITY_REFERENCE_NODE = 5; // legacy
  const unsigned short ENTITY_NODE = 6; // legacy
  const unsigned short PROCESSING_INSTRUCTION_NODE = 7;
  const unsigned short COMMENT_NODE = 8;
  const unsigned short DOCUMENT_NODE = 9;
  const unsigned short DOCUMENT_TYPE_NODE = 10;
  const unsigned short DOCUMENT_FRAGMENT_NODE = 11;
  const unsigned short NOTATION_NODE = 12; // legacy
  readonly attribute unsigned short nodeType;
  readonly attribute DOMString nodeName;

  readonly attribute USVString baseURI;

  readonly attribute boolean isConnected;
  readonly attribute Document? ownerDocument;
  Node getRootNode(optional GetRootNodeOptions options = {});
  readonly attribute Node? parentNode;
  readonly attribute Element? parentElement;
  boolean hasChildNodes();
  [SameObject] readonly attribute NodeList childNodes;
  readonly attribute Node? firstChild;
  readonly attribute Node? lastChild;
  readonly attribute Node? previousSibling;
  readonly attribute Node? nextSibling;

  [CEReactions] attribute DOMString? nodeValue;
  [CEReactions] attribute DOMString? textContent;
  [CEReactions] undefined normalize();

  [CEReactions, NewObject] Node cloneNode(optional boolean subtree = false);
  boolean isEqualNode(Node? otherNode);
  boolean isSameNode(Node? otherNode); // legacy alias of ===

  const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01;
  const unsigned short DOCUMENT_POSITION_PRECEDING = 0x02;
  const unsigned short DOCUMENT_POSITION_FOLLOWING = 0x04;
  const unsigned short DOCUMENT_POSITION_CONTAINS = 0x08;
  const unsigned short DOCUMENT_POSITION_CONTAINED_BY = 0x10;
  const unsigned short DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
  unsigned short compareDocumentPosition(Node other);
  boolean contains(Node? other);

  DOMString? lookupPrefix(DOMString? namespace);
  DOMString? lookupNamespaceURI(DOMString? prefix);
  boolean isDefaultNamespace(DOMString? namespace);

  [CEReactions] Node insertBefore(Node node, Node? child);
  [CEReactions] Node appendChild(Node node);
  [CEReactions] Node replaceChild(Node node, Node child);
  [CEReactions] Node removeChild(Node child);
};

dictionary GetRootNodeOptions {
  boolean composed = false;
};

[Exposed=Window]
interface Document : Node {
  constructor();

  [SameObject] readonly attribute DOMImplementation implementation;
  readonly attribute USVString URL;
  readonly attribute USVString documentURI;
  readonly attribute DOMString compatMode;
  readonly attribute DOMString characterSet;
  readonly attribute DOMString charset; // legacy alias of .characterSet
  readonly attribute DOMString inputEncoding; // legacy alias of .characterSet
  readonly attribute DOMString contentType;

  readonly attribute DocumentType? doctype;
  readonly attribute Element? documentElement;
  HTMLCollection getElementsByTagName(DOMString qualifiedName);
  HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);

  [CEReactions, NewObject] Element createElement(DOMString localName, optional (DOMString or ElementCreationOptions) options = {});
  [CEReactions, NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName, optional (DOMString or ElementCreationOptions) options = {});
  [NewObject] DocumentFragment createDocumentFragment();
  [NewObject] Text createTextNode(DOMString data);
  [NewObject] CDATASection createCDATASection(DOMString data);
  [NewObject] Comment createComment(DOMString data);
  [NewObject] ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data);

  [CEReactions, NewObject] Node importNode(Node node, optional (boolean or ImportNodeOptions) options = false);
  [CEReactions] Node adoptNode(Node node);

  [NewObject] Attr createAttribute(DOMString localName);
  [NewObject] Attr createAttributeNS(DOMString? namespace, DOMString qualifiedName);

  [NewObject] Event createEvent(DOMString interface); // legacy

  [NewObject] Range createRange();

  // NodeFilter.SHOW_ALL = 0xFFFFFFFF
  [NewObject] NodeIterator createNodeIterator(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);
  [NewObject] TreeWalker createTreeWalker(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);
};

[Exposed=Window]
interface XMLDocument : Document {};

dictionary ElementCreationOptions {
  CustomElementRegistry customElementRegistry;
  DOMString is;
};

dictionary ImportNodeOptions {
  CustomElementRegistry customElementRegistry;
  boolean selfOnly = false;
};

[Exposed=Window]
interface DOMImplementation {
  [NewObject] DocumentType createDocumentType(DOMString name, DOMString publicId, DOMString systemId);
  [NewObject] XMLDocument createDocument(DOMString? namespace, [LegacyNullToEmptyString] DOMString qualifiedName, optional DocumentType? doctype = null);
  [NewObject] Document createHTMLDocument(optional DOMString title);

  boolean hasFeature(); // useless; always returns true
};

[Exposed=Window]
interface DocumentType : Node {
  readonly attribute DOMString name;
  readonly attribute DOMString publicId;
  readonly attribute DOMString systemId;
};

[Exposed=Window]
interface DocumentFragment : Node {
  constructor();
};

[Exposed=Window]
interface ShadowRoot : DocumentFragment {
  readonly attribute ShadowRootMode mode;
  readonly attribute boolean delegatesFocus;
  readonly attribute SlotAssignmentMode slotAssignment;
  readonly attribute boolean clonable;
  readonly attribute boolean serializable;
  readonly attribute Element host;

  attribute EventHandler onslotchange;
};

enum ShadowRootMode { "open", "closed" };
enum SlotAssignmentMode { "manual", "named" };

[Exposed=Window]
interface Element : Node {
  readonly attribute DOMString? namespaceURI;
  readonly attribute DOMString? prefix;
  readonly attribute DOMString localName;
  readonly attribute DOMString tagName;

  [CEReactions] attribute DOMString id;
  [CEReactions] attribute DOMString className;
  [SameObject, PutForwards=value] readonly attribute DOMTokenList classList;
  [CEReactions, Unscopable] attribute DOMString slot;

  boolean hasAttributes();
  [SameObject] readonly attribute NamedNodeMap attributes;
  sequence<DOMString> getAttributeNames();
  DOMString? getAttribute(DOMString qualifiedName);
  DOMString? getAttributeNS(DOMString? namespace, DOMString localName);
  [CEReactions] undefined setAttribute(DOMString qualifiedName, DOMString value);
  [CEReactions] undefined setAttributeNS(DOMString? namespace, DOMString qualifiedName, DOMString value);
  [CEReactions] undefined removeAttribute(DOMString qualifiedName);
  [CEReactions] undefined removeAttributeNS(DOMString? namespace, DOMString localName);
  [CEReactions] boolean toggleAttribute(DOMString qualifiedName, optional boolean force);
  boolean hasAttribute(DOMString qualifiedName);
  boolean hasAttributeNS(DOMString? namespace, DOMString localName);

  Attr? getAttributeNode(DOMString qualifiedName);
  Attr? getAttributeNodeNS(DOMString? namespace, DOMString localName);
  [CEReactions] Attr? setAttributeNode(Attr attr);
  [CEReactions] Attr? setAttributeNodeNS(Attr attr);
  [CEReactions] Attr removeAttributeNode(Attr attr);

  ShadowRoot attachShadow(ShadowRootInit init);
  readonly attribute ShadowRoot? shadowRoot;

  readonly attribute CustomElementRegistry? customElementRegistry;

  Element? closest(DOMString selectors);
  boolean matches(DOMString selectors);
  boolean webkitMatchesSelector(DOMString selectors); // legacy alias of .matches

  HTMLCollection getElementsByTagName(DOMString qualifiedName);
  HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);

  [CEReactions] Element? insertAdjacentElement(DOMString where, Element element); // legacy
  undefined insertAdjacentText(DOMString where, DOMString data); // legacy
};

dictionary ShadowRootInit {
  required ShadowRootMode mode;
  boolean delegatesFocus = false;
  SlotAssignmentMode slotAssignment = "named";
  boolean clonable = false;
  boolean serializable = false;
  CustomElementRegistry? customElementRegistry = null;
};

[Exposed=Window,
 LegacyUnenumerableNamedProperties]
interface NamedNodeMap {
  readonly attribute unsigned long length;
  getter Attr? item(unsigned long index);
  getter Attr? getNamedItem(DOMString qualifiedName);
  Attr? getNamedItemNS(DOMString? namespace, DOMString localName);
  [CEReactions] Attr? setNamedItem(Attr attr);
  [CEReactions] Attr? setNamedItemNS(Attr attr);
  [CEReactions] Attr removeNamedItem(DOMString qualifiedName);
  [CEReactions] Attr removeNamedItemNS(DOMString? namespace, DOMString localName);
};

[Exposed=Window]
interface Attr : Node {
  readonly attribute DOMString? namespaceURI;
  readonly attribute DOMString? prefix;
  readonly attribute DOMString localName;
  readonly attribute DOMString name;
  [CEReactions] attribute DOMString value;

  readonly attribute Element? ownerElement;

  readonly attribute boolean specified; // useless; always returns true
};
[Exposed=Window]
interface CharacterData : Node {
  attribute [LegacyNullToEmptyString] DOMString data;
  readonly attribute unsigned long length;
  DOMString substringData(unsigned long offset, unsigned long count);
  undefined appendData(DOMString data);
  undefined insertData(unsigned long offset, DOMString data);
  undefined deleteData(unsigned long offset, unsigned long count);
  undefined replaceData(unsigned long offset, unsigned long count, DOMString data);
};

[Exposed=Window]
interface Text : CharacterData {
  constructor(optional DOMString data = "");

  [NewObject] Text splitText(unsigned long offset);
  readonly attribute DOMString wholeText;
};

[Exposed=Window]
interface CDATASection : Text {
};
[Exposed=Window]
interface ProcessingInstruction : CharacterData {
  readonly attribute DOMString target;
};
[Exposed=Window]
interface Comment : CharacterData {
  constructor(optional DOMString data = "");
};

[Exposed=Window]
interface AbstractRange {
  readonly attribute Node startContainer;
  readonly attribute unsigned long startOffset;
  readonly attribute Node endContainer;
  readonly attribute unsigned long endOffset;
  readonly attribute boolean collapsed;
};

dictionary StaticRangeInit {
  required Node startContainer;
  required unsigned long startOffset;
  required Node endContainer;
  required unsigned long endOffset;
};

[Exposed=Window]
interface StaticRange : AbstractRange {
  constructor(StaticRangeInit init);
};

[Exposed=Window]
interface Range : AbstractRange {
  constructor();

  readonly attribute Node commonAncestorContainer;

  undefined setStart(Node node, unsigned long offset);
  undefined setEnd(Node node, unsigned long offset);
  undefined setStartBefore(Node node);
  undefined setStartAfter(Node node);
  undefined setEndBefore(Node node);
  undefined setEndAfter(Node node);
  undefined collapse(optional boolean toStart = false);
  undefined selectNode(Node node);
  undefined selectNodeContents(Node node);

  const unsigned short START_TO_START = 0;
  const unsigned short START_TO_END = 1;
  const unsigned short END_TO_END = 2;
  const unsigned short END_TO_START = 3;
  short compareBoundaryPoints(unsigned short how, Range sourceRange);

  [CEReactions] undefined deleteContents();
  [CEReactions, NewObject] DocumentFragment extractContents();
  [CEReactions, NewObject] DocumentFragment cloneContents();
  [CEReactions] undefined insertNode(Node node);
  [CEReactions] undefined surroundContents(Node newParent);

  [NewObject] Range cloneRange();
  undefined detach();

  boolean isPointInRange(Node node, unsigned long offset);
  short comparePoint(Node node, unsigned long offset);

  boolean intersectsNode(Node node);

  stringifier;
};

[Exposed=Window]
interface NodeIterator {
  [SameObject] readonly attribute Node root;
  readonly attribute Node referenceNode;
  readonly attribute boolean pointerBeforeReferenceNode;
  readonly attribute unsigned long whatToShow;
  readonly attribute NodeFilter? filter;

  Node? nextNode();
  Node? previousNode();

  undefined detach();
};

[Exposed=Window]
interface TreeWalker {
  [SameObject] readonly attribute Node root;
  readonly attribute unsigned long whatToShow;
  readonly attribute NodeFilter? filter;
           attribute Node currentNode;

  Node? parentNode();
  Node? firstChild();
  Node? lastChild();
  Node? previousSibling();
  Node? nextSibling();
  Node? previousNode();
  Node? nextNode();
};
[Exposed=Window]
callback interface NodeFilter {
  // Constants for acceptNode()
  const unsigned short FILTER_ACCEPT = 1;
  const unsigned short FILTER_REJECT = 2;
  const unsigned short FILTER_SKIP = 3;

  // Constants for whatToShow
  const unsigned long SHOW_ALL = 0xFFFFFFFF;
  const unsigned long SHOW_ELEMENT = 0x1;
  const unsigned long SHOW_ATTRIBUTE = 0x2;
  const unsigned long SHOW_TEXT = 0x4;
  const unsigned long SHOW_CDATA_SECTION = 0x8;
  const unsigned long SHOW_ENTITY_REFERENCE = 0x10; // legacy
  const unsigned long SHOW_ENTITY = 0x20; // legacy
  const unsigned long SHOW_PROCESSING_INSTRUCTION = 0x40;
  const unsigned long SHOW_COMMENT = 0x80;
  const unsigned long SHOW_DOCUMENT = 0x100;
  const unsigned long SHOW_DOCUMENT_TYPE = 0x200;
  const unsigned long SHOW_DOCUMENT_FRAGMENT = 0x400;
  const unsigned long SHOW_NOTATION = 0x800; // legacy

  unsigned short acceptNode(Node node);
};

[Exposed=Window]
interface DOMTokenList {
  readonly attribute unsigned long length;
  getter DOMString? item(unsigned long index);
  boolean contains(DOMString token);
  [CEReactions] undefined add(DOMString... tokens);
  [CEReactions] undefined remove(DOMString... tokens);
  [CEReactions] boolean toggle(DOMString token, optional boolean force);
  [CEReactions] boolean replace(DOMString token, DOMString newToken);
  boolean supports(DOMString token);
  [CEReactions] stringifier attribute DOMString value;
  iterable<DOMString>;
};

[Exposed=Window]
interface XPathResult {
  const unsigned short ANY_TYPE = 0;
  const unsigned short NUMBER_TYPE = 1;
  const unsigned short STRING_TYPE = 2;
  const unsigned short BOOLEAN_TYPE = 3;
  const unsigned short UNORDERED_NODE_ITERATOR_TYPE = 4;
  const unsigned short ORDERED_NODE_ITERATOR_TYPE = 5;
  const unsigned short UNORDERED_NODE_SNAPSHOT_TYPE = 6;
  const unsigned short ORDERED_NODE_SNAPSHOT_TYPE = 7;
  const unsigned short ANY_UNORDERED_NODE_TYPE = 8;
  const unsigned short FIRST_ORDERED_NODE_TYPE = 9;

  readonly attribute unsigned short resultType;
  readonly attribute unrestricted double numberValue;
  readonly attribute DOMString stringValue;
  readonly attribute boolean booleanValue;
  readonly attribute Node? singleNodeValue;
  readonly attribute boolean invalidIteratorState;
  readonly attribute unsigned long snapshotLength;

  Node? iterateNext();
  Node? snapshotItem(unsigned long index);
};

[Exposed=Window]
interface XPathExpression {
  // XPathResult.ANY_TYPE = 0
  XPathResult evaluate(Node contextNode, optional unsigned short type = 0, optional XPathResult? result = null);
};

callback interface XPathNSResolver {
  DOMString? lookupNamespaceURI(DOMString? prefix);
};

interface mixin XPathEvaluatorBase {
  [NewObject] XPathExpression createExpression(DOMString expression, optional XPathNSResolver? resolver = null);
  Node createNSResolver(Node nodeResolver); // legacy
  // XPathResult.ANY_TYPE = 0
  XPathResult evaluate(DOMString expression, Node contextNode, optional XPathNSResolver? resolver = null, optional unsigned short type = 0, optional XPathResult? result = null);
};
Document includes XPathEvaluatorBase;

[Exposed=Window]
interface XPathEvaluator {
  constructor();
};

XPathEvaluator includes XPathEvaluatorBase;

[Exposed=Window]
interface XSLTProcessor {
  constructor();
  undefined importStylesheet(Node style);
  [CEReactions] DocumentFragment transformToFragment(Node source, Document output);
  [CEReactions] Document transformToDocument(Node source);
  undefined setParameter([LegacyNullToEmptyString] DOMString namespaceURI, DOMString localName, any value);
  any getParameter([LegacyNullToEmptyString] DOMString namespaceURI, DOMString localName);
  undefined removeParameter([LegacyNullToEmptyString] DOMString namespaceURI, DOMString localName);
  undefined clearParameters();
  undefined reset();
};

MDN

AbortController/AbortController

In all current engines.

Firefox57+Safari12.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+

AbortController/abort

In all current engines.

Firefox57+Safari12.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

AbortController/signal

In all current engines.

Firefox57+Safari12.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

AbortController

In all current engines.

Firefox57+Safari12.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

AbortSignal/abort_event

In all current engines.

Firefox57+Safari11.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

AbortSignal/abort_event

In all current engines.

Firefox57+Safari11.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

AbortSignal/abort_static

In all current engines.

Firefox88+Safari15+Chrome93+
Opera?Edge93+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.12.0+
MDN

AbortSignal/aborted

In all current engines.

Firefox57+Safari11.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

AbortSignal/reason

In all current engines.

Firefox97+Safari15.4+Chrome98+
Opera?Edge98+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js17.2.0+
MDN

AbortSignal/throwIfAborted

In all current engines.

Firefox97+Safari15.4+Chrome100+
Opera?Edge100+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js17.3.0+
MDN

AbortSignal/timeout_static

In all current engines.

Firefox100+Safari16+Chrome103+
Opera?Edge103+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js17.3.0+
MDN

AbortSignal

In all current engines.

Firefox57+Safari11.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

AbstractRange/collapsed

In all current engines.

Firefox69+Safari14.1+Chrome90+
Opera?Edge90+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Range/collapsed

In all current engines.

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

StaticRange/collapsed

In all current engines.

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

AbstractRange/endContainer

In all current engines.

Firefox69+Safari14.1+Chrome90+
Opera?Edge90+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Range/endContainer

In all current engines.

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

StaticRange/endContainer

In all current engines.

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

AbstractRange/endOffset

In all current engines.

Firefox69+Safari14.1+Chrome90+
Opera?Edge90+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Range/endOffset

In all current engines.

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

StaticRange/endOffset

In all current engines.

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

AbstractRange/startContainer

In all current engines.

Firefox69+Safari14.1+Chrome90+
Opera?Edge90+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Range/startContainer

In all current engines.

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

StaticRange/startContainer

In all current engines.

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

AbstractRange/startOffset

In all current engines.

Firefox69+Safari14.1+Chrome90+
Opera?Edge90+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Range/startOffset

In all current engines.

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

StaticRange/startOffset

In all current engines.

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

AbstractRange

In all current engines.

Firefox69+Safari14.1+Chrome90+
Opera?Edge90+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Attr/localName

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

Attr/name

In all current engines.

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

Attr/namespaceURI

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

Attr/ownerElement

In all current engines.

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

Attr/prefix

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

Attr/value

In all current engines.

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

Attr

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

CDATASection

In all current engines.

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

CharacterData/after

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentType/after

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/after

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CharacterData/appendData

In all current engines.

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

CharacterData/before

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentType/before

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/before

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CharacterData/data

In all current engines.

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

CharacterData/deleteData

In all current engines.

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

CharacterData/insertData

In all current engines.

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

CharacterData/length

In all current engines.

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

CharacterData/nextElementSibling

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/nextElementSibling

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

CharacterData/previousElementSibling

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/previousElementSibling

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

CharacterData/remove

In all current engines.

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

DocumentType/remove

In all current engines.

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

Element/remove

In all current engines.

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

CharacterData/replaceData

In all current engines.

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

CharacterData/replaceWith

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentType/replaceWith

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/replaceWith

In all current engines.

Firefox49+Safari10+Chrome54+
Opera39+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CharacterData/substringData

In all current engines.

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

CharacterData

In all current engines.

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

Comment/Comment

In all current engines.

Firefox24+Safari8+Chrome29+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Comment

In all current engines.

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

CustomEvent/CustomEvent

In all current engines.

Firefox11+Safari6+Chrome15+
Opera11.6+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12+
MDN

CustomEvent/detail

In all current engines.

Firefox6+Safari5+Chrome5+
Opera11.6+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12+
MDN

CustomEvent

In all current engines.

Firefox6+Safari5+Chrome5+
Opera11+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
Node.js19.0.0+
MDN

DOMImplementation/createDocument

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

DOMImplementation/createDocumentType

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

DOMImplementation/createHTMLDocument

In all current engines.

Firefox4+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

DOMImplementation

In all current engines.

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

DOMTokenList/add

In all current engines.

Firefox3.6+Safari5.1+Chrome8+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

DOMTokenList/contains

In all current engines.

Firefox3.6+Safari5.1+Chrome8+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

DOMTokenList/item

In all current engines.

Firefox3.6+Safari5.1+Chrome8+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

DOMTokenList/length

In all current engines.

Firefox3.6+Safari5.1+Chrome8+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

DOMTokenList/remove

In all current engines.

Firefox3.6+Safari5.1+Chrome8+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

DOMTokenList/replace

In all current engines.

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

DOMTokenList/supports

In all current engines.

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

DOMTokenList/toggle

In all current engines.

Firefox3.6+Safari5.1+Chrome8+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

DOMTokenList/value

In all current engines.

Firefox47+Safari10+Chrome50+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DOMTokenList

In all current engines.

Firefox3.6+Safari5.1+Chrome8+
Opera11.5+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11.5+
MDN

Document/Document

In all current engines.

Firefox20+Safari8+Chrome60+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Document/URL

In all current engines.

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

Document/adoptNode

In all current engines.

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

Document/append

In all current engines.

Firefox49+Safari10+Chrome54+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentFragment/append

In all current engines.

Firefox49+Safari10+Chrome54+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/append

In all current engines.

Firefox49+Safari10+Chrome54+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Document/characterSet

In all current engines.

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

Document/childElementCount

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentFragment/childElementCount

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/childElementCount

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

Document/children

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentFragment/children

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/children

In all current engines.

Firefox3.5+Safari4+Chrome1+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/compatMode

In all current engines.

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

Document/contentType

In all current engines.

Firefox1+Safari9+Chrome36+
Opera23+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile24+
MDN

Document/createAttribute

In all current engines.

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

Document/createAttributeNS

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

Document/createCDATASection

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+

Document/createComment

In all current engines.

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

Document/createDocumentFragment

In all current engines.

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

Document/createElement

In all current engines.

Firefox1+Safari1+Chrome1+
Opera6+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android4+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/createElementNS

In all current engines.

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

Document/createEvent

In all current engines.

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

Document/createExpression

In all current engines.

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

XPathEvaluator/createExpression

In all current engines.

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

Document/createNodeIterator

In all current engines.

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

Document/createNSResolver

In all current engines.

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

XPathEvaluator/createNSResolver

In all current engines.

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

Document/createProcessingInstruction

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

Document/createRange

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

Document/createTextNode

In all current engines.

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

Document/createTreeWalker

In all current engines.

Firefox1+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/doctype

In all current engines.

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

Document/documentElement

In all current engines.

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

Document/documentURI

In all current engines.

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

Document/evaluate

In all current engines.

Firefox1+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+

XPathEvaluator/evaluate

In all current engines.

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

Document/firstElementChild

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentFragment/firstElementChild

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/firstElementChild

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

Document/getElementById

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/getElementsByClassName

In all current engines.

Firefox3+Safari3.1+Chrome1+
Opera9.5+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/getElementsByTagName

In all current engines.

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

Document/getElementsByTagNameNS

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

Document/implementation

In all current engines.

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

Document/importNode

In all current engines.

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

Document/lastElementChild

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentFragment/lastElementChild

In all current engines.

Firefox25+Safari9+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/lastElementChild

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

Document/prepend

In all current engines.

Firefox49+Safari10+Chrome54+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentFragment/prepend

In all current engines.

Firefox49+Safari10+Chrome54+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/prepend

In all current engines.

Firefox49+Safari10+Chrome54+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Document/querySelector

In all current engines.

Firefox3.5+Safari3.1+Chrome1+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+

DocumentFragment/querySelector

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

Document/querySelectorAll

In all current engines.

Firefox3.5+Safari3.1+Chrome1+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+

DocumentFragment/querySelectorAll

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+

Element/querySelector

In all current engines.

Firefox3.5+Safari3.1+Chrome1+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+

Element/querySelectorAll

In all current engines.

Firefox3.5+Safari3.1+Chrome1+
Opera10+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Document/replaceChildren

In all current engines.

Firefox78+Safari14+Chrome86+
Opera?Edge86+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

DocumentFragment/replaceChildren

In all current engines.

Firefox78+Safari14+Chrome86+
Opera?Edge86+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Element/replaceChildren

In all current engines.

Firefox78+Safari14+Chrome86+
Opera?Edge86+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Document

In all current engines.

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

DocumentFragment/DocumentFragment

In all current engines.

Firefox24+Safari8+Chrome29+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DocumentFragment/getElementById

In all current engines.

Firefox28+Safari9+Chrome36+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DocumentFragment

In all current engines.

Firefox1+Safari3+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

DocumentType/name

In all current engines.

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

DocumentType/publicId

In all current engines.

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

DocumentType/systemId

In all current engines.

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

DocumentType

In all current engines.

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

Element/assignedSlot

In all current engines.

Firefox63+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Text/assignedSlot

In all current engines.

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

Element/attachShadow

In all current engines.

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

Element/attributes

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/classList

In all current engines.

Firefox3.6+Safari7+Chrome22+
Opera11.5+Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4+Samsung Internet?Opera Mobile11.5+
MDN

Element/className

In all current engines.

Firefox1+Safari1+Chrome22+
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/closest

In all current engines.

Firefox35+Safari6+Chrome41+
Opera?Edge79+
Edge (Legacy)15+IENone
Firefox for Android?iOS Safari9+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/getAttribute

In all current engines.

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

Element/getAttributeNames

In all current engines.

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

Element/getAttributeNode

In all current engines.

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

Element/getAttributeNodeNS

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

Element/getAttributeNS

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

Element/getElementsByClassName

In all current engines.

Firefox3+Safari3.1+Chrome1+
Opera9.5+Edge79+
Edge (Legacy)16+IENone
Firefox for Android4+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/getElementsByTagName

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/getElementsByTagNameNS

In all current engines.

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

Element/hasAttribute

In all current engines.

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

Element/hasAttributeNS

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

Element/hasAttributes

In all current engines.

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

Element/id

In all current engines.

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

Element/insertAdjacentElement

In all current engines.

Firefox48+Safari3+Chrome1+
Opera8+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Element/insertAdjacentText

In all current engines.

Firefox48+Safari4+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari4+Chrome for Android?Android WebView2.2+Samsung Internet?Opera Mobile12.1+
MDN

Element/localName

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

Element/matches

In all current engines.

Firefox34+Safari8+Chrome33+
Opera21+Edge79+
Edge (Legacy)15+IENone
Firefox for Android34+iOS Safari?Chrome for Android?Android WebView4.4+Samsung Internet?Opera Mobile21+
MDN

Element/namespaceURI

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

Element/prefix

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

Element/removeAttribute

In all current engines.

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

Element/removeAttributeNode

In all current engines.

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

Element/removeAttributeNS

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

Element/setAttribute

In all current engines.

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

Element/setAttributeNode

In all current engines.

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

Element/setAttributeNodeNS

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

Element/setAttributeNS

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

Element/shadowRoot

In all current engines.

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

Element/slot

In all current engines.

Firefox63+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Global_attributes/slot

In all current engines.

Firefox63+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)NoneIE?
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element/tagName

In all current engines.

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

Element/toggleAttribute

In all current engines.

Firefox63+Safari12+Chrome69+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Element

In all current engines.

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

Event/Event

In all current engines.

Firefox11+Safari6+Chrome15+
Opera11.6+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12+
Node.js15.0.0+
MDN

Event/bubbles

In all current engines.

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

Event/cancelable

In all current engines.

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

Event/composed

In all current engines.

Firefox52+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js14.5.0+
MDN

Event/composedPath

In all current engines.

Firefox59+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js14.5.0+
MDN

Event/currentTarget

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

Event/defaultPrevented

In all current engines.

Firefox6+Safari5+Chrome5+
Opera11+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
Node.js14.5.0+
MDN

Event/eventPhase

In all current engines.

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

Event/isTrusted

In all current engines.

Firefox1.5+Safari10+Chrome46+
Opera33+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView46+Samsung Internet?Opera Mobile33+
Node.js14.5.0+
MDN

Event/preventDefault

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

Event/stopImmediatePropagation

In all current engines.

Firefox10+Safari5+Chrome5+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
Node.js14.5.0+
MDN

Event/stopPropagation

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

Event/target

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

Event/timeStamp

In all current engines.

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

Event/type

In all current engines.

Firefox1.5+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

Event

In all current engines.

Firefox1+Safari1+Chrome1+
Opera4+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

EventTarget/EventTarget

In all current engines.

Firefox59+Safari14+Chrome64+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.0.0+
MDN

EventTarget/addEventListener

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView1+Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

EventTarget/dispatchEvent

In all current engines.

Firefox2+Safari3.1+Chrome4+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView4+Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

EventTarget/removeEventListener

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

EventTarget

In all current engines.

Firefox1+Safari1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE6+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
Node.js14.5.0+
MDN

HTMLCollection/item

In all current engines.

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

HTMLCollection/length

In all current engines.

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

HTMLCollection/namedItem

In all current engines.

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

HTMLCollection

In all current engines.

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

HTMLSlotElement/slotchange_event

In all current engines.

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

MutationObserver/MutationObserver

In all current engines.

Firefox14+Safari7+Chrome26+
Opera15+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4+Samsung Internet?Opera Mobile14+
MDN

MutationObserver/disconnect

In all current engines.

Firefox14+Safari6+Chrome18+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationObserver/observe

In all current engines.

Firefox14+Safari6+Chrome18+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari6+Chrome for Android?Android WebView4.4+Samsung Internet?Opera Mobile?
MDN

MutationObserver/takeRecords

In all current engines.

Firefox14+Safari6+Chrome20+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationObserver

In all current engines.

Firefox14+Safari7+Chrome26+
Opera15+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4+Samsung Internet?Opera Mobile14+
MDN

MutationRecord/addedNodes

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/attributeName

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/attributeNamespace

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/nextSibling

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/oldValue

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/previousSibling

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/removedNodes

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/target

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord/type

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MutationRecord

In all current engines.

Firefox14+Safari7+Chrome16+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

NamedNodeMap/getNamedItem

In all current engines.

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

NamedNodeMap/getNamedItemNS

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

NamedNodeMap/item

In all current engines.

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

NamedNodeMap/length

In all current engines.

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

NamedNodeMap/removeNamedItem

In all current engines.

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

NamedNodeMap/removeNamedItemNS

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

NamedNodeMap/setNamedItem

In all current engines.

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

NamedNodeMap/setNamedItemNS

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

NamedNodeMap

In all current engines.

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

Node/appendChild

In all current engines.

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

Node/baseURI

In all current engines.

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

Node/childNodes

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/cloneNode

In all current engines.

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

Node/compareDocumentPosition

In all current engines.

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

Node/contains

In all current engines.

Firefox9+Safari1.1+Chrome16+
Opera7+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/firstChild

In all current engines.

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

Node/getRootNode

In all current engines.

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

Node/hasChildNodes

In all current engines.

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

Node/insertBefore

In all current engines.

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

Node/isConnected

In all current engines.

Firefox49+Safari10+Chrome51+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet6.0+Opera Mobile?
MDN

Node/isDefaultNamespace

In all current engines.

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

Node/isEqualNode

In all current engines.

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

Node/isSameNode

In all current engines.

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

Node/lastChild

In all current engines.

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

Node/lookupNamespaceURI

In all current engines.

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

Node/lookupPrefix

In all current engines.

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

Node/nextSibling

In all current engines.

Firefox1+Safari1.1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/nodeName

In all current engines.

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

Node/nodeType

In all current engines.

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

Node/nodeValue

In all current engines.

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

Node/normalize

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

Node/ownerDocument

In all current engines.

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

Node/parentElement

In all current engines.

Firefox9+Safari1.1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE8+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/parentNode

In all current engines.

Firefox1+Safari1.1+Chrome1+
Opera7+Edge79+
Edge (Legacy)12+IE5.5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

Node/previousSibling

In all current engines.

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

Node/removeChild

In all current engines.

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

Node/replaceChild

In all current engines.

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

Node/textContent

In all current engines.

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

Node

In all current engines.

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

NodeIterator/filter

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

NodeIterator/nextNode

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

NodeIterator/pointerBeforeReferenceNode

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera15+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile14+
MDN

NodeIterator/previousNode

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

NodeIterator/referenceNode

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera15+Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile14+
MDN

NodeIterator/root

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

NodeIterator/whatToShow

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

NodeIterator

In all current engines.

Firefox3.5+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

NodeList/forEach

In all current engines.

Firefox50+Safari10+Chrome51+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Reference/Global_Objects/Array/@@iterator

In all current engines.

Firefox36+Safari10+Chrome51+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

NodeList

In all current engines.

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

NodeList/item

In all current engines.

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

NodeList/length

In all current engines.

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

ProcessingInstruction/target

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

ProcessingInstruction

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

Range/Range

In all current engines.

Firefox24+Safari8+Chrome29+
Opera?Edge79+
Edge (Legacy)15+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Range/cloneContents

In all current engines.

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

Range/cloneRange

In all current engines.

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

Range/collapse

In all current engines.

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

Range/commonAncestorContainer

In all current engines.

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

Range/compareBoundaryPoints

In all current engines.

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

Range/comparePoint

In all current engines.

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

Range/deleteContents

In all current engines.

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

Range/detach

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

Range/extractContents

In all current engines.

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

Range/insertNode

In all current engines.

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

Range/intersectsNode

In all current engines.

Firefox17+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)17+IENone
Firefox for Android19+iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Range/isPointInRange

In all current engines.

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

Range/selectNode

In all current engines.

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

Range/selectNodeContents

In all current engines.

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

Range/setEnd

In all current engines.

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

Range/setEndAfter

In all current engines.

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

Range/setEndBefore

In all current engines.

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

Range/setStart

In all current engines.

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

Range/setStartAfter

In all current engines.

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

Range/setStartBefore

In all current engines.

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

Range/surroundContents

In all current engines.

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

Range/toString

In all current engines.

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

Range

In all current engines.

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

ShadowRoot/delegatesFocus

In all current engines.

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

ShadowRoot/host

In all current engines.

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

ShadowRoot/mode

In all current engines.

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

ShadowRoot/slotAssignment

In all current engines.

Firefox92+Safari16.4+Chrome86+
Opera?Edge86+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ShadowRoot

In all current engines.

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

StaticRange/StaticRange

In all current engines.

Firefox71+Safari13.1+Chrome90+
Opera?Edge90+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

StaticRange

In all current engines.

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

Text/Text

In all current engines.

Firefox24+Safari8+Chrome29+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Text/splitText

In all current engines.

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

Text/wholeText

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

Text

In all current engines.

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

TreeWalker/currentNode

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/filter

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/firstChild

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/lastChild

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/nextNode

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/nextSibling

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/parentNode

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/previousNode

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/previousSibling

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/root

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker/whatToShow

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

TreeWalker

In all current engines.

Firefox4+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile10.1+
MDN

XMLDocument

In all current engines.

Firefox1+Safari10+Chrome34+
Opera21+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari10+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile21+
MDN

XPathEvaluator/XPathEvaluator

In all current engines.

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

XPathEvaluator

In all current engines.

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

XPathExpression/evaluate

In all current engines.

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

XPathExpression

In all current engines.

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

XPathResult/booleanValue

In all current engines.

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

XPathResult/invalidIteratorState

In all current engines.

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

XPathResult/iterateNext

In all current engines.

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

XPathResult/numberValue

In all current engines.

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

XPathResult/resultType

In all current engines.

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

XPathResult/singleNodeValue

In all current engines.

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

XPathResult/snapshotItem

In all current engines.

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

XPathResult/snapshotLength

In all current engines.

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

XPathResult/stringValue

In all current engines.

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

XPathResult

In all current engines.

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

XSLTProcessor/XSLTProcessor

In all current engines.

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

XSLTProcessor/clearParameters

In all current engines.

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

XSLTProcessor/getParameter

In all current engines.

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

XSLTProcessor/importStylesheet

In all current engines.

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

XSLTProcessor/removeParameter

In all current engines.

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

XSLTProcessor/reset

In all current engines.

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

XSLTProcessor/setParameter

In all current engines.

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

XSLTProcessor/transformToDocument

In all current engines.

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

XSLTProcessor/transformToFragment

In all current engines.

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

XSLTProcessor

In all current engines.

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

Element/slot

In all current engines.

Firefox63+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?