๐ŸŒ US-Proxy
class="h-entry status-LS">

DOM

ํ˜„ํ–‰ ํ‘œ์ค€ โ€” ๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ

์ฐธ์—ฌ:
GitHub whatwg/dom (์ƒˆ ์ด์Šˆ, ์˜คํ”ˆ๋œ ์ด์Šˆ)
Matrix์—์„œ ์ฑ„ํŒ…ํ•˜๊ธฐ
์ปค๋ฐ‹:
GitHub whatwg/dom/commits
์ด ์ปค๋ฐ‹ ๊ธฐ์ค€ ์Šค๋ƒ…์ƒท
ํ…Œ์ŠคํŠธ:
web-platform-tests dom/ (์ง„ํ–‰ ์ค‘์ธ ์ž‘์—…)
๋ฒˆ์—ญ (๋น„๊ทœ๋ฒ”์ ):
ๆ—ฅๆœฌ่ชž
็ฎ€ไฝ“ไธญๆ–‡
ํ•œ๊ตญ์–ด

๊ฐœ์š”

DOM์€ ์ด๋ฒคํŠธ, ์ž‘์—… ์ค‘๋‹จ, ๋…ธ๋“œ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ํ”Œ๋žซํผ ์ค‘๋ฆฝ์ ์ธ ๋ชจ๋ธ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

1. ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜

์ด ๋ช…์„ธ๋Š” Infra Standard์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. [INFRA]

์ด ๋ช…์„ธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด ์ค‘ ์ผ๋ถ€๋Š” ์ธ์ฝ”๋”ฉ, ์„ ํƒ์ž, Trusted Types, Web IDL, XML, XML์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๊ทธ๋ฆฌ๊ณ  XML ๋ฌธ์„œ์™€ ์Šคํƒ€์ผ์‹œํŠธ ์—ฐ๊ฒฐ์— ์ •์˜๋˜์–ด ์žˆ๋‹ค. [ENCODING] [SELECTORS4] [TRUSTED-TYPES] [WEBIDL] [XML] [XML-NAMES] [XML-STYLESHEET]

ํ™•์žฅ์ด ํ•„์š”ํ•  ๋•Œ DOM ํ‘œ์ค€์€ ๊ทธ์— ๋”ฐ๋ผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋˜๋Š” ์ƒˆ๋กœ์šด ํ‘œ์ค€์„ ์ž‘์„ฑํ•˜์—ฌ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๋ช…์„ธ์— ๋Œ€ํ•œ ์ œ๊ณต๋œ ํ™•์žฅ์„ฑ ํ›…์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1.1. ํŠธ๋ฆฌ

ํŠธ๋ฆฌ๋Š” ์œ ํ•œํ•œ ๊ณ„์ธต ํŠธ๋ฆฌ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ํŠธ๋ฆฌ ์ˆœ์„œ๋Š” ํŠธ๋ฆฌ์˜ ์ „์œ„, ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ์— ์ฐธ์—ฌํ•˜๋Š” ๊ฐ์ฒด๋Š” ํŠธ๋ฆฌ ๋‚ด์—์„œ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ด๋Š” null์ด๊ฑฐ๋‚˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž์‹์„ ๊ฐ€์ง€๋Š”๋ฐ, ์ด๋Š” ๊ฐ์ฒด๋“ค์˜ ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด A์˜ ๋ถ€๋ชจ๊ฐ€ ๊ฐ์ฒด B๋ผ๋ฉด, A๋Š” B์˜ ์ž์‹์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด์˜ ๋ฃจํŠธ๋Š” ๋ถ€๋ชจ๊ฐ€ null์ด๋ฉด ์ž๊ธฐ ์ž์‹ ์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ถ€๋ชจ์˜ ๋ฃจํŠธ์ž…๋‹ˆ๋‹ค. ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋Š” ํ•ด๋‹น ํŠธ๋ฆฌ์— ์ฐธ์—ฌํ•˜๋Š” ๊ฐ์ฒด ์ค‘ ๋ถ€๋ชจ๊ฐ€ null์ธ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด A๊ฐ€ ๊ฐ์ฒด B์˜ ํ›„์†์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ ค๋ฉด, A๊ฐ€ B์˜ ์ž์‹์ด๊ฑฐ๋‚˜, C์˜ ์ž์‹์ด๋ฉด์„œ C๊ฐ€ B์˜ ํ›„์†์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

ํฌํ•จ ํ›„์†์€ ๊ฐ์ฒด ์ž์‹  ๋˜๋Š” ๊ทธ์˜ ํ›„์† ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด A๊ฐ€ ๊ฐ์ฒด B์˜ ์กฐ์ƒ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ ค๋ฉด, B๊ฐ€ A์˜ ํ›„์†์ธ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

ํฌํ•จ ์กฐ์ƒ์€ ๊ฐ์ฒด ์ž์‹  ๋˜๋Š” ๊ทธ์˜ ์กฐ์ƒ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด A๊ฐ€ ๊ฐ์ฒด B์˜ ํ˜•์ œ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ ค๋ฉด, B์™€ A๊ฐ€ ๋™์ผํ•œ null์ด ์•„๋‹Œ ๋ถ€๋ชจ๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํฌํ•จ ํ˜•์ œ๋Š” ๊ฐ์ฒด ์ž์‹  ๋˜๋Š” ๊ทธ์˜ ํ˜•์ œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด A๊ฐ€ ๊ฐ์ฒด B๋ณด๋‹ค ์•ž์„  ๊ฐ์ฒด๋ผ๊ณ  ํ•˜๋ ค๋ฉด, A์™€ B๊ฐ€ ๋™์ผํ•œ ํŠธ๋ฆฌ์— ์žˆ๊ณ , A๊ฐ€ B๋ณด๋‹ค ํŠธ๋ฆฌ ์ˆœ์„œ์ƒ ๋จผ์ € ๋‚˜์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด A๊ฐ€ ๊ฐ์ฒด B์˜ ๋‹ค์Œ ๊ฐ์ฒด๋ผ๊ณ  ํ•˜๋ ค๋ฉด, A์™€ B๊ฐ€ ๋™์ผํ•œ ํŠธ๋ฆฌ์— ์žˆ๊ณ , A๊ฐ€ B๋ณด๋‹ค ํŠธ๋ฆฌ ์ˆœ์„œ์ƒ ๋‚˜์ค‘์— ๋‚˜์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹์€ ์ฒซ ๋ฒˆ์งธ ์ž์‹์ด๊ฑฐ๋‚˜ ์ž์‹์ด ์—†์œผ๋ฉด null์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด์˜ ๋งˆ์ง€๋ง‰ ์ž์‹์€ ๋งˆ์ง€๋ง‰ ์ž์‹์ด๊ฑฐ๋‚˜ ์ž์‹์ด ์—†์œผ๋ฉด null์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด์˜ ์ด์ „ ํ˜•์ œ๋Š” ์ฒซ ๋ฒˆ์งธ ์•ž์„  ํ˜•์ œ์ด๊ฑฐ๋‚˜, ์•ž์„  ํ˜•์ œ๊ฐ€ ์—†์œผ๋ฉด null์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด์˜ ๋‹ค์Œ ํ˜•์ œ๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹ค์Œ ํ˜•์ œ์ด๊ฑฐ๋‚˜, ๋‹ค์Œ ํ˜•์ œ๊ฐ€ ์—†์œผ๋ฉด null์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด์˜ ์ธ๋ฑ์Šค๋Š” ๊ทธ ๊ฐ์ฒด์˜ ์•ž์„  ํ˜•์ œ์˜ ๊ฐœ์ˆ˜์ด๋ฉฐ, ์—†์œผ๋ฉด 0์ž…๋‹ˆ๋‹ค.

1.2. ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์ง‘ํ•ฉ

์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์ง‘ํ•ฉ ํŒŒ์„œ๋Š” ๋ฌธ์ž์—ด input์„ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋“ค์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. inputTokens๋ฅผ ASCII ๊ณต๋ฐฑ ๋ฌธ์ž๋กœ input์„ ๋ถ„ํ• ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. tokens๋ฅผ ์ƒˆ๋กœ์šด ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์ง‘ํ•ฉ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. inputTokens์˜ ๊ฐ token์— ๋Œ€ํ•ด: token์„ tokens์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  4. tokens๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์ง‘ํ•ฉ ์ง๋ ฌํ™”๊ธฐ๋Š” set์„ ๋ฐ›์•„ U+0020 ๊ณต๋ฐฑ ๋ฌธ์ž๋กœ set์„ ์ด์–ด๋ถ™์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

1.3. ์…€๋ ‰ํ„ฐ

์…€๋ ‰ํ„ฐ ๋ฌธ์ž์—ด ๋ฒ”์œ„ ์ผ์น˜ ์ž‘์—…์€ ๋ฌธ์ž์—ด selectors๋ฅผ ๋…ธ๋“œ node์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ๋‹ค:

  1. selector๋ฅผ ์…€๋ ‰ํ„ฐ ํŒŒ์‹ฑ selectors์˜ ๊ฒฐ๊ณผ๋กœ ํ•œ๋‹ค. [SELECTORS4]

  2. ๋งŒ์•ฝ selector๊ฐ€ ์‹คํŒจ๋ผ๋ฉด, throw "SyntaxError" DOMException์„ ๋˜์ง„๋‹ค.

  3. ์…€๋ ‰ํ„ฐ ํŠธ๋ฆฌ ๋งค์นญ์„ selector์™€ node์˜ ๋ฃจํŠธ๋ฅผ ์Šค์ฝ”ํ•‘ ๋ฃจํŠธ node์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. [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. ๋งŒ์•ฝ name์ด ASCII ๊ณต๋ฐฑ, 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 ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์ถ”์ถœ์„ ์œ„ํ•ด namespace์™€ qualifiedName์„ context์™€ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. namespace๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. prefix๋ฅผ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. localName์„ qualifiedName์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. qualifiedName์— U+003A (:)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด:

    1. prefix๋ฅผ qualifiedName์—์„œ ์ฒซ ๋ฒˆ์งธ U+003A (:) ์•ž๋ถ€๋ถ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. localName๋ฅผ qualifiedName์—์„œ ์ฒซ ๋ฒˆ์งธ U+003A (:) ๋’ท๋ถ€๋ถ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. prefix๊ฐ€ ์œ ํšจํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. "InvalidCharacterError" DOMException.

  5. Assert: prefix๋Š” null์ด๊ฑฐ๋‚˜ ์œ ํšจํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ์ž…๋‹ˆ๋‹ค.

  6. context๊ฐ€ "attribute"์ด๊ณ  localName์ด ์œ ํšจํ•œ ์†์„ฑ ๋กœ์ปฌ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด, "InvalidCharacterError" DOMException์„ throwํ•ฉ๋‹ˆ๋‹ค.

  7. context๊ฐ€ "element"์ด๊ณ  localName์ด ์œ ํšจํ•œ ์š”์†Œ ๋กœ์ปฌ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด, "InvalidCharacterError" DOMException์„ throwํ•ฉ๋‹ˆ๋‹ค.

  8. prefix๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  namespace๊ฐ€ null์ด๋ฉด, "NamespaceError" DOMException์„ throwํ•ฉ๋‹ˆ๋‹ค.

  9. prefix๊ฐ€ "xml"์ด๊ณ  namespace๊ฐ€ XML ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ฉด, "NamespaceError" DOMException์„ throwํ•ฉ๋‹ˆ๋‹ค.

  10. qualifiedName ๋˜๋Š” prefix๊ฐ€ "xmlns"์ด๊ณ  namespace๊ฐ€ XMLNS ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ฉด, "NamespaceError" DOMException์„ throwํ•ฉ๋‹ˆ๋‹ค.

  11. namespace๊ฐ€ XMLNS ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ด๊ณ  qualifiedName๊ณผ prefix ๋ชจ๋‘ "xmlns"๊ฐ€ ์•„๋‹ˆ๋ฉด, "NamespaceError" DOMException์„ throwํ•ฉ๋‹ˆ๋‹ค.

  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() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด, ๋™์ผํ•œ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ AbortSignal ์„ addEventListener()์— ์ „๋‹ฌํ•˜๊ณ , ์‹œ๊ทธ๋„์„ ์†Œ์œ ํ•œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ 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]

์ด๋ฒคํŠธ์—๋Š” ์—ฐ๊ด€๋œ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋‹ค. ๊ฒฝ๋กœ๋Š” ๋ชฉ๋ก์ด๋ฉฐ, ์ด๋ฒคํŠธ ๊ฒฝ๋กœ ํ•ญ๋ชฉ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ์ด๋ฒคํŠธ ๊ฒฝ๋กœ ํ•ญ๋ชฉ์€ ๊ตฌ์กฐ์ฒด๋กœ, ํ˜ธ์ถœ ๋Œ€์ƒ (EventTarget ๊ฐ์ฒด), ์„€๋„ ํŠธ๋ฆฌ ์•ˆ์˜ ํ˜ธ์ถœ ๋Œ€์ƒ ์—ฌ๋ถ€ (๋ถˆ๋ฆฌ์–ธ), ์„€๋„ ์กฐ์ • ๋Œ€์ƒ ( ์ž ์žฌ์  ์ด๋ฒคํŠธ ๋Œ€์ƒ), relatedTarget ( ์ž ์žฌ์  ์ด๋ฒคํŠธ ๋Œ€์ƒ), ํ„ฐ์น˜ ๋Œ€์ƒ ๋ชฉ๋ก ( ๋ชฉ๋ก์ด๋ฉฐ ์ž ์žฌ์  ์ด๋ฒคํŠธ ๋Œ€์ƒ๋“ค๋กœ ์ด๋ฃจ์–ด์ง), ๋‹ซํžŒ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ์—ฌ๋ถ€ (๋ถˆ๋ฆฌ์–ธ), ๊ทธ๋ฆฌ๊ณ  ๋‹ซํžŒ ํŠธ๋ฆฌ ์•ˆ์˜ ์Šฌ๋กฏ ์—ฌ๋ถ€ ( ๋ถˆ๋ฆฌ์–ธ)์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๊ฒฝ๋กœ๋Š” ์ฒ˜์Œ์— ๋นˆ ๋ชฉ๋ก์ด๋‹ค.

event = new Event(type [, eventInitDict])
์ƒˆ๋กœ์šด event๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, type ์†์„ฑ ๊ฐ’์ด type์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. eventInitDict ์ธ์ž๋ฅผ ํ†ตํ•ด bubbles์™€ cancelable ์†์„ฑ์„ ๊ฐ™์€ ์ด๋ฆ„์˜ ๊ฐ์ฒด ๋ฉค๋ฒ„๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
event . type
event์˜ ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: "click", "hashchange", "submit" ๋“ฑ.
event . target
event๊ฐ€ ๋””์ŠคํŒจ์น˜๋œ ๊ฐ์ฒด(์ฆ‰, ํƒ€๊ฒŸ)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
event . currentTarget
ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์˜ ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
event . composedPath()
event์˜ ํ˜ธ์ถœ ํƒ€๊ฒŸ ๊ฐ์ฒด๋ฅผ ๊ฒฝ๋กœ์—์„œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(๋ฆฌ์Šค๋„ˆ๊ฐ€ ํ˜ธ์ถœ๋  ๊ฐ์ฒด๋“ค). ๋‹จ, ์„€๋„์šฐ ํŠธ๋ฆฌ์— ์†ํ•œ ๋…ธ๋“œ ์ค‘ ์„€๋„์šฐ ๋ฃจํŠธ์˜ mode๊ฐ€ "closed"์ด๊ณ  event์˜ currentTarget์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.
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๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. event ์˜ ํƒ€๊ฒŸ ์˜ ๋ฃจํŠธ ์ธ ShadowRoot ๋…ธ๋“œ ๋ฅผ ๋„˜์–ด event ๊ฐ€ ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด true์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false์ž…๋‹ˆ๋‹ค.
event . isTrusted
event๊ฐ€ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์— ์˜ํ•ด ๋””์ŠคํŒจ์น˜๋˜๋ฉด true, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false์ž…๋‹ˆ๋‹ค.
event . timeStamp
event์˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๋ฐœ์ƒ ์‹œ์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ธก์ •๋œ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.

type ์†์„ฑ์€ ์ดˆ๊ธฐํ™”๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ด ์†์„ฑ์€ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

target getter ๋‹จ๊ณ„๋Š” this์˜ target์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

srcElement getter ๋‹จ๊ณ„๋Š” this์˜ target์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

currentTarget ์†์„ฑ์€ ์ดˆ๊ธฐํ™”๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ด ์†์„ฑ์€ null๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

composedPath() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. composedPath๋ฅผ ๋นˆ ๋ชฉ๋ก์œผ๋กœ ๋‘”๋‹ค.

  2. path๋ฅผ this์˜ ๊ฒฝ๋กœ๋กœ ๋‘”๋‹ค.

  3. path๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด, composedPath๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. currentTarget๋ฅผ this์˜ currentTarget ์†์„ฑ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

  5. ๋‹จ์–ธํ•œ๋‹ค: currentTarget๋Š” EventTarget ๊ฐ์ฒด์ด๋‹ค.

  6. currentTarget๋ฅผ composedPath์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  7. currentTargetIndex๋ฅผ 0์œผ๋กœ ๋‘”๋‹ค.

  8. currentTargetHiddenSubtreeLevel์„ 0์œผ๋กœ ๋‘”๋‹ค.

  9. index๋ฅผ path์˜ ํฌ๊ธฐ โˆ’ 1๋กœ ๋‘”๋‹ค.

  10. index๊ฐ€ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๋™์•ˆ:

    1. path[index]์˜ root-of-closed-tree๊ฐ€ true์ด๋ฉด, currentTargetHiddenSubtreeLevel์„ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

    2. path[index]์˜ ํ˜ธ์ถœ ๋Œ€์ƒ์ด currentTarget์ด๋ฉด, currentTargetIndex๋ฅผ index๋กœ ์„ค์ •ํ•˜๊ณ  ์ค‘๋‹จํ•œ๋‹ค.

    3. path[index]์˜ slot-in-closed-tree๊ฐ€ true์ด๋ฉด, currentTargetHiddenSubtreeLevel์„ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    4. index๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

  11. currentHiddenLevel๊ณผ maxHiddenLevel์„ currentTargetHiddenSubtreeLevel๋กœ ๋‘”๋‹ค.

  12. index๋ฅผ currentTargetIndex โˆ’ 1๋กœ ์„ค์ •ํ•œ๋‹ค.

  13. index๊ฐ€ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๋™์•ˆ:

    1. path[index]์˜ root-of-closed-tree๊ฐ€ true์ด๋ฉด, currentHiddenLevel์„ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

    2. currentHiddenLevel์ด maxHiddenLevel๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด, path[index]์˜ ํ˜ธ์ถœ ๋Œ€์ƒ์„ composedPath์˜ ์•ž์— ์‚ฝ์ž…ํ•œ๋‹ค.

    3. path[index]์˜ slot-in-closed-tree๊ฐ€ true์ด๋ฉด:

      1. currentHiddenLevel์„ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

      2. currentHiddenLevel์ด maxHiddenLevel๋ณด๋‹ค ์ž‘์œผ๋ฉด, maxHiddenLevel์„ currentHiddenLevel๋กœ ์„ค์ •ํ•œ๋‹ค.

    4. index๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

  14. currentHiddenLevel๊ณผ maxHiddenLevel์„ currentTargetHiddenSubtreeLevel๋กœ ์„ค์ •ํ•œ๋‹ค.

  15. index๋ฅผ currentTargetIndex + 1๋กœ ์„ค์ •ํ•œ๋‹ค.

  16. index๊ฐ€ path์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋™์•ˆ:

    1. path[index]์˜ slot-in-closed-tree๊ฐ€ true์ด๋ฉด, currentHiddenLevel์„ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

    2. currentHiddenLevel์ด maxHiddenLevel๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด, path[index]์˜ ํ˜ธ์ถœ ๋Œ€์ƒ์„ composedPath์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    3. path[index]์˜ root-of-closed-tree๊ฐ€ true์ด๋ฉด:

      1. currentHiddenLevel์„ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

      2. currentHiddenLevel์ด maxHiddenLevel๋ณด๋‹ค ์ž‘์œผ๋ฉด, maxHiddenLevel์„ currentHiddenLevel๋กœ ์„ค์ •ํ•œ๋‹ค.

    4. index๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

  17. composedPath๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

eventPhase ์†์„ฑ์€ ์ดˆ๊ธฐํ™”๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋ฉฐ, ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค:

NONE (์ˆซ์ž๊ฐ’ 0)
ํ˜„์žฌ ๋””์ŠคํŒจ์น˜๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ๋Š” ์ด ๋‹จ๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค.
CAPTURING_PHASE (์ˆซ์ž๊ฐ’ 1)
ํŠธ๋ฆฌ ์— ์ฐธ์—ฌ ํ•˜๋Š” ๊ฐ์ฒด๋กœ ์ด๋ฒคํŠธ ๊ฐ€ ๋””์ŠคํŒจ์น˜ ๋˜๋ฉด, ์ด๋ฒคํŠธ๊ฐ€ ์ž์‹ ์˜ ํƒ€๊ฒŸ ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ์ด ๋‹จ๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค.
AT_TARGET (์ˆซ์ž๊ฐ’ 2)
์ด๋ฒคํŠธ๊ฐ€ ๋””์ŠคํŒจ์น˜๋˜์–ด ํƒ€๊ฒŸ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์ด ๋‹จ๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค.
BUBBLING_PHASE (์ˆซ์ž๊ฐ’ 3)
ํŠธ๋ฆฌ ์— ์ฐธ์—ฌ ํ•˜๋Š” ๊ฐ์ฒด๋กœ ์ด๋ฒคํŠธ ๊ฐ€ ๋””์ŠคํŒจ์น˜ ๋˜๋ฉด, ์ด๋ฒคํŠธ๊ฐ€ ์ž์‹ ์˜ ํƒ€๊ฒŸ ์— ๋„๋‹ฌํ•˜๊ธฐ ํ›„์— ์ด ๋‹จ๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ์—๋Š” ์†์„ฑ์ด NONE์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๊ฐ ์ด๋ฒคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฐ๊ด€ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๋ชจ๋‘ ์ฒ˜์Œ์—๋Š” ํ•ด์ œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค:

  • ์ „ํŒŒ ์ค‘๋‹จ ํ”Œ๋ž˜๊ทธ(stop propagation flag)
  • ์ฆ‰์‹œ ์ „ํŒŒ ์ค‘๋‹จ ํ”Œ๋ž˜๊ทธ(stop immediate propagation flag)
  • ์ทจ์†Œ๋จ ํ”Œ๋ž˜๊ทธ(canceled flag)
  • ํŒจ์‹œ๋ธŒ ๋ฆฌ์Šค๋„ˆ ํ”Œ๋ž˜๊ทธ(in passive listener flag)
  • composed ํ”Œ๋ž˜๊ทธ
  • ์ดˆ๊ธฐํ™”๋จ ํ”Œ๋ž˜๊ทธ(initialized flag)
  • ๋””์ŠคํŒจ์น˜ ํ”Œ๋ž˜๊ทธ(dispatch flag)

stopPropagation() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” this์˜ ์ „ํŒŒ ์ค‘๋‹จ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

cancelBubble getter ๋‹จ๊ณ„๋Š” this์˜ ์ „ํŒŒ ์ค‘๋‹จ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

cancelBubble setter ๋‹จ๊ณ„๋Š”, ์ฃผ์–ด์ง„ ๊ฐ’์ด true์ธ ๊ฒฝ์šฐ this์˜ ์ „ํŒŒ ์ค‘๋‹จ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๊ณ , ์•„๋‹ˆ๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

stopImmediatePropagation() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” this์˜ ์ „ํŒŒ ์ค‘๋‹จ ํ”Œ๋ž˜๊ทธ์™€ this์˜ ์ฆ‰์‹œ ์ „ํŒŒ ์ค‘๋‹จ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

bubbles์™€ cancelable ์†์„ฑ์€ ์ดˆ๊ธฐํ™”๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ทจ์†Œ ํ”Œ๋ž˜๊ทธ ์„ค์ •์€ ์ด๋ฒคํŠธ event๋ฅผ ๋ฐ›์•„์„œ, event์˜ cancelable ์†์„ฑ์ด true์ด๊ณ  event์˜ ํŒจ์‹œ๋ธŒ ๋ฆฌ์Šค๋„ˆ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•ด์ œ๋˜์–ด ์žˆ๋‹ค๋ฉด event์˜ ์ทจ์†Œ๋จ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๊ณ , ์•„๋‹ˆ๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

returnValue getter ๋‹จ๊ณ„๋Š” this์˜ ์ทจ์†Œ๋จ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด false, ์•„๋‹ˆ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

returnValue setter ๋‹จ๊ณ„๋Š”, ์ฃผ์–ด์ง„ ๊ฐ’์ด false์ด๋ฉด ์ทจ์†Œ ํ”Œ๋ž˜๊ทธ ์„ค์ •์„ this์— ๋Œ€ํ•ด ์‹คํ–‰ํ•˜๊ณ , ์•„๋‹ˆ๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

preventDefault() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ์ทจ์†Œ ํ”Œ๋ž˜๊ทธ ์„ค์ •์„ this์— ๋Œ€ํ•ด ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

preventDefault()๋ฅผ ํ˜ธ์ถœํ•ด๋„ ์•„๋ฌด ํšจ๊ณผ๊ฐ€ ์—†๋Š” ์ƒํ™ฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ด๋Ÿฌํ•œ ์›์ธ์„ ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์— ์ •ํ™•ํ•˜๊ฒŒ ๊ธฐ๋กํ•ด ๋””๋ฒ„๊น…์„ ๋•๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

defaultPrevented getter ๋‹จ๊ณ„๋Š” this์˜ ์ทจ์†Œ๋จ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

composed getter ๋‹จ๊ณ„๋Š” this์˜ composed ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


isTrusted ์†์„ฑ์€ ์ดˆ๊ธฐํ™”๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ด ์†์„ฑ์€ false๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

isTrusted๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์— ์˜ํ•ด ๋””์ŠคํŒจ์น˜๋˜์—ˆ๋Š”์ง€(์ฆ‰ dispatchEvent()๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹Œ์ง€) ํŽธ๋ฆฌํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๋ ˆ๊ฑฐ์‹œ ์˜ˆ์™ธ๋Š” click()์ด๋ฉฐ, ์ด๋Š” ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ๋””์ŠคํŒจ์น˜ํ•  ๋•Œ isTrusted ์†์„ฑ์„ false๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

timeStamp ์†์„ฑ์€ ์ดˆ๊ธฐํ™”๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


์ด๋ฒคํŠธ ์ดˆ๊ธฐํ™”(initialize)๋ฅผ event์— ๋Œ€ํ•ด, type, bubbles, cancelable์™€ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋“ค์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. event์˜ ์ดˆ๊ธฐํ™”๋จ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. event์˜ ์ „ํŒŒ ์ค‘๋‹จ ํ”Œ๋ž˜๊ทธ, ์ฆ‰์‹œ ์ „ํŒŒ ์ค‘๋‹จ ํ”Œ๋ž˜๊ทธ, ์ทจ์†Œ๋จ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

  3. event์˜ isTrusted ์†์„ฑ์„ false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. event์˜ target์„ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. event์˜ type ์†์„ฑ์„ type์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. event์˜ bubbles ์†์„ฑ์„ bubbles๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. event์˜ cancelable ์†์„ฑ์„ cancelable๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

initEvent(type, bubbles, cancelable) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. this์˜ ๋””์ŠคํŒจ์น˜ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด return ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ดˆ๊ธฐํ™”๋ฅผ this์— type, 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. ์ดˆ๊ธฐํ™”๋ฅผ this์— type, bubbles, cancelable๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  3. this์˜ detail ์†์„ฑ์„ detail๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

2.5. ์ด๋ฒคํŠธ ์ƒ์„ฑ

๋ช…์„ธ๋Š” ๋ชจ๋“  ๋˜๋Š” ์ผ๋ถ€ ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ์ด๋ฒคํŠธ ์ƒ์„ฑ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ event event์™€ EventInit eventInitDict๋ฅผ ๋‚ด๋ถ€ ์ด๋ฒคํŠธ ์ƒ์„ฑ ๋‹จ๊ณ„์—์„œ ๋„˜๊ฒจ๋ฐ›์Šต๋‹ˆ๋‹ค.

์ด ๊ตฌ์กฐ๋Š” ์ดˆ๊ธฐํ™”์šฉ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„์™€ IDL ์†์„ฑ ๊ฐ„ 1:1 ๋Œ€์‘์ด ์•„๋‹Œ ๋” ๋ณต์žกํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ Event ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Event ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” Event ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, type๊ณผ eventInitDict ์ธ์ž๋ฅผ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋“ค์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  1. event๋ฅผ ์ด ์ธํ„ฐํŽ˜์ด์Šค, null, now, eventInitDict๋กœ ๋‚ด๋ถ€ ์ด๋ฒคํŠธ ์ƒ์„ฑ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. event์˜ type ์†์„ฑ์„ type์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  3. event๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

eventInterface๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ ์ƒ์„ฑ์„ ํ•˜๋ ค๋ฉด, eventInterface๋Š” Event์ด๊ฑฐ๋‚˜ ์ด๋ฅผ ์ƒ์†ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์—ฌ์•ผ ํ•˜๋ฉฐ, ์„ ํƒ์ ์œผ๋กœ realm realm์„ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋“ค์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. realm์ด ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. dictionary๋ฅผ JavaScript ๊ฐ’ undefined๋ฅผ eventInterface์˜ ์ƒ์„ฑ์ž๊ฐ€ ๋ฐ›์•„๋“ค์ด๋Š” ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. (์ด ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์€ EventInit ๋˜๋Š” ์ด๋ฅผ ์ƒ์†ํ•œ ๋”•์…”๋„ˆ๋ฆฌ์ž…๋‹ˆ๋‹ค.)

    ๋ฉค๋ฒ„๊ฐ€ ํ•„์ˆ˜์ผ ๋•Œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. whatwg/dom#600 ์ฐธ์กฐ.

  3. event๋ฅผ eventInterface, realm, ์ด๋ฒคํŠธ๊ฐ€ ์‹ ํ˜ธํ•˜๋Š” ๋ฐœ์ƒ ์‹œ๊ฐ, dictionary๋กœ ๋‚ด๋ถ€ ์ด๋ฒคํŠธ ์ƒ์„ฑ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    macOS์—์„œ๋Š” ์ž…๋ ฅ ๋™์ž‘ ๋ฐœ์ƒ ์‹œ๊ฐ์ด timestamp ์†์„ฑ์„ ํ†ตํ•ด NSEvent ๊ฐ์ฒด์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

  4. event์˜ isTrusted ์†์„ฑ์„ true๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  5. event๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ƒ์„ฑ์€ ๋‹จ์ˆœํžˆ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์ด ์•„๋‹Œ, ๋‹ค๋ฅธ ๋ช…์„ธ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๋””์ŠคํŒจ์น˜ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ์ด๋ฒคํŠธ์˜ ์†์„ฑ์ด ์˜ฌ๋ฐ”๋ฅธ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ์ด๋ฒคํŠธ ์ƒ์„ฑ ๋‹จ๊ณ„๋Š” eventInterface, realm, time, dictionary๋ฅผ ๋ฐ›์•„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค:

  1. event๋ฅผ eventInterface๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. realm์ด null์ด ์•„๋‹ˆ๋ฉด ํ•ด๋‹น realm์„ ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Web IDL์—์„œ ์ •์˜๋œ ๊ธฐ๋ณธ ๋™์ž‘์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    ์ž‘์„ฑ ์‹œ์  ๊ธฐ์ค€ Web IDL์€ ์•„์ง ๊ธฐ๋ณธ ๋™์ž‘์„ ์ •์˜ํ•˜์ง€ ์•Š์•˜์Œ. whatwg/webidl#135 ์ฐธ์กฐ.

  2. event์˜ ์ดˆ๊ธฐํ™”๋จ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. event์˜ timeStamp ์†์„ฑ์„ time๊ณผ event์˜ ๊ด€๋ จ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•œ ์ƒ๋Œ€ ๊ณ ํ•ด์ƒ๋„ ๊ทผ์‚ฌ ์‹œ๊ฐ„์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  4. dictionary์˜ ๊ฐ ๋ฉค๋ฒ„ member โ†’ value์— ๋Œ€ํ•ด: event์— identifier๊ฐ€ member์ธ ์†์„ฑ์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์†์„ฑ์„ value๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  5. ์ด๋ฒคํŠธ ์ƒ์„ฑ ๋‹จ๊ณ„๋ฅผ event์™€ dictionary๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  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๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ๋‹ค์Œ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  • type (๋ฌธ์ž์—ด)
  • callback (null ๋˜๋Š” EventListener ๊ฐ์ฒด)
  • capture (๋ถˆ๋ฆฌ์–ธ, ์ดˆ๊ธฐ๊ฐ’ false)
  • passive (null ๋˜๋Š” ๋ถˆ๋ฆฌ์–ธ, ์ดˆ๊ธฐ๊ฐ’ null)
  • once (๋ถˆ๋ฆฌ์–ธ, ์ดˆ๊ธฐ๊ฐ’ false)
  • signal (null ๋˜๋Š” AbortSignal ๊ฐ์ฒด)
  • removed (๊ธฐ๋ก์šฉ ๋ถˆ๋ฆฌ์–ธ, ์ดˆ๊ธฐ๊ฐ’ false)

callback์€ EventListener ๊ฐ์ฒด์ด์ง€๋งŒ, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ์œ„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ ๋” ๋„“์€ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

๊ฐ 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 ์ธ์ž๋Š” ๋ฆฌ์Šค๋„ˆ๋ณ„ ์˜ต์…˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ด๋Š” ๋ถˆ๋ฆฌ์–ธ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ๋Š” options์˜ capture๋กœ ์ง€์ •๋œ ๊ฐ’์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ options์˜ capture๊ฐ€ true๋กœ ์„ค์ •๋˜๋ฉด, callback์€ ์ด๋ฒคํŠธ์˜ eventPhase ์†์„ฑ๊ฐ’์ด BUBBLING_PHASE์ผ ๋•Œ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. false (๋˜๋Š” ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ)์—๋Š” callback์€ ์ด๋ฒคํŠธ์˜ eventPhase ์†์„ฑ๊ฐ’์ด CAPTURING_PHASE์ผ ๋•Œ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋А ๊ฒฝ์šฐ๋“ , callback์€ ์ด๋ฒคํŠธ์˜ eventPhase ์†์„ฑ๊ฐ’์ด AT_TARGET์ผ ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ options์˜ passive๊ฐ€ true๋กœ ์„ค์ •๋˜๋ฉด, callback์€ preventDefault()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ์ทจ์†Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ยงโ€ฏ2.8 ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ด€์ฐฐ์— ์„ค๋ช…๋œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ options์˜ once๊ฐ€ true๋กœ ์„ค์ •๋˜๋ฉด, callback์€ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋ฉฐ, ๊ทธ ํ›„ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ options์˜ signal์— AbortSignal์ด ์ „๋‹ฌ๋˜๋ฉด, signal์ด ์ค‘๋‹จ๋  ๋•Œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” target์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ชฉ๋ก์— ์ถ”๊ฐ€๋˜๋ฉฐ, ๋™์ผํ•œ type, callback, ๋ฐ capture๋ฅผ ๊ฐ€์ง„ ๊ฒฝ์šฐ์—๋Š” ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

target์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ชฉ๋ก์—์„œ ๋™์ผํ•œ type, callback, options๋ฅผ ๊ฐ€์ง„ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

target . dispatchEvent(event)

ํ•ฉ์„ฑ ์ด๋ฒคํŠธ event๋ฅผ target์— ๋””์ŠคํŒจ์น˜ํ•˜๋ฉฐ, event์˜ cancelable ์†์„ฑ๊ฐ’์ด false์ด๊ฑฐ๋‚˜, preventDefault() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

options๋ฅผ ํ‰ํƒ„ํ™”(flatten)ํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. options๊ฐ€ ๋ถˆ๋ฆฌ์–ธ์ด๋ฉด, options๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. options["capture"]๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

options๋ฅผ ๋” ํ‰ํƒ„ํ™”(flatten more)ํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. capture๋ฅผ ํ‰ํƒ„ํ™”(flatten) options์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. once๋ฅผ false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. passive์™€ signal์„ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. options๊ฐ€ ๋”•์…”๋„ˆ๋ฆฌ(dictionary)์ธ ๊ฒฝ์šฐ:

    1. once๋ฅผ options["once"]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. options["passive"] ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, passive๋ฅผ options["passive"]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. options["signal"] ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, signal์„ options["signal"]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. capture, passive, once, signal์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

new EventTarget() ์ƒ์„ฑ์ž์˜ ๋‹จ๊ณ„๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ช…์‹œ๋œ ๊ธฐ๋ณธ๊ฐ’ ๋•Œ๋ฌธ์—, ๋ฐ˜ํ™˜๋œ EventTarget์˜ get the parent ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ null์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ํ™œ์„ฑํ™” ๋™์ž‘, ๋ ˆ๊ฑฐ์‹œ ์‚ฌ์ „ ํ™œ์„ฑํ™” ๋™์ž‘, ๋˜๋Š” ๋ ˆ๊ฑฐ์‹œ ์ทจ์†Œ๋œ ํ™œ์„ฑํ™” ๋™์ž‘์„ ๊ฐ€์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ–ฅํ›„ ์‚ฌ์šฉ์ž ์ง€์ • get the parent ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์ด ์œ ์šฉํ•˜๋‹ค๋ฉด ์ด์Šˆ #583์„ ์ง€์›ํ•˜๋ผ. ํ˜„์žฌ๋Š” ๋ชจ๋“  ์ž‘์„ฑ์ž๊ฐ€ ์ƒ์„ฑํ•œ EventTarget์€ ํŠธ๋ฆฌ ๊ตฌ์กฐ์— ์ฐธ์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ธฐ๋ณธ passive ๊ฐ’์€ ์ด๋ฒคํŠธ ํƒ€์ž… type๊ณผ EventTarget eventTarget์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค:

  1. ๋‹ค์Œ ์กฐ๊ฑด์ด ๋ชจ๋‘ ์ฐธ์ด๋ผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค:

  2. false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

EventTarget ๊ฐ์ฒด eventTarget๊ณผ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ listener๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. ๋งŒ์•ฝ eventTarget์ด ServiceWorkerGlobalScope ๊ฐ์ฒด์ด๊ณ , ํ•ด๋‹น ์„œ๋น„์Šค ์›Œ์ปค์˜ ์Šคํฌ๋ฆฝํŠธ ๋ฆฌ์†Œ์Šค์˜ ํ‰๊ฐ€๋œ ์  ์žˆ์Œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๊ณ , listener์˜ type์ด ์„œ๋น„์Šค ์›Œ์ปค ์ด๋ฒคํŠธ ์ค‘ ํ•˜๋‚˜์˜ type ์†์„ฑ๊ฐ’ ์ค‘ ํ•˜๋‚˜์™€ ์ผ์น˜ํ•œ๋‹ค๋ฉด, ์˜ˆ์ƒํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฝ˜์†”์— ๊ฒฝ๊ณ ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. [SERVICE-WORKERS]

  2. ๋งŒ์•ฝ listener์˜ signal์ด null์ด ์•„๋‹ˆ๊ณ  aborted๋ผ๋ฉด, returnํ•œ๋‹ค.

  3. ๋งŒ์•ฝ listener์˜ callback์ด null์ด๋ผ๋ฉด, ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

  4. ๋งŒ์•ฝ listener์˜ passive๊ฐ€ null์ด๋ผ๋ฉด, listener์˜ type๊ณผ eventTarget์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ธฐ๋ณธ passive ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. eventTarget ์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ชฉ๋ก ์ด type ์ด listener ์˜ type ๊ณผ ๊ฐ™๊ณ , callback ์ด listener ์˜ callback ๊ณผ ๊ฐ™์œผ๋ฉฐ, capture ๊ฐ€ listener ์˜ capture ์™€ ๊ฐ™์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด listener ๋ฅผ eventTarget ์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ชฉ๋ก ์— ์ถ”๊ฐ€ ํ•ฉ๋‹ˆ๋‹ค.

  6. ๋งŒ์•ฝ listener์˜ signal์ด null์ด ์•„๋‹ˆ๋ผ๋ฉด, ๋‹ค์Œ ์ค‘๋‹จ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

    1. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ๋ฅผ eventTarget๊ณผ listener๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€ ๊ฐœ๋…์€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ผํ•œ ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. [HTML]

addEventListener(type, callback, options) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. capture, passive, once, signal์„ ๋” ํ‰ํƒ„ํ™”(flattening more) options์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€๋ฅผ this์™€ ๋‹ค์Œ ์†์„ฑ์„ ๊ฐ€์ง„ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค: type์€ type, callback์€ callback, capture๋Š” capture, passive๋Š” passive, once๋Š” once, signal์€ signal.

์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ๋ฅผ EventTarget ๊ฐ์ฒด eventTarget๊ณผ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ listener๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. eventTarget์ด ServiceWorkerGlobalScope ๊ฐ์ฒด์ด๊ณ , ํ•ด๋‹น ์„œ๋น„์Šค ์›Œ์ปค์˜ ์ฒ˜๋ฆฌํ•  ์ด๋ฒคํŠธ ํƒ€์ž… ์ง‘ํ•ฉ์ด listener์˜ type์„ ํฌํ•จํ•œ๋‹ค๋ฉด, ์ฝ˜์†”์— ๊ฒฝ๊ณ ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. [SERVICE-WORKERS]

  2. listener์˜ ์ œ๊ฑฐ๋จ ํ”Œ๋ž˜๊ทธ๋ฅผ true๋กœ ์„ค์ •ํ•˜๊ณ , ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. listener๋ฅผ eventTarget์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ชฉ๋ก์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

HTML ๋ช…์„ธ์—์„œ๋Š” ์ด ๊ธฐ๋Šฅ์„ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์ •์˜์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. [HTML]

๋ชจ๋“  ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ๋ฅผ EventTarget ๊ฐ์ฒด eventTarget๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•˜๋ ค๋ฉด: ๊ฐ listener์— ๋Œ€ํ•ด eventTarget์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ชฉ๋ก์—์„œ: ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

HTML ๋ช…์„ธ์—์„œ๋Š” ์ด ๊ธฐ๋Šฅ์„ document.open() ์ •์˜์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. [HTML]

removeEventListener(type, callback, options) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. capture๋ฅผ ํ‰ํƒ„ํ™”(flattening) options์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. this ์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ชฉ๋ก ์ด type ์ด type ๊ณผ ๊ฐ™๊ณ , callback ์ด callback ๊ณผ ๊ฐ™์œผ๋ฉฐ, capture ๊ฐ€ capture ์™€ ๊ฐ™์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ฅผ ํฌํ•จ ํ•˜๋ฉด this ์™€ ํ•ด๋‹น ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ฅผ ์ธ์ž๋กœ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ชฉ๋ก์€ ๋™์ผํ•œ type, callback, capture ๊ฐ’์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€๊ฐ€ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

dispatchEvent(event) ๋ฉ”์„œ๋“œ์˜ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. event์˜ ๋””์ŠคํŒจ์น˜ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๊ฑฐ๋‚˜, ์ดˆ๊ธฐํ™” ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด, "InvalidStateError" DOMException์„ throwํ•ฉ๋‹ˆ๋‹ค.

  2. event์˜ isTrusted ์†์„ฑ์„ 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์˜ event listener list์— ์žˆ๋Š” listener์— ๋Œ€ํ•ด: listener์˜ type์ด "fetch"์ด๊ณ  listener์˜ callback์ด null์ด ์•„๋‹ˆ๋ฉด, append listener์˜ callback์„ callbacks์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  3. callbacks๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

2.9. ์ด๋ฒคํŠธ ๋””์ŠคํŒจ์น˜

์„ ํƒ์  legacy target override flag ๋ฐ ์„ ํƒ์  legacyOutputDidListenersThrowFlag์™€ ํ•จ๊ป˜ ์ด๋ฒคํŠธ event๋ฅผ EventTarget ๊ฐ์ฒด target์— ๋””์ŠคํŒจ์น˜ํ•˜๋ ค๋ฉด:

  1. event์˜ ๋””์ŠคํŒจ์น˜ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

  2. legacy target override flag๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด targetOverride๋ฅผ target์œผ๋กœ ๋‘๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด target์˜ ์—ฐ๊ด€๋œ Document๋กœ ๋‘”๋‹ค. [HTML]

    legacy target override flag๋Š” HTML์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ, target์ด Window ๊ฐ์ฒด์ผ ๋•Œ์—๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.

  3. activationTarget์„ null๋กœ ๋‘”๋‹ค.

  4. relatedTarget์„ event์˜ relatedTarget์„ target์— ๋Œ€ํ•ด ๋ฆฌํƒ€๊ธฐํŒ…ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  5. clearTargets๋ฅผ false๋กœ ๋‘”๋‹ค.

  6. target์ด relatedTarget์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ target์ด event์˜ relatedTarget์ด๋ผ๋ฉด:

    1. touchTargets๋ฅผ ์ƒˆ ๋ชฉ๋ก์œผ๋กœ ๋‘”๋‹ค.

    2. event์˜ ํ„ฐ์น˜ ๋Œ€์ƒ ๋ชฉ๋ก์˜ ๊ฐ touchTarget์— ๋Œ€ํ•ด: touchTarget์„ target์— ๋Œ€ํ•ด ๋ฆฌํƒ€๊ธฐํŒ…ํ•œ ๊ฒฐ๊ณผ๋ฅผ touchTargets์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    3. event, target, targetOverride, relatedTarget, touchTargets ๋ฐ false๋กœ ์ด๋ฒคํŠธ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    4. event๊ฐ€ MouseEvent ๊ฐ์ฒด์ด๊ณ  event์˜ type ์†์„ฑ์ด "click"์ด๋ผ๋ฉด isActivationEvent๋ฅผ true๋กœ ๋‘๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด false๋กœ ๋‘”๋‹ค.

    5. isActivationEvent๊ฐ€ true์ด๊ณ  target์— ํ™œ์„ฑํ™” ๋™์ž‘์ด ์žˆ๋‹ค๋ฉด activationTarget์„ target์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    6. target์ด ์Šฌ๋กฏ ๊ฐ€๋Šฅ ๊ฐ์ฒด์ด๊ณ  ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค๋ฉด slottable์„ target์œผ๋กœ ๋‘๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด null๋กœ ๋‘”๋‹ค.

    7. slotInClosedTree๋ฅผ false๋กœ ๋‘”๋‹ค.

    8. parent๋ฅผ target์˜ ๋ถ€๋ชจ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ event์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    9. parent๊ฐ€ non-null์ธ ๋™์•ˆ:

      1. slottable์ด non-null์ด๋ผ๋ฉด:

        1. ๋‹จ์–ธ: parent๋Š” ์Šฌ๋กฏ์ด๋‹ค.

        2. slottable์„ null๋กœ ์„ค์ •ํ•œ๋‹ค.

        3. parent์˜ ๋ฃจํŠธ๊ฐ€ shadow root์ด๊ณ  ๊ทธ ๋ชจ๋“œ๊ฐ€ "closed"๋ผ๋ฉด, slotInClosedTree๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. parent๊ฐ€ ์Šฌ๋กฏ ๊ฐ€๋Šฅ ๊ฐ์ฒด์ด๊ณ  ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค๋ฉด slottable์„ parent๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. relatedTarget์„ event์˜ relatedTarget์„ parent์— ๋Œ€ํ•ด ๋ฆฌํƒ€๊ธฐํŒ…ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

      4. touchTargets๋ฅผ ์ƒˆ ๋ชฉ๋ก์œผ๋กœ ๋‘”๋‹ค.

      5. event์˜ ํ„ฐ์น˜ ๋Œ€์ƒ ๋ชฉ๋ก์˜ ๊ฐ touchTarget์— ๋Œ€ํ•ด: touchTarget์„ parent์— ๋Œ€ํ•ด ๋ฆฌํƒ€๊ธฐํŒ…ํ•œ ๊ฒฐ๊ณผ๋ฅผ touchTargets์— ์ถ”๊ฐ€ํ•œ๋‹ค.

      6. parent๊ฐ€ Window ๊ฐ์ฒด์ด๊ฑฐ๋‚˜, parent๊ฐ€ ๋…ธ๋“œ์ด๊ณ  target์˜ ๋ฃจํŠธ๊ฐ€ parent์˜ shadow-including ํฌ๊ด„ ์กฐ์ƒ์ด๋ผ๋ฉด:

        1. isActivationEvent๊ฐ€ true์ด๊ณ , event์˜ bubbles ์†์„ฑ์ด true์ด๊ณ , activationTarget์ด null์ด๋ฉฐ, parent์— ํ™œ์„ฑํ™” ๋™์ž‘์ด ์žˆ๋‹ค๋ฉด activationTarget์„ parent๋กœ ์„ค์ •ํ•œ๋‹ค.

        2. event, parent, null, relatedTarget, touchTargets ๋ฐ slotInClosedTree๋กœ ์ด๋ฒคํŠธ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

      7. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  parent๊ฐ€ relatedTarget์ด๋ผ๋ฉด, parent๋ฅผ null๋กœ ์„ค์ •ํ•œ๋‹ค.

      8. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด:

        1. target์„ parent๋กœ ์„ค์ •ํ•œ๋‹ค.

        2. isActivationEvent๊ฐ€ true์ด๊ณ , activationTarget์ด null์ด๋ฉฐ target์— ํ™œ์„ฑํ™” ๋™์ž‘์ด ์žˆ๋‹ค๋ฉด activationTarget์„ target์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

        3. event, parent, target, relatedTarget, touchTargets ๋ฐ slotInClosedTree๋กœ ์ด๋ฒคํŠธ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

      9. parent๊ฐ€ non-null์ด๋ผ๋ฉด, parent๋ฅผ parent์˜ ๋ถ€๋ชจ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ event์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      10. slotInClosedTree๋ฅผ false๋กœ ์„ค์ •ํ•œ๋‹ค.

    10. clearTargetsItem์„ event์˜ ๊ฒฝ๋กœ์—์„œ shadow-adjusted target์ด non-null์ธ ๋งˆ์ง€๋ง‰ ์ด๋ฒคํŠธ ๊ฒฝ๋กœ ํ•ญ๋ชฉ์œผ๋กœ ๋‘”๋‹ค.

    11. clearTargetsItem์˜ shadow-adjusted target, clearTargetsItem์˜ relatedTarget, ๋˜๋Š” clearTargetsItem์˜ ํ„ฐ์น˜ ๋Œ€์ƒ ๋ชฉ๋ก ์•ˆ์˜ EventTarget ๊ฐ์ฒด๊ฐ€ ๋…ธ๋“œ์ด๊ณ  ๊ทธ ๋ฃจํŠธ๊ฐ€ shadow root๋ผ๋ฉด: clearTargets๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค.

    12. activationTarget์ด non-null์ด๊ณ  activationTarget์— ๋ ˆ๊ฑฐ์‹œ-์‚ฌ์ „-ํ™œ์„ฑํ™” ๋™์ž‘์ด ์žˆ๋‹ค๋ฉด, activationTarget์˜ ๋ ˆ๊ฑฐ์‹œ-์‚ฌ์ „-ํ™œ์„ฑํ™” ๋™์ž‘์„ ์‹คํ–‰ํ•œ๋‹ค.

    13. event์˜ ๊ฒฝ๋กœ์˜ ๊ฐ item์— ๋Œ€ํ•ด, ์—ญ์ˆœ์œผ๋กœ:

      1. item์˜ shadow-adjusted target์ด non-null์ด๋ผ๋ฉด, event์˜ eventPhase ์†์„ฑ์„ AT_TARGET์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด, event์˜ eventPhase ์†์„ฑ์„ CAPTURING_PHASE๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. item, event, "capturing" ๋ฐ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ legacyOutputDidListenersThrowFlag๋กœ ํ˜ธ์ถœํ•œ๋‹ค.

    14. event์˜ ๊ฒฝ๋กœ์˜ ๊ฐ item์— ๋Œ€ํ•ด:

      1. item์˜ shadow-adjusted target์ด non-null์ด๋ผ๋ฉด, event์˜ eventPhase ์†์„ฑ์„ AT_TARGET์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด:

        1. event์˜ bubbles ์†์„ฑ์ด false๋ผ๋ฉด ๊ณ„์†ํ•œ๋‹ค.

        2. event์˜ eventPhase ์†์„ฑ์„ BUBBLING_PHASE๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. item, event, "bubbling" ๋ฐ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ legacyOutputDidListenersThrowFlag๋กœ ํ˜ธ์ถœํ•œ๋‹ค.

  7. event์˜ eventPhase ์†์„ฑ์„ NONE์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  8. event์˜ currentTarget ์†์„ฑ์„ null๋กœ ์„ค์ •ํ•œ๋‹ค.

  9. event์˜ ๊ฒฝ๋กœ๋ฅผ ๋นˆ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  10. event์˜ ๋””์ŠคํŒจ์น˜ ํ”Œ๋ž˜๊ทธ, ์ „ํŒŒ ์ค‘์ง€ ํ”Œ๋ž˜๊ทธ ๋ฐ ์ฆ‰์‹œ ์ „ํŒŒ ์ค‘์ง€ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ•ด์ œํ•œ๋‹ค.

  11. clearTargets๊ฐ€ true๋ผ๋ฉด:

    1. event์˜ target์„ null๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. event์˜ relatedTarget์„ null๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. event์˜ ํ„ฐ์น˜ ๋Œ€์ƒ ๋ชฉ๋ก์„ ๋นˆ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  12. activationTarget์ด non-null์ด๋ผ๋ฉด:

    1. event์˜ ์ทจ์†Œ๋จ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•ด์ œ๋˜์–ด ์žˆ๋‹ค๋ฉด, activationTarget์˜ ํ™œ์„ฑํ™” ๋™์ž‘์„ event์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  activationTarget์— ๋ ˆ๊ฑฐ์‹œ-์ทจ์†Œ๋จ-ํ™œ์„ฑํ™” ๋™์ž‘์ด ์žˆ๋‹ค๋ฉด, activationTarget์˜ ๋ ˆ๊ฑฐ์‹œ-์ทจ์†Œ๋จ-ํ™œ์„ฑํ™” ๋™์ž‘์„ ์‹คํ–‰ํ•œ๋‹ค.

  13. event์˜ ์ทจ์†Œ๋จ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด๋ฒคํŠธ event, EventTarget ๊ฐ์ฒด invocationTarget, ์ž ์žฌ์  ์ด๋ฒคํŠธ ๋Œ€์ƒ shadowAdjustedTarget, ์ž ์žฌ์  ์ด๋ฒคํŠธ ๋Œ€์ƒ relatedTarget, ๋ชฉ๋ก์ธ ์ž ์žฌ์  ์ด๋ฒคํŠธ ๋Œ€์ƒ๋“ค touchTargets ๋ฐ boolean slotInClosedTree๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด๋ฒคํŠธ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด:

  1. invocationTargetInShadowTree๋ฅผ false๋กœ ๋‘”๋‹ค.

  2. invocationTarget์ด ๋…ธ๋“œ์ด๊ณ  ๊ทธ ๋ฃจํŠธ๊ฐ€ shadow root๋ผ๋ฉด, invocationTargetInShadowTree๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. rootOfClosedTree๋ฅผ false๋กœ ๋‘”๋‹ค.

  4. invocationTarget์ด shadow root์ด๊ณ  ๊ทธ ๋ชจ๋“œ๊ฐ€ "closed"๋ผ๋ฉด, rootOfClosedTree๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. ์ƒˆ ์ด๋ฒคํŠธ ๊ฒฝ๋กœ ํ•ญ๋ชฉ์„ event์˜ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ํ•ญ๋ชฉ์˜ ํ˜ธ์ถœ ๋Œ€์ƒ์€ invocationTarget, invocation-target-in-shadow-tree๋Š” invocationTargetInShadowTree, shadow-adjusted target์€ shadowAdjustedTarget, relatedTarget์€ relatedTarget, ํ„ฐ์น˜ ๋Œ€์ƒ ๋ชฉ๋ก์€ touchTargets, root-of-closed-tree๋Š” rootOfClosedTree, ๊ทธ๋ฆฌ๊ณ  slot-in-closed-tree๋Š” slotInClosedTree์ด๋‹ค.

์ด๋ฒคํŠธ ๊ฒฝ๋กœ ํ•ญ๋ชฉ pathItem, ์ด๋ฒคํŠธ event, ๋ฌธ์ž์—ด phase ๋ฐ ์„ ํƒ์  legacyOutputDidListenersThrowFlag๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ˜ธ์ถœํ•˜๋ ค๋ฉด:

  1. targetItem์„ pathItem์œผ๋กœ ๋‘”๋‹ค.

  2. targetItem์˜ shadow-adjusted target์ด null์ธ ๋™์•ˆ: targetItem์„ event์˜ ๊ฒฝ๋กœ์—์„œ targetItem ์•ž์— ์˜ค๋Š” ์ด๋ฒคํŠธ ๊ฒฝ๋กœ ํ•ญ๋ชฉ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. event์˜ target์„ targetItem์˜ shadow-adjusted target์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. event์˜ relatedTarget์„ pathItem์˜ relatedTarget์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. event์˜ ํ„ฐ์น˜ ๋Œ€์ƒ ๋ชฉ๋ก์„ pathItem์˜ ํ„ฐ์น˜ ๋Œ€์ƒ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  6. event์˜ ์ „ํŒŒ ์ค‘์ง€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  7. event์˜ currentTarget ์†์„ฑ์„ pathItem์˜ ํ˜ธ์ถœ ๋Œ€์ƒ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

  8. listeners๋ฅผ event์˜ currentTarget ์†์„ฑ ๊ฐ’์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ชฉ๋ก์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋‘”๋‹ค.

    ์ด๋Š” ์ด ์‹œ์  ์ดํ›„์— ์ถ”๊ฐ€๋œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. ์ œ๊ฑฐ๋Š” ์—ฌ์ „ํžˆ removed ํ•„๋“œ ๋•Œ๋ฌธ์— ํšจ๊ณผ๊ฐ€ ์žˆ์Œ์— ์œ ์˜ํ•œ๋‹ค.

  9. invocationTargetInShadowTree๋ฅผ pathItem์˜ invocation-target-in-shadow-tree๋กœ ๋‘”๋‹ค.

  10. found๋ฅผ event, listeners, phase, invocationTargetInShadowTree ๋ฐ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ legacyOutputDidListenersThrowFlag๋กœ ๋‚ด๋ถ€ ํ˜ธ์ถœ์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  11. found๊ฐ€ false์ด๊ณ  event์˜ isTrusted ์†์„ฑ์ด true๋ผ๋ฉด:

    1. originalEventType์„ event์˜ type ์†์„ฑ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

    2. event์˜ type ์†์„ฑ ๊ฐ’์ด ๋‹ค์Œ ํ‘œ์˜ ์ฒซ ๋ฒˆ์งธ ์—ด์— ์žˆ๋Š” ๋ฌธ์ž์—ด ์ค‘ ์–ด๋А ๊ฒƒ๊ณผ ์ผ์น˜ํ•œ๋‹ค๋ฉด, event์˜ type ์†์„ฑ ๊ฐ’์„ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด๊ณผ ๊ฐ™์€ ํ–‰์˜ ๋‘ ๋ฒˆ์งธ ์—ด์— ์žˆ๋Š” ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      ์ด๋ฒคํŠธ ์œ ํ˜• ๋ ˆ๊ฑฐ์‹œ ์ด๋ฒคํŠธ ์œ ํ˜•
      "animationend" "webkitAnimationEnd"
      "animationiteration" "webkitAnimationIteration"
      "animationstart" "webkitAnimationStart"
      "transitionend" "webkitTransitionEnd"
    3. event, listeners, phase, invocationTargetInShadowTree ๋ฐ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ legacyOutputDidListenersThrowFlag๋กœ ๋‚ด๋ถ€ ํ˜ธ์ถœํ•œ๋‹ค.

    4. event์˜ type ์†์„ฑ ๊ฐ’์„ originalEventType์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

๋‚ด๋ถ€ ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, ์ฃผ์–ด์ง„ ์ด๋ฒคํŠธ event, ๋ชฉ๋ก์ธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ listeners, ๋ฌธ์ž์—ด phase, ๋ถˆ๋ฆฌ์–ธ invocationTargetInShadowTree, ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์  legacyOutputDidListenersThrowFlag๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. found๋ฅผ false๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. listeners์˜ ๊ฐ listener์— ๋Œ€ํ•ด, ๊ทธ removed๊ฐ€ false์ธ ๊ฒฝ์šฐ:

    1. event์˜ type ์†์„ฑ ๊ฐ’์ด listener์˜ type์ด ์•„๋‹ˆ๋ฉด ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

    2. found๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. phase๊ฐ€ "capturing"์ด๊ณ  listener์˜ capture๊ฐ€ false์ด๋ฉด ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

    4. phase๊ฐ€ "bubbling"์ด๊ณ  listener์˜ capture๊ฐ€ true์ด๋ฉด ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

    5. listener์˜ once๊ฐ€ true์ด๋ฉด, ์ฃผ์–ด์ง„ event์˜ currentTarget ์†์„ฑ ๊ฐ’๊ณผ listener์— ๋Œ€ํ•ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    6. targetGlobal์„ event์˜ currentTarget์ด ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ ํ•ด๋‹น currentTarget์˜ ๋…ธ๋“œ ๋ฌธ์„œ์˜ ๊ด€๋ จ ์ „์—ญ ๊ฐ์ฒด๋กœ ์„ค์ •ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด event์˜ currentTarget์˜ ๊ด€๋ จ ์ „์—ญ ๊ฐ์ฒด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    7. listenerGlobal์„ listener ์ฝœ๋ฐฑ์˜ ์—ฐ๊ฒฐ๋œ Realm์˜ ์ „์—ญ ๊ฐ์ฒด๋กœ ๋‘ก๋‹ˆ๋‹ค.

    8. targetGlobal ๋˜๋Š” listenerGlobal์ด Window ๊ฐ์ฒด์ด๊ณ  ๊ทธ ์—ฐ๊ฒฐ๋œ Document๊ฐ€ ์™„์ „ํžˆ ํ™œ์„ฑ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

    9. currentEvent๋ฅผ undefined๋กœ ๋‘ก๋‹ˆ๋‹ค.

    10. listenerGlobal์ด Window ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ:

      1. currentEvent๋ฅผ listenerGlobal์˜ ํ˜„์žฌ ์ด๋ฒคํŠธ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. invocationTargetInShadowTree๊ฐ€ false์ด๋ฉด listenerGlobal์˜ ํ˜„์žฌ ์ด๋ฒคํŠธ๋ฅผ event๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    11. listener์˜ passive๊ฐ€ true์ด๋ฉด event์˜ ํŒจ์‹œ๋ธŒ ๋ฆฌ์Šค๋„ˆ ๋‚ด๋ถ€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    12. listenerGlobal์ด Window ๊ฐ์ฒด์ด๋ฉด, event์™€ listener๊ฐ€ ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์˜ ํƒ€์ด๋ฐ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

    13. listener์˜ ์ฝœ๋ฐฑ, "handleEvent", ยซ event ยป, ๊ทธ๋ฆฌ๊ณ  event์˜ currentTarget ์†์„ฑ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฐ์ฒด์˜ ์—ฐ์‚ฐ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์˜ˆ์™ธ exception์ด ๋ฐœ์ƒํ•˜๋ฉด:

      1. listener์˜ ์ฝœ๋ฐฑ์— ๋Œ€์‘ํ•˜๋Š” JavaScript ๊ฐ์ฒด์˜ ์—ฐ๊ฒฐ๋œ Realm์˜ ์ „์—ญ ๊ฐ์ฒด์— ๋Œ€ํ•ด exception์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

      2. ์ œ๊ณต๋œ ๊ฒฝ์šฐ legacyOutputDidListenersThrowFlag๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

        legacyOutputDidListenersThrowFlag๋Š” Indexed Database API์—์„œ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. [INDEXEDDB]

    14. event์˜ ํŒจ์‹œ๋ธŒ ๋ฆฌ์Šค๋„ˆ ๋‚ด๋ถ€ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

    15. listenerGlobal์ด Window ๊ฐ์ฒด์ด๋ฉด listenerGlobal์˜ ํ˜„์žฌ ์ด๋ฒคํŠธ๋ฅผ currentEvent๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    16. event์˜ ์ฆ‰์‹œ ์ „ํŒŒ ์ค‘์ง€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

  3. found๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

2.10. ์ด๋ฒคํŠธ ๋ฐœ์ƒ

์ด๋ฒคํŠธ ๋ฐœ์ƒ์„ ์œ„ํ•ด e๋ผ๋Š” ์ด๋ฆ„์˜ ์ด๋ฒคํŠธ๋ฅผ target์—์„œ, ์„ ํƒ์ ์œผ๋กœ eventConstructor๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, IDL ์†์„ฑ ์ดˆ๊ธฐํ™” ๋ฐฉ๋ฒ•์˜ ์„ค๋ช…๊ณผ legacy target override flag์™€ ํ•จ๊ป˜, ๋‹ค์Œ ๋‹จ๊ณ„๋“ค์„ ์‹คํ–‰ํ•œ๋‹ค:

  1. recordingTimingAsTask๋ฅผ ๋‹ค์Œ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ž‘์—… ์‹œ๊ฐ„ ๊ธฐ๋ก ์‹œ์ž‘ ์ด๋•Œ target์˜ ๊ด€๋ จ ์„ค์ • ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  2. eventConstructor๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด, eventConstructor๋ฅผ ๋‹ค์Œ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: Event.

  3. event๋ฅผ ์ด๋ฒคํŠธ ์ƒ์„ฑ์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ eventConstructor๋ฅผ ์ „๋‹ฌํ•˜๊ณ , target์˜ ๊ด€๋ จ ๋ ๋ฆ„์—์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  4. event์˜ type ์†์„ฑ์„ e๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  5. event์˜ ๋‹ค๋ฅธ ๋ชจ๋“  IDL ์†์„ฑ์„ ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ˜ธ์ถœ์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

    ์ด๋ฅผ ํ†ตํ•ด isTrusted ์†์„ฑ์„ false๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  6. result๋ฅผ event๋ฅผ target์— ๋ฐœ์†กํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ legacy target override flag๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ ์ด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. recordingTimingAsTask๊ฐ€ true์ด๋ฉด:

    1. ๋‹จ์–ธ: target์˜ ๊ด€๋ จ ์„ค์ • ๊ฐ์ฒด๋Š” Document์ž…๋‹ˆ๋‹ค.
    2. ์ž‘์—… ์ข…๋ฃŒ ์‹œ๊ฐ„ ๊ธฐ๋ก์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ณต์œ  ํ˜„์žฌ ์‹œ๊ฐ„๊ณผ target์˜ ๊ด€๋ จ ์„ค์ • ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  8. result๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

DOM์˜ ๋ฌธ๋งฅ์—์„œ Fire๋Š” ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”, ๊ทธ๋ฆฌ๊ณ  ๋””์ŠคํŒจ์น˜๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ค„์—ฌ ์ด๋ฅด๋Š” ๋ง์ด๋‹ค. ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ๋Š” ๊ทธ ๊ณผ์ •์„ ๋” ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

์ด๋ฒคํŠธ์˜ bubbles ๋˜๋Š” cancelable ์†์„ฑ์„ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, "target์—์„œ submit์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , ๊ทธ cancelable ์†์„ฑ์„ true๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค"๋ผ๊ณ  ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜๋Š”, ์‚ฌ์šฉ์ž ์ •์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋Š”, "target์—์„œ click์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋˜ MouseEvent๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ detail ์†์„ฑ์„ 1๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค"๋ผ๊ณ  ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๋•Œ๋กœ๋Š” ๋ฐ˜ํ™˜๊ฐ’์ด ์ค‘์š”ํ•˜๋‹ค:

  1. doAction์„ target์—์„œ like๋ผ๋Š” ์ด๋ฆ„์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. doAction์ด true๋ผ๋ฉด, โ€ฆ

2.11. ๋™์ž‘๊ณผ ๋ฐœ์ƒ์˜ ์ฐจ์ด

์ด๋ฒคํŠธ๋Š” ๋™์ž‘์ด ์•„๋‹ˆ๋ผ ๋ฐœ์ƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹ฌ๋ฆฌ ๋งํ•˜๋ฉด, ์ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋ถ€ํ„ฐ์˜ ์•Œ๋ฆผ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ดํ›„ ์ง„ํ–‰ ๋ฐฉํ–ฅ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค (์˜ˆ: preventDefault() ํ˜ธ์ถœ์„ ํ†ตํ•ด). ์ด๋ฒคํŠธ๋Š” ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‹คํ–‰๋˜๊ธฐ ์‹œ์ž‘ํ•˜๊ฒŒ ํ•˜๋Š” ๋™์ž‘์ด๋‚˜ ๊ฐœ์‹œ์ž๋กœ ์‚ฌ์šฉ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๊ทธ๊ฒƒ์€ ์ด๋ฒคํŠธ์˜ ๋ชฉ์ ์ด ์•„๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ด๋ฅผ ํŠน๋ณ„ํžˆ ์–ธ๊ธ‰ํ•˜๋Š” ์ด์œ ๋Š”, ์ด์ „ DOM ๋ฐ˜๋ณตํŒ๋“ค์—๋Š” ์ด๋ฒคํŠธ์™€ ์—ฐ๊ด€๋œ "๊ธฐ๋ณธ ๋™์ž‘"์ด๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ์—ˆ๊ณ , ๊ทธ๊ฒƒ์ด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์™„์ „ํžˆ ์ž˜๋ชป๋œ ์ƒ๊ฐ์„ ์‹ฌ์–ด ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ฒคํŠธ๋Š” ๋™์ž‘์„ ๋‚˜ํƒ€๋‚ด๊ฑฐ๋‚˜ ์œ ๋ฐœํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ง„ํ–‰ ์ค‘์ธ ๋™์ž‘์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋ฐ์—๋งŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

3. ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—… ์ค‘๋‹จ

ํ”„๋ผ๋ฏธ์Šค์—๋Š” ๋‚ด์žฅ๋œ ์ค‘๋‹จ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์—†์ง€๋งŒ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ API๋Š” ์ค‘๋‹จ ์˜๋ฏธ๋ก ์„ ํ•„์š”๋กœ ํ•œ๋‹ค. AbortController ๋Š” abort() ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํ•ด๋‹น 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๋Š” AbortController ์™€ AbortSignal ๊ฐ์ฒด๋ฅผ ํ•„์š”์— ๋”ฐ๋ผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

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. this์˜ signal์„ signal๋กœ ์„ค์ •ํ•œ๋‹ค.

signal getter ๋‹จ๊ณ„๋Š” this์˜ signal์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

abort(reason) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” signal abort๋ฅผ this์™€ reason์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค(์ฃผ์–ด์กŒ์„ ๊ฒฝ์šฐ).

signal abort๋ฅผ AbortController controller์™€ ์„ ํƒ์  reason์œผ๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด, signal abort๋ฅผ controller์˜ signal๊ณผ reason์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค(์ฃผ์–ด์กŒ์„ ๊ฒฝ์šฐ).

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
signal์˜ AbortController ๊ฐ€ ์ค‘๋‹จ์„ ์•Œ๋ ธ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
signal . reason
signal์˜ ์ค‘๋‹จ ์ด์œ ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
signal . throwIfAborted()
signal์˜ ์ค‘๋‹จ ์ด์œ ๋ฅผ ๋˜์ง„๋‹ค. signal์˜ AbortController ๊ฐ€ ์ค‘๋‹จ์„ ์•Œ๋ ธ์„ ๋•Œ๋งŒ ๋™์ž‘ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

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. global์„ signal์˜ ๊ด€๋ จ ์ „์—ญ ๊ฐ์ฒด๋กœ ํ•œ๋‹ค.

  3. ํƒ€์ž„์•„์›ƒ ํ›„ ๋‹จ๊ณ„ ์‹คํ–‰์„ global, "AbortSignal-timeout", milliseconds, ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ๋‹ค:

    1. ์ „์—ญ ํƒœ์Šคํฌ ํ์— ์ถ”๊ฐ€๋ฅผ ํƒ€์ด๋จธ ํƒœ์Šคํฌ ์†Œ์Šค์— global๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜์—ฌ, ์ค‘๋‹จ ์‹ ํ˜ธ๋ฅผ signal๊ณผ ์ƒˆ๋กœ์šด "TimeoutError" DOMException์œผ๋กœ ๋ณด๋‚ธ๋‹ค.

    ์ด ํƒ€์ž„์•„์›ƒ ๊ธฐ๊ฐ„ ๋™์•ˆ, signal์— abort ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค๋ฉด, 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๊ฐ€ ์•„๋‹ ๋•Œ ์ค‘๋‹จ๋œ ๊ฒƒ์ด๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ algorithm์„ AbortSignal ๊ฐ์ฒด signal์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด:

  1. signal์ด ์ค‘๋‹จ๋˜์—ˆ๋‹ค๋ฉด, ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. algorithm์„ signal์˜ ์ค‘๋‹จ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์ถ”๊ฐ€ํ•œ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ algorithm์„ AbortSignal signal์—์„œ ์ œ๊ฑฐํ•˜๋ ค๋ฉด, algorithm์„ signal์˜ ์ค‘๋‹จ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.

AbortSignal ๊ฐ์ฒด signal๊ณผ ์„ ํƒ์  reason์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ค‘๋‹จ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋ ค๋ฉด:

  1. signal์ด ์ค‘๋‹จ๋˜์—ˆ๋‹ค๋ฉด, ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. signal์˜ ์ค‘๋‹จ ์ด์œ ๋ฅผ reason์ด ์ฃผ์–ด์กŒ์œผ๋ฉด ๊ทธ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ์šด "AbortError" DOMException์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. dependentSignalsToAbort๋ฅผ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๋กœ ํ•œ๋‹ค.

  4. signal์˜ ์˜์กด ์‹ ํ˜ธ์˜ ๊ฐ dependentSignal์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•œ๋‹ค:

    1. dependentSignal์ด ์ค‘๋‹จ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด:

      1. dependentSignal์˜ ์ค‘๋‹จ ์ด์œ ๋ฅผ signal์˜ ์ค‘๋‹จ ์ด์œ ๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. dependentSignal์„ dependentSignalsToAbort์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  5. signal์— ๋Œ€ํ•ด ์ค‘๋‹จ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  6. dependentSignalsToAbort์˜ ๊ฐ dependentSignal์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•˜๋ฉฐ, dependentSignal์— ๋Œ€ํ•ด ์ค‘๋‹จ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

AbortSignal signal์— ๋Œ€ํ•ด ์ค‘๋‹จ ๋‹จ๊ณ„ ์‹คํ–‰ํ•˜๋ ค๋ฉด:

  1. signal์˜ ์ค‘๋‹จ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐ algorithm์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•˜๋ฉฐ algorithm์„ ์‹คํ–‰ํ•œ๋‹ค.

  2. signal์˜ ์ค‘๋‹จ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋น„์šด๋‹ค.

  3. abort๋ผ๋Š” ์ด๋ฆ„์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

AbortSignal ๊ฐ์ฒด ๋ชฉ๋ก signals๋กœ๋ถ€ํ„ฐ, AbortSignal ๋˜๋Š” ์ด๋ฅผ ์ƒ์†ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—ฌ์•ผ ํ•˜๋Š” signalInterface์™€ realm์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์ ์ธ ์ค‘๋‹จ ์‹ ํ˜ธ ์ƒ์„ฑํ•˜๋ ค๋ฉด:

  1. resultSignal์„ realm์„ ์‚ฌ์šฉํ•˜์—ฌ signalInterface๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ํ•œ๋‹ค.

  2. signals์˜ ๊ฐ signal์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•œ๋‹ค: signal์ด ์ค‘๋‹จ๋˜์—ˆ๋‹ค๋ฉด, resultSignal์˜ ์ค‘๋‹จ ์ด์œ ๋ฅผ signal์˜ ์ค‘๋‹จ ์ด์œ ๋กœ ์„ค์ •ํ•˜๊ณ  resultSignal์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. resultSignal์˜ ์˜์กด์ ์ธ ์†์„ฑ์„ true๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. signals์˜ ๊ฐ signal์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•œ๋‹ค:

    1. signal์˜ ์˜์กด์ ์ธ ์†์„ฑ์ด false๋ผ๋ฉด:

      1. signal์„ resultSignal์˜ ์†Œ์Šค ์‹ ํ˜ธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

      2. resultSignal์„ signal์˜ ์˜์กด ์‹ ํ˜ธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, signal์˜ ์†Œ์Šค ์‹ ํ˜ธ์˜ ๊ฐ sourceSignal์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•œ๋‹ค:

      1. ๋‹จ์–ธ: sourceSignal์€ ์ค‘๋‹จ๋˜์ง€ ์•Š์•˜๊ณ  ์˜์กด์ ์ด์ง€ ์•Š๋‹ค.

      2. sourceSignal์„ resultSignal์˜ ์†Œ์Šค ์‹ ํ˜ธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

      3. resultSignal์„ sourceSignal์˜ ์˜์กด ์‹ ํ˜ธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  5. resultSignal์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.2.1. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜

์ค‘๋‹จ๋˜์ง€ ์•Š์€ ์˜์กด์ ์ธ AbortSignal ๊ฐ์ฒด๋Š” ์†Œ์Šค ์‹ ํ˜ธ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๊ณ  abort ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์ค‘๋‹จ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋น„์–ด์žˆ์ง€ ์•Š์€ ๋™์•ˆ์—๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

3.3. API์—์„œ AbortController ์™€ AbortSignal ๊ฐ์ฒด ์‚ฌ์šฉํ•˜๊ธฐ

์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์›น ํ”Œ๋žซํผ API๋Š” ๋‹ค์Œ์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•œ๋‹ค:

  • signal ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„๋ฅผ ํ†ตํ•ด AbortSignal ๊ฐ์ฒด๋ฅผ ๋ฐ›๋Š”๋‹ค.
  • AbortSignal ๊ฐ์ฒด์˜ ์ค‘๋‹จ ์ด์œ ๋กœ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๊ฑฐ๋ถ€ํ•˜์—ฌ ์ž‘์—…์ด ์ค‘๋‹จ๋˜์—ˆ์Œ์„ ์ „๋‹ฌํ•œ๋‹ค.
  • AbortSignal ์ด ์ด๋ฏธ ์ค‘๋‹จ๋˜์—ˆ๋‹ค๋ฉด ์ฆ‰์‹œ ๊ฑฐ๋ถ€ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:
  • ์ค‘๋‹จ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ AbortSignal ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ด€์ฐฐํ•˜๋˜, ๋‹ค๋ฅธ ๊ด€์ฐฐ์ž๋“ค๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•œ๋‹ค.

ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ doAmazingness(options)์˜ ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ๋‹ค:

  1. global์„ this์˜ ๊ด€๋ จ ์ „์—ญ ๊ฐ์ฒด๋กœ ํ•œ๋‹ค.

  2. p๋ฅผ ์ƒˆ๋กœ์šด ํ”„๋ผ๋ฏธ์Šค๋กœ ํ•œ๋‹ค.

  3. options["signal"]์ด ์กด์žฌํ•œ๋‹ค๋ฉด:

    1. signal์„ options["signal"]๋กœ ํ•œ๋‹ค.

    2. signal์ด ์ค‘๋‹จ๋˜์—ˆ๋‹ค๋ฉด, signal์˜ ์ค‘๋‹จ ์ด์œ ๋กœ p๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  p๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    3. signal์— ๋‹ค์Œ ์ค‘๋‹จ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค:

      1. ๋†€๋ผ์šด ์ผ์„ ๋ฉˆ์ถ˜๋‹ค.

      2. signal์˜ ์ค‘๋‹จ ์ด์œ ๋กœ p๋ฅผ ๊ฑฐ๋ถ€ํ•œ๋‹ค.

  4. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•œ๋‹ค:

    1. amazingResult๋ฅผ ๋†€๋ผ์šด ์ผ์„ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ํ•œ๋‹ค.

    2. global๊ณผ ํ•จ๊ป˜ ๋†€๋ผ์šด ํƒœ์Šคํฌ ์†Œ์Šค์—์„œ ์ „์—ญ ํƒœ์Šคํฌ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•˜์—ฌ amazingResult๋กœ p๋ฅผ ์ดํ–‰ํ•œ๋‹ค.

  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 ๊ณต๋ฐฑ์ด Text ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋…์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋งˆํฌ์—…์ด ๋“ค์–ด๊ฐ€๊ณ , ํŠธ๋ฆฌ์™€ ๋…ธ๋“œ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์•„์ฃผ ํ›Œ๋ฅญํ•œ 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. node๊ฐ€ DocumentType ๋˜๋Š” Attr ๋…ธ๋“œ์ด๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. node๊ฐ€ CharacterData ๋…ธ๋“œ์ด๋ฉด, node์˜ ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. node์˜ ์ž์‹ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ๋Š” ๊ทธ ๋น„์–ด ์žˆ์Œ์ด ๊ธธ์ด๊ฐ€ 0์ด๋ฉด ์„ฑ๋ฆฝํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

4.2.1. ๋ฌธ์„œ ํŠธ๋ฆฌ

๋ฌธ์„œ ํŠธ๋ฆฌ๋Š” ๋…ธ๋“œ ํŠธ๋ฆฌ์ด๋ฉฐ, ๊ทธ ๋ฃจํŠธ๋Š” ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

๋ฌธ์„œ์˜ ๋ฌธ์„œ ์š”์†Œ๋Š” ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ ๋ฌธ์„œ๋ฅผ ๋ถ€๋ชจ๋กœ ํ•˜๋Š” ์š”์†Œ์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ ํŠธ๋ฆฌ ์ œ์•ฝ ์กฐ๊ฑด์— ๋”ฐ๋ผ, ์ด๋Ÿฌํ•œ ์š”์†Œ๋Š” ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ๋Š” ๊ทธ ๋ฃจํŠธ๊ฐ€ ๋ฌธ์„œ์ด๋ฉด ๋ฌธ์„œ ํŠธ๋ฆฌ ์•ˆ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ๋Š” ๋ฌธ์„œ ํŠธ๋ฆฌ ์•ˆ์— ์žˆ์œผ๋ฉด ๋ฌธ์„œ ์•ˆ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ ์•ˆ์—๋ผ๋Š” ์šฉ์–ด๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์šฉ์–ด๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ํ•ด๋‹น ํ‘œ์ค€์ด ์„€๋„ ํŠธ๋ฆฌ๋ฅผ ๊ณ ๋ คํ•˜๋„๋ก ์•„์ง ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

4.2.2. ์„€๋„ ํŠธ๋ฆฌ

์„€๋„ ํŠธ๋ฆฌ๋Š” ๋ฃจํŠธ๊ฐ€ ์„€๋„ ๋ฃจํŠธ์ธ ๋…ธ๋“œ ํŠธ๋ฆฌ์ด๋‹ค.

์„€๋„ ๋ฃจํŠธ๋Š” ๊ทธ ํ˜ธ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ํ•ญ์ƒ ๋‹ค๋ฅธ ๋…ธ๋“œ ํŠธ๋ฆฌ์— ์—ฐ๊ฒฐ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์„€๋„ ํŠธ๋ฆฌ๋Š” ํ˜ผ์ž ์žˆ์ง€ ์•Š๋Š”๋‹ค. ์„€๋„ ๋ฃจํŠธ์˜ ํ˜ธ์ŠคํŠธ์˜ ๋…ธ๋“œ ํŠธ๋ฆฌ๋Š” ๋•Œ๋•Œ๋กœ ๋ผ์ดํŠธ ํŠธ๋ฆฌ๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค.

์„€๋„ ํŠธ๋ฆฌ์— ๋Œ€์‘ํ•˜๋Š” ๋ผ์ดํŠธ ํŠธ๋ฆฌ๋Š” ๊ทธ ์ž์ฒด๋กœ ์„€๋„ ํŠธ๋ฆฌ์ผ ์ˆ˜ ์žˆ๋‹ค.

๋…ธ๋“œ๋Š” ๊ทธ ์„€๋„ ํฌํ•จ ๋ฃจํŠธ๊ฐ€ ๋ฌธ์„œ์ผ ๋•Œ ์—ฐ๊ฒฐ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

4.2.2.1. ์Šฌ๋กฏ

์„€๋„ ํŠธ๋ฆฌ๋Š” ์Šฌ๋กฏ์ธ 0๊ฐœ ์ด์ƒ์˜ ์š”์†Œ๋ฅผ ํฌํ•จํ•œ๋‹ค.

์Šฌ๋กฏ์€ HTML์˜ slot ์š”์†Œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

์Šฌ๋กฏ์€ ์—ฐ๊ด€๋œ ์ด๋ฆ„(๋ฌธ์ž์—ด)์„ ๊ฐ€์ง„๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ ๋นˆ ๋ฌธ์ž์—ด์ด๋‹ค.

์Šฌ๋กฏ์˜ ์ด๋ฆ„์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์†์„ฑ ๋ณ€๊ฒฝ ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค:

  1. element๊ฐ€ ์Šฌ๋กฏ์ด๊ณ , localName์ด name์ด๋ฉฐ, namespace๊ฐ€ null์ด๋ผ๋ฉด:

    1. value๊ฐ€ oldValue์™€ ๊ฐ™๋‹ค๋ฉด, ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. value๊ฐ€ null์ด๊ณ  oldValue๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ผ๋ฉด, ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    3. value๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๊ณ  oldValue๊ฐ€ null์ด๋ผ๋ฉด, ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    4. value๊ฐ€ null์ด๊ฑฐ๋‚˜ ๋นˆ ๋ฌธ์ž์—ด์ด๋ผ๋ฉด, element์˜ ์ด๋ฆ„์„ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•œ๋‹ค.

    5. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, element์˜ ์ด๋ฆ„์„ value๋กœ ์„ค์ •ํ•œ๋‹ค.

    6. element์˜ ๋ฃจํŠธ์™€ ํ•จ๊ป˜ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ ํ• ๋‹น์„ ์‹คํ–‰ํ•œ๋‹ค.

์„€๋„ ํŠธ๋ฆฌ์—์„œ ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ ์ฒซ ๋ฒˆ์งธ ์Šฌ๋กฏ์ด๊ณ  ์ด๋ฆ„์ด ๋นˆ ๋ฌธ์ž์—ด์ธ ๊ฒƒ์€ ๋•Œ๋•Œ๋กœ "๊ธฐ๋ณธ ์Šฌ๋กฏ"์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค.

์Šฌ๋กฏ์€ ์—ฐ๊ด€๋œ ํ• ๋‹น๋œ ๋…ธ๋“œ(์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ์˜ ๋ชฉ๋ก)๋ฅผ ๊ฐ€์ง„๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ ๋น„์–ด์žˆ๋‹ค.

4.2.2.2. ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ

Element์™€ Text ๋…ธ๋“œ๋Š” ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ์ด๋‹ค.

์Šฌ๋กฏ์€ ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ๋Š” ์—ฐ๊ด€๋œ ์ด๋ฆ„(๋ฌธ์ž์—ด)์„ ๊ฐ€์ง„๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ ๋นˆ ๋ฌธ์ž์—ด์ด๋‹ค.

์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ์˜ ์ด๋ฆ„์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์†์„ฑ ๋ณ€๊ฒฝ ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค:

  1. localName์ด slot์ด๊ณ  namespace๊ฐ€ null์ด๋ผ๋ฉด:

    1. value๊ฐ€ oldValue์™€ ๊ฐ™๋‹ค๋ฉด, ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    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. shadow๋ฅผ slottable์˜ ๋ถ€๋ชจ์˜ ์„€๋„ ๋ฃจํŠธ๋กœ ํ•œ๋‹ค.

  3. shadow๊ฐ€ null์ด๋ผ๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. open์ด true์ด๊ณ  shadow์˜ ๋ชจ๋“œ๊ฐ€ "open"์ด ์•„๋‹ˆ๋ผ๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. shadow์˜ ์Šฌ๋กฏ ํ• ๋‹น์ด "manual"์ด๋ผ๋ฉด, shadow์˜ ํ›„์† ์ค‘ ์ˆ˜๋™์œผ๋กœ ํ• ๋‹น๋œ ๋…ธ๋“œ๊ฐ€ slottable์„ ํฌํ•จํ•˜๋Š” ์Šฌ๋กฏ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์žˆ๋‹ค๋ฉด; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null.

  6. shadow์˜ ํ›„์† ์ค‘ ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ ์ฒซ ๋ฒˆ์งธ์ด๋ฉฐ ์ด๋ฆ„์ด slottable์˜ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ์Šฌ๋กฏ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์žˆ๋‹ค๋ฉด; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null.

์ฃผ์–ด์ง„ ์Šฌ๋กฏ slot์— ๋Œ€ํ•ด ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ ์ฐพ๊ธฐ๋ฅผ ํ•˜๋ ค๋ฉด:

  1. result๋ฅผ ยซ ยป๋กœ ํ•œ๋‹ค.

  2. root๋ฅผ slot์˜ ๋ฃจํŠธ๋กœ ํ•œ๋‹ค.

  3. root๊ฐ€ ์„€๋„ ๋ฃจํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, result๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. host๋ฅผ root์˜ ํ˜ธ์ŠคํŠธ๋กœ ํ•œ๋‹ค.

  5. root์˜ ์Šฌ๋กฏ ํ• ๋‹น์ด "manual"์ด๋ผ๋ฉด:

    1. slot์˜ ์ˆ˜๋™์œผ๋กœ ํ• ๋‹น๋œ ๋…ธ๋“œ์˜ ๊ฐ ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ slottable์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•˜๋ฉฐ, ๋งŒ์•ฝ slottable์˜ ๋ถ€๋ชจ๊ฐ€ host๋ผ๋ฉด, slottable์„ result์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  6. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, host์˜ ๊ฐ ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ ์ž์‹ slottable์— ๋Œ€ํ•ด ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ:

    1. foundSlot์„ slottable์„ ์ฃผ์–ด์„œ ์Šฌ๋กฏ์„ ์ฐพ์€ ๊ฒฐ๊ณผ๋กœ ํ•œ๋‹ค.

    2. foundSlot์ด slot์ด๋ผ๋ฉด, slottable์„ result์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  7. result๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ฃผ์–ด์ง„ ์Šฌ๋กฏ slot์— ๋Œ€ํ•ด ํ‰๋ฉดํ™”๋œ ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ ์ฐพ๊ธฐ๋ฅผ ํ•˜๋ ค๋ฉด:

  1. result๋ฅผ ยซ ยป๋กœ ํ•œ๋‹ค.

  2. slot์˜ ๋ฃจํŠธ๊ฐ€ ์„€๋„ ๋ฃจํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, result๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. slottables๋ฅผ slot์„ ์ฃผ์–ด์„œ ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ๋ฅผ ์ฐพ์€ ๊ฒฐ๊ณผ๋กœ ํ•œ๋‹ค.

  4. slottables๊ฐ€ ๋นˆ ๋ชฉ๋ก์ด๋ผ๋ฉด, slot์˜ ๊ฐ ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ ์ž์‹์„ ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ slottables์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  5. slottables์˜ ๊ฐ node์— ๋Œ€ํ•ด:

    1. node๊ฐ€ ๋ฃจํŠธ๊ฐ€ ์„€๋„ ๋ฃจํŠธ์ธ ์Šฌ๋กฏ์ด๋ผ๋ฉด:

      1. temporaryResult๋ฅผ node๋ฅผ ์ฃผ์–ด์„œ ํ‰๋ฉดํ™”๋œ ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ๋ฅผ ์ฐพ์€ ๊ฒฐ๊ณผ๋กœ ํ•œ๋‹ค.

      2. temporaryResult์˜ ๊ฐ ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ result์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, node๋ฅผ result์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  6. result๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

4.2.2.4. ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ์™€ ์Šฌ๋กฏ ํ• ๋‹น

์Šฌ๋กฏ slot์— ๋Œ€ํ•ด ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ ํ• ๋‹น์„ ํ•˜๋ ค๋ฉด:

  1. slottables๋ฅผ slot์— ๋Œ€ํ•ด ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ๋ฅผ ์ฐพ์€ ๊ฒฐ๊ณผ๋กœ ํ•œ๋‹ค.

  2. slottables์™€ slot์˜ ํ• ๋‹น๋œ ๋…ธ๋“œ๊ฐ€ ๋™์ผํ•˜์ง€ ์•Š๋‹ค๋ฉด, slot์— ๋Œ€ํ•ด ์Šฌ๋กฏ ๋ณ€๊ฒฝ ์‹ ํ˜ธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  3. slot์˜ ํ• ๋‹น๋œ ๋…ธ๋“œ๋ฅผ slottables๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. slottables์˜ ๊ฐ slottable์— ๋Œ€ํ•ด: slottable์˜ ํ• ๋‹น๋œ ์Šฌ๋กฏ์„ slot์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

์ฃผ์–ด์ง„ ๋…ธ๋“œ root์— ๋Œ€ํ•ด ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ ํ• ๋‹น์„ ํ•˜๋ ค๋ฉด, root์˜ ํฌํ•จ ํ›„์†์˜ ๊ฐ ์Šฌ๋กฏ์— ๋Œ€ํ•ด ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ ํ• ๋‹น์„ ์‹คํ–‰ํ•œ๋‹ค.

์ฃผ์–ด์ง„ ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ slottable์— ๋Œ€ํ•ด ์Šฌ๋กฏ ํ• ๋‹น์„ ํ•˜๋ ค๋ฉด:

  1. slot์„ slottable๊ณผ ํ•จ๊ป˜ ์Šฌ๋กฏ์„ ์ฐพ์€ ๊ฒฐ๊ณผ๋กœ ํ•œ๋‹ค.

  2. slot์ด non-null์ด๋ผ๋ฉด, slot์— ๋Œ€ํ•ด ์Šฌ๋กฏ ๊ฐ€๋Šฅํ•œ ์š”์†Œ ํ• ๋‹น์„ ์‹คํ–‰ํ•œ๋‹ค.

4.2.2.5. ์Šฌ๋กฏ ๋ณ€๊ฒฝ ์‹ ํ˜ธ

๊ฐ ์œ ์‚ฌ ์ถœ์ฒ˜ ์œˆ๋„์šฐ ์—์ด์ „ํŠธ๋Š” ์‹ ํ˜ธ ์Šฌ๋กฏ(์Šฌ๋กฏ์˜ ์ง‘ํ•ฉ)์„ ๊ฐ€์ง€๋ฉฐ, ์ด๋Š” ์ดˆ๊ธฐ์— ๋น„์–ด์žˆ๋‹ค. [HTML]

4.2.3. ๋ณ€๊ฒฝ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ฃผ์–ด์ง„ ๋…ธ๋“œ node, ๋…ธ๋“œ parent, null ๋˜๋Š” ๋…ธ๋“œ child, ๊ทธ๋ฆฌ๊ณ  ๋ชฉ๋ก์ธ ๋…ธ๋“œ childrenToExclude์— ๋Œ€ํ•ด ์‚ฌ์ „ ์‚ฝ์ž… ์œ ํšจ์„ฑ์„ ๋ณด์žฅํ•˜๋ ค๋ฉด:

  1. parent๊ฐ€ Document, DocumentFragment, ๋˜๋Š” Element ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด, "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  2. node๊ฐ€ parent์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ํฌ๊ด„์  ์กฐ์ƒ์ด๋ฉด, "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  3. child๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  ๊ทธ ๋ถ€๋ชจ๊ฐ€ parent๊ฐ€ ์•„๋‹ˆ๋ฉด, "NotFoundError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  4. node๊ฐ€ DocumentFragment, DocumentType, Element, ๋˜๋Š” CharacterData ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด, "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  5. parent๊ฐ€ ๋ฌธ์„œ๊ฐ€ ์•„๋‹ˆ๋ฉด:

    1. node๊ฐ€ doctype์ด๋ฉด, "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

    2. ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  6. node๊ฐ€ Text ๋…ธ๋“œ์ด๋ฉด, "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  7. node๊ฐ€ CharacterData ๋…ธ๋“œ์ด๋ฉด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  8. node๊ฐ€ DocumentFragment ๋…ธ๋“œ์ด๋ฉด:

    1. node์— ๋‘˜ ์ด์ƒ์˜ ์š”์†Œ ์ž์‹์ด ์žˆ๊ฑฐ๋‚˜ Text ๋…ธ๋“œ ์ž์‹์ด ์žˆ์œผ๋ฉด, "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

    2. node์— ์š”์†Œ ์ž์‹์ด ์—†์œผ๋ฉด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  9. node๊ฐ€ DocumentFragment ๋˜๋Š” Element ๋…ธ๋“œ์ด๋ฉด:

    1. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฐธ์ด๋ฉด:

      "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

    2. ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  10. ๋‹จ์–ธ: node๋Š” doctype์ž…๋‹ˆ๋‹ค.

  11. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฐธ์ด๋ฉด:

    "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

๋…ธ๋“œ node๋ฅผ ๋…ธ๋“œ parent ์•ˆ์— null ๋˜๋Š” ๋…ธ๋“œ child ์•ž์— ์‚ฌ์ „ ์‚ฝ์ž…ํ•˜๋ ค๋ฉด:

  1. node, parent, child, ๊ทธ๋ฆฌ๊ณ  ยซ ยป๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์‚ฌ์ „ ์‚ฝ์ž… ์œ ํšจ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  2. referenceChild๋ฅผ child๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. referenceChild๊ฐ€ node์ด๋ฉด, referenceChild๋ฅผ node์˜ ๋‹ค์Œ ํ˜•์ œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. node๋ฅผ parent ์•ˆ์— referenceChild ์•ž์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

  5. node๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ช…์„ธ๋Š” ๋ชจ๋“  ๋˜๋Š” ์ผ๋ถ€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์‚ฝ์ž… ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์‚ฝ์ž… ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” insertedNode๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ insertedNode๊ฐ€ ์ฐธ์—ฌํ•˜๋Š” ๋…ธ๋“œ ํŠธ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜, ๋ธŒ๋ผ์šฐ์ง• ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜, ๊ทธ ๋ฐ–์˜ ๋ฐฉ์‹์œผ๋กœ JavaScript๋ฅผ ์‹คํ–‰ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด ๋‹จ๊ณ„๋“ค์€ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํƒœ์Šคํฌ๋ฅผ ํ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฝ์ž… ๋‹จ๊ณ„๋Š” 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๊ฐ€ ์ฐธ์—ฌํ•˜๋Š” ๋…ธ๋“œ ํŠธ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜, ๋ธŒ๋ผ์šฐ์ง• ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ๊ทธ ๋ฐ–์˜ ๋ฐฉ์‹์œผ๋กœ JavaScript๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์—ฐ๊ฒฐ ๊ด€๋ จ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ ๋…ธ๋“œ ๋ฌถ์Œ์„ ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด ์›์ž์ ์œผ๋กœ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ, ๋ชจ๋“  ์ฃผ์š” ๋ถ€์ˆ˜ ํšจ๊ณผ๋Š” ๋…ธ๋“œ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ๋ฌถ์Œ ์‚ฝ์ž…์ด ์™„๋ฃŒ๋œ ํ›„์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ถ”๊ฐ€ ์‚ฝ์ž…์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ์ „์— ๋Œ€๊ธฐ ์ค‘์ธ ๋ชจ๋“  ๋…ธ๋“œ ํŠธ๋ฆฌ ์‚ฝ์ž…์ด ์™„์ „ํžˆ ๋๋‚˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ช…์„ธ๋Š” ๋ชจ๋“  ๋˜๋Š” ์ผ๋ถ€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ž์‹ ๋ณ€๊ฒฝ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ์ธ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š์œผ๋ฉฐ ์‚ฝ์ž…, ์ œ๊ฑฐ, ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ๊ต์ฒด์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ node๋ฅผ ๋…ธ๋“œ parent ์•ˆ์— null ๋˜๋Š” ๋…ธ๋“œ child ์•ž์—, ์„ ํƒ์  ๋ถˆ๋ฆฌ์–ธ suppressObservers(๊ธฐ๋ณธ๊ฐ’ false)์™€ ํ•จ๊ป˜ ์‚ฝ์ž…ํ•˜๋ ค๋ฉด:

  1. node๊ฐ€ DocumentFragment ๋…ธ๋“œ์ด๋ฉด nodes๋ฅผ node์˜ ์ž์‹์œผ๋กœ ๋‘๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ยซ node ยป๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. count๋ฅผ nodes์˜ ํฌ๊ธฐ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. count๊ฐ€ 0์ด๋ฉด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. node๊ฐ€ DocumentFragment ๋…ธ๋“œ์ด๋ฉด:

    1. suppressObservers๋ฅผ true๋กœ ์„ค์ •ํ•˜์—ฌ ๊ทธ ์ž์‹์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    2. node์— ๋Œ€ํ•ด ยซ ยป, nodes, null, ๊ทธ๋ฆฌ๊ณ  null์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ ๋ณ€์ด ๋ ˆ์ฝ”๋“œ๋ฅผ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

      ์ด ๋‹จ๊ณ„๋Š” ์˜๋„์ ์œผ๋กœ suppressObservers๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  5. child๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ parent์ด๊ณ  ์‹œ์ž‘ ์˜คํ”„์…‹์ด child์˜ ์ธ๋ฑ์Šค๋ณด๋‹ค ํฐ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด: ๊ทธ ์‹œ์ž‘ ์˜คํ”„์…‹์„ count๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

    2. ๋ ๋…ธ๋“œ๊ฐ€ parent์ด๊ณ  ๋ ์˜คํ”„์…‹์ด child์˜ ์ธ๋ฑ์Šค๋ณด๋‹ค ํฐ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด: ๊ทธ ๋ ์˜คํ”„์…‹์„ count๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

  6. child๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด previousSibling์„ child์˜ ์ด์ „ ํ˜•์ œ๋กœ ๋‘๊ณ , child๊ฐ€ null์ด๋ฉด parent์˜ ๋งˆ์ง€๋ง‰ ์ž์‹์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  7. nodes์˜ ๊ฐ node์— ๋Œ€ํ•ด, ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ:

    1. node๋ฅผ parent์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋กœ ์ž…์–‘ํ•ฉ๋‹ˆ๋‹ค.

    2. child๊ฐ€ null์ด๋ฉด node๋ฅผ parent์˜ ์ž์‹์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, node๋ฅผ parent์˜ ์ž์‹์—์„œ child์˜ ์ธ๋ฑ์Šค ์•ž์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

    4. parent๊ฐ€ ์„€๋„ ํ˜ธ์ŠคํŠธ์ด๊ณ  ๊ทธ ์„€๋„ ๋ฃจํŠธ์˜ ์Šฌ๋กฏ ํ• ๋‹น์ด "named"์ด๋ฉฐ node๊ฐ€ ์Šฌ๋กฏ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์ด๋ฉด, node์— ์Šฌ๋กฏ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

    5. parent์˜ ๋ฃจํŠธ๊ฐ€ ์„€๋„ ๋ฃจํŠธ์ด๊ณ , parent๊ฐ€ ์Šฌ๋กฏ์ด๋ฉฐ ๊ทธ ํ• ๋‹น๋œ ๋…ธ๋“œ๊ฐ€ ๋นˆ ๋ชฉ๋ก์ด๋ฉด, parent์— ๋Œ€ํ•ด ์Šฌ๋กฏ ๋ณ€๊ฒฝ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

    6. node์˜ ๋ฃจํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ์— ์Šฌ๋กฏ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

    7. node์˜ ๊ฐ ์„€๋„๋ฅผ ํฌํ•จํ•˜๋Š” ํฌ๊ด„์  ์ž์† inclusiveDescendant์— ๋Œ€ํ•ด, ์„€๋„๋ฅผ ํฌํ•จํ•˜๋Š” ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ:

      1. inclusiveDescendant๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฝ์ž… ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      2. inclusiveDescendant๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

      3. inclusiveDescendant๊ฐ€ ์š”์†Œ์ด๊ณ  inclusiveDescendant์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

        1. inclusiveDescendant์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ๋ฒ”์œ„ ์ง€์ • ์—ฌ๋ถ€๊ฐ€ true์ด๋ฉด, inclusiveDescendant์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋ฅผ inclusiveDescendant์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ๋ฒ”์œ„ ์ง€์ • ๋ฌธ์„œ ์ง‘ํ•ฉ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

        2. inclusiveDescendant๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜์ด๋ฉด, inclusiveDescendant, ์ฝœ๋ฐฑ ์ด๋ฆ„ "connectedCallback", ๊ทธ๋ฆฌ๊ณ  ยซ ยป๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ฝœ๋ฐฑ ๋ฐ˜์‘์„ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

        3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, inclusiveDescendant๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

          ์ด ์ž‘์—…์ด inclusiveDescendant๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด, ๊ทธ connectedCallback์€ ์š”์†Œ ์—…๊ทธ๋ ˆ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘์— ์ž๋™์œผ๋กœ ํ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

      4. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  inclusiveDescendant๊ฐ€ ์„€๋„ ๋ฃจํŠธ์ด๊ณ , inclusiveDescendant์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉฐ, inclusiveDescendant์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ๋ฒ”์œ„ ์ง€์ • ์—ฌ๋ถ€๊ฐ€ true์ด๋ฉด, inclusiveDescendant์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋ฅผ inclusiveDescendant์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ๋ฒ”์œ„ ์ง€์ • ๋ฌธ์„œ ์ง‘ํ•ฉ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  8. suppressObservers๊ฐ€ false์ด๋ฉด, parent์— ๋Œ€ํ•ด nodes, ยซ ยป, previousSibling, ๊ทธ๋ฆฌ๊ณ  child๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ ๋ณ€์ด ๋ ˆ์ฝ”๋“œ๋ฅผ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

  9. parent์— ๋Œ€ํ•ด ์ž์‹ ๋ณ€๊ฒฝ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  10. staticNodeList๋ฅผ ์ฒ˜์Œ์—๋Š” ยซ ยป์ธ ๋ชฉ๋ก์ธ ๋…ธ๋“œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    ์šฐ๋ฆฌ๋Š” ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜๋ผ๋„ ์—ฐ๊ฒฐ ํ›„ ๋‹จ๊ณ„์— ์ „๋‹ฌํ•˜๊ธฐ ์ „์— ๋ชจ๋‘ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋™์•ˆ ์—ฐ๊ฒฐ ํ›„ ๋‹จ๊ณ„๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์—ฐ๊ฒฐ ํ›„ ๋‹จ๊ณ„๊ฐ€ ํŠธ๋ฆฌ์˜ ๊ตฌ์กฐ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด ์‹ค์‹œ๊ฐ„ ์ˆœํšŒ๋ฅผ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค๊ณ , ๊ฐ™์€ ๋…ธ๋“œ์— ๋Œ€ํ•ด ์—ฐ๊ฒฐ ํ›„ ๋‹จ๊ณ„๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  11. nodes์˜ ๊ฐ node์— ๋Œ€ํ•ด, ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ:

    1. node์˜ ๊ฐ ์„€๋„๋ฅผ ํฌํ•จํ•˜๋Š” ํฌ๊ด„์  ์ž์† inclusiveDescendant์— ๋Œ€ํ•ด, ์„€๋„๋ฅผ ํฌํ•จํ•˜๋Š” ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ: inclusiveDescendant๋ฅผ staticNodeList์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  12. staticNodeList์˜ ๊ฐ node์— ๋Œ€ํ•ด: node๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด, node๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ ํ›„ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ node๋ฅผ ๋…ธ๋“œ parent์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด: node๋ฅผ parent ์•ˆ์— null ์•ž์— ์‚ฌ์ „ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.


๋ช…์„ธ๋Š” ๋ชจ๋“  ๋˜๋Š” ์ผ๋ถ€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ด๋™ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ด๋™ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ๋…ธ๋“œ movedNode, ๋ถˆ๋ฆฌ์–ธ isSubtreeRoot, ๊ทธ๋ฆฌ๊ณ  ๋…ธ๋“œ oldAncestor๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์‚ฝ์ž… ๋‹จ๊ณ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์ด ๋‹จ๊ณ„๋“ค์€ movedNode๊ฐ€ ์ฐธ์—ฌํ•˜๋Š” ๋…ธ๋“œ ํŠธ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜, ๋ธŒ๋ผ์šฐ์ง• ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜, ๊ทธ ๋ฐ–์˜ ๋ฐฉ์‹์œผ๋กœ JavaScript๋ฅผ ์‹คํ–‰ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด ๋‹จ๊ณ„๋“ค์€ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํƒœ์Šคํฌ๋ฅผ ํ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ node๋ฅผ ๋…ธ๋“œ newParent ์•ˆ์— null ๋˜๋Š” ๋…ธ๋“œ child ์•ž์— ์ด๋™ํ•˜๋ ค๋ฉด:

  1. newParent์˜ ์„€๋„๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฃจํŠธ๊ฐ€ node์˜ ์„€๋„๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฃจํŠธ์™€ ๊ฐ™์ง€ ์•Š์œผ๋ฉด, "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

    ์ด๋Š” ์ด๋™์ด newParent์˜ ์—ฐ๊ฒฐ ์ƒํƒœ๊ฐ€ node์˜ ์—ฐ๊ฒฐ ์ƒํƒœ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋งŒ ์ˆ˜ํ–‰๋˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. node๊ฐ€ newParent์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ํฌ๊ด„์  ์กฐ์ƒ์ด๋ฉด, "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  3. child๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  ๊ทธ ๋ถ€๋ชจ๊ฐ€ newParent๊ฐ€ ์•„๋‹ˆ๋ฉด, "NotFoundError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  4. node๊ฐ€ Element ๋˜๋Š” CharacterData ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  5. node๊ฐ€ Text ๋…ธ๋“œ์ด๊ณ  newParent๊ฐ€ ๋ฌธ์„œ์ด๋ฉด, "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  6. newParent๊ฐ€ ๋ฌธ์„œ์ด๊ณ , node๊ฐ€ Element ๋…ธ๋“œ์ด๋ฉฐ, newParent์— ์š”์†Œ ์ž์‹์ด ์žˆ๊ฑฐ๋‚˜, child๊ฐ€ doctype์ด๊ฑฐ๋‚˜, ๋˜๋Š” child๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  doctype์ด child์˜ ๋’ค์— ์˜ค๋ฉด, "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  7. oldParent๋ฅผ node์˜ ๋ถ€๋ชจ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  8. ๋‹จ์–ธ: oldParent๋Š” null์ด ์•„๋‹™๋‹ˆ๋‹ค.

  9. node๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ผ์ด๋ธŒ ๋ฒ”์œ„ ์‚ฌ์ „ ์ œ๊ฑฐ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  10. ๋ฃจํŠธ์˜ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ node์˜ ๋…ธ๋“œ ๋ฌธ์„œ์ธ ๊ฐ NodeIterator ๊ฐ์ฒด iterator์— ๋Œ€ํ•ด: node์™€ iterator๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ NodeIterator ์‚ฌ์ „ ์ œ๊ฑฐ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  11. oldPreviousSibling์„ node์˜ ์ด์ „ ํ˜•์ œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  12. oldNextSibling์„ node์˜ ๋‹ค์Œ ํ˜•์ œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  13. oldParent์˜ ์ž์‹์—์„œ node๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  14. node๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ์œผ๋ฉด, node์˜ ํ• ๋‹น๋œ ์Šฌ๋กฏ์— ๋Œ€ํ•ด ์Šฌ๋กฏ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  15. oldParent์˜ ๋ฃจํŠธ๊ฐ€ ์„€๋„ ๋ฃจํŠธ์ด๊ณ , oldParent๊ฐ€ ์Šฌ๋กฏ์ด๋ฉฐ ๊ทธ ํ• ๋‹น๋œ ๋…ธ๋“œ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด, oldParent์— ๋Œ€ํ•ด ์Šฌ๋กฏ ๋ณ€๊ฒฝ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

  16. node์— ์Šฌ๋กฏ์ธ ํฌ๊ด„์  ์ž์†์ด ์žˆ์œผ๋ฉด:

    1. oldParent์˜ ๋ฃจํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ์— ์Šฌ๋กฏ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

    2. node๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ์— ์Šฌ๋กฏ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  17. node์™€ oldParent๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  18. child๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ newParent์ด๊ณ  ์‹œ์ž‘ ์˜คํ”„์…‹์ด child์˜ ์ธ๋ฑ์Šค๋ณด๋‹ค ํฐ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด: ๊ทธ ์‹œ์ž‘ ์˜คํ”„์…‹์„ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

    2. ๋ ๋…ธ๋“œ๊ฐ€ newParent์ด๊ณ  ๋ ์˜คํ”„์…‹์ด child์˜ ์ธ๋ฑ์Šค๋ณด๋‹ค ํฐ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด: ๊ทธ ๋ ์˜คํ”„์…‹์„ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

  19. child๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด newPreviousSibling์„ child์˜ ์ด์ „ ํ˜•์ œ๋กœ ๋‘๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด newParent์˜ ๋งˆ์ง€๋ง‰ ์ž์‹์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  20. child๊ฐ€ null์ด๋ฉด node๋ฅผ newParent์˜ ์ž์‹์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  21. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, node๋ฅผ newParent์˜ ์ž์‹์—์„œ child์˜ ์ธ๋ฑ์Šค ์•ž์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

  22. newParent๊ฐ€ ์„€๋„ ํ˜ธ์ŠคํŠธ์ด๊ณ  ๊ทธ ์„€๋„ ๋ฃจํŠธ์˜ ์Šฌ๋กฏ ํ• ๋‹น์ด "named"์ด๋ฉฐ node๊ฐ€ ์Šฌ๋กฏ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์ด๋ฉด, node์— ๋Œ€ํ•ด ์Šฌ๋กฏ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  23. newParent์˜ ๋ฃจํŠธ๊ฐ€ ์„€๋„ ๋ฃจํŠธ์ด๊ณ , newParent๊ฐ€ ์Šฌ๋กฏ์ด๋ฉฐ ๊ทธ ํ• ๋‹น๋œ ๋…ธ๋“œ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด, newParent์— ๋Œ€ํ•ด ์Šฌ๋กฏ ๋ณ€๊ฒฝ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

  24. node์˜ ๋ฃจํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ์— ์Šฌ๋กฏ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  25. node์˜ ๊ฐ ์„€๋„๋ฅผ ํฌํ•จํ•˜๋Š” ํฌ๊ด„์  ์ž์† inclusiveDescendant์— ๋Œ€ํ•ด, ์„€๋„๋ฅผ ํฌํ•จํ•˜๋Š” ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ:

    1. inclusiveDescendant๊ฐ€ node์ด๋ฉด isSubtreeRoot๋ฅผ true๋กœ ๋‘๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. inclusiveDescendant, isSubtreeRoot, ๊ทธ๋ฆฌ๊ณ  oldParent๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋™ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      ์ด๋™ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‚ฝ์ž… ๋ฐ ์ œ๊ฑฐ์™€ ๋ณ„๊ฐœ์˜ ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ด๋ฏ€๋กœ, inclusiveDescendant์— ๋Œ€ํ•ด ์‚ฝ์ž… ๋‹จ๊ณ„ ๋˜๋Š” ์ œ๊ฑฐ ๋‹จ๊ณ„๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    3. inclusiveDescendant๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜์ด๊ณ  newParent๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด, inclusiveDescendant, ์ฝœ๋ฐฑ ์ด๋ฆ„ "connectedMoveCallback", ๊ทธ๋ฆฌ๊ณ  ยซ ยป๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ฝœ๋ฐฑ ๋ฐ˜์‘์„ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

  26. oldParent์— ๋Œ€ํ•ด ยซ ยป, ยซ node ยป, oldPreviousSibling, ๊ทธ๋ฆฌ๊ณ  oldNextSibling์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ ๋ณ€์ด ๋ ˆ์ฝ”๋“œ๋ฅผ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

  27. newParent์— ๋Œ€ํ•ด ยซ node ยป, ยซ ยป, newPreviousSibling, ๊ทธ๋ฆฌ๊ณ  child๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ ๋ณ€์ด ๋ ˆ์ฝ”๋“œ๋ฅผ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.


๋…ธ๋“œ parent ์•ˆ์—์„œ ๋…ธ๋“œ child๋ฅผ ๋…ธ๋“œ node๋กœ ๊ต์ฒดํ•˜๋ ค๋ฉด:

  1. node, parent, child, ๊ทธ๋ฆฌ๊ณ  ยซ child ยป๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์‚ฌ์ „ ์‚ฝ์ž… ์œ ํšจ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  2. referenceChild๋ฅผ child์˜ ๋‹ค์Œ ํ˜•์ œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. referenceChild๊ฐ€ node์ด๋ฉด, referenceChild๋ฅผ node์˜ ๋‹ค์Œ ํ˜•์ œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. previousSibling์„ child์˜ ์ด์ „ ํ˜•์ œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. removedNodes๋ฅผ ๋นˆ ์ง‘ํ•ฉ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  6. node๋ฅผ parent์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋กœ ์ž…์–‘ํ•ฉ๋‹ˆ๋‹ค.

  7. child์˜ ๋ถ€๋ชจ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. removedNodes๋ฅผ ยซ child ยป๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. suppressObservers๋ฅผ true๋กœ ์„ค์ •ํ•˜์—ฌ child๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    ์œ„ ์กฐ๊ฑด์ด false์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” child๊ฐ€ node์ธ ๊ฒฝ์šฐ๋ฟ์ž…๋‹ˆ๋‹ค.

  8. node๊ฐ€ DocumentFragment ๋…ธ๋“œ์ด๋ฉด nodes๋ฅผ node์˜ ์ž์‹์œผ๋กœ ๋‘๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ยซ node ยป๋กœ ๋‘ก๋‹ˆ๋‹ค.

  9. suppressObservers๋ฅผ true๋กœ ์„ค์ •ํ•˜์—ฌ node๋ฅผ parent ์•ˆ์— referenceChild ์•ž์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

  10. parent์— ๋Œ€ํ•ด nodes, removedNodes, previousSibling, ๊ทธ๋ฆฌ๊ณ  referenceChild๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ ๋ณ€์ด ๋ ˆ์ฝ”๋“œ๋ฅผ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

  11. child๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ parent ์•ˆ์—์„œ ๋…ธ๋“œ ๋˜๋Š” null node๋กœ ๋ชจ๋‘ ๊ต์ฒดํ•˜๋ ค๋ฉด:

  1. removedNodes๋ฅผ parent์˜ ์ž์‹์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. addedNodes๋ฅผ ๋นˆ ์ง‘ํ•ฉ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. node๊ฐ€ DocumentFragment ๋…ธ๋“œ์ด๋ฉด, addedNodes๋ฅผ node์˜ ์ž์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  node๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, addedNodes๋ฅผ ยซ node ยป๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. suppressObservers๋ฅผ true๋กœ ์„ค์ •ํ•˜์—ฌ, parent์˜ ๋ชจ๋“  ์ž์‹์„ ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  6. node๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, suppressObservers๋ฅผ true๋กœ ์„ค์ •ํ•˜์—ฌ node๋ฅผ parent ์•ˆ์— null ์•ž์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

  7. addedNodes ๋˜๋Š” removedNodes ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋น„์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด, parent์— ๋Œ€ํ•ด addedNodes, removedNodes, null, ๊ทธ๋ฆฌ๊ณ  null์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ ๋ณ€์ด ๋ ˆ์ฝ”๋“œ๋ฅผ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋…ธ๋“œ ํŠธ๋ฆฌ ์ œ์•ฝ ์กฐ๊ฑด์— ๊ด€ํ•œ ์–ด๋– ํ•œ ๊ฒ€์‚ฌ๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…์„ธ ์ž‘์„ฑ์ž๋Š” ์ด๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๋…ธ๋“œ child๋ฅผ ๋…ธ๋“œ parent์—์„œ ์‚ฌ์ „ ์ œ๊ฑฐํ•˜๋ ค๋ฉด:

  1. child์˜ ๋ถ€๋ชจ๊ฐ€ parent๊ฐ€ ์•„๋‹ˆ๋ฉด, "NotFoundError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  2. child๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  3. child๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ช…์„ธ๋Š” ๋ชจ๋“  ๋˜๋Š” ์ผ๋ถ€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ œ๊ฑฐ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ œ๊ฑฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ๋…ธ๋“œ removedNode, ๋ถˆ๋ฆฌ์–ธ isSubtreeRoot, ๊ทธ๋ฆฌ๊ณ  ๋…ธ๋“œ oldAncestor๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ node๋ฅผ, ์„ ํƒ์  ๋ถˆ๋ฆฌ์–ธ suppressObservers(๊ธฐ๋ณธ๊ฐ’ false)์™€ ํ•จ๊ป˜ ์ œ๊ฑฐํ•˜๋ ค๋ฉด:

  1. parent๋ฅผ node์˜ ๋ถ€๋ชจ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. ๋‹จ์–ธ: parent๋Š” null์ด ์•„๋‹™๋‹ˆ๋‹ค.

  3. node๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ผ์ด๋ธŒ ๋ฒ”์œ„ ์‚ฌ์ „ ์ œ๊ฑฐ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ฃจํŠธ์˜ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ node์˜ ๋…ธ๋“œ ๋ฌธ์„œ์ธ ๊ฐ NodeIterator ๊ฐ์ฒด iterator์— ๋Œ€ํ•ด: node์™€ iterator๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ NodeIterator ์‚ฌ์ „ ์ œ๊ฑฐ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  5. oldPreviousSibling์„ node์˜ ์ด์ „ ํ˜•์ œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  6. oldNextSibling์„ node์˜ ๋‹ค์Œ ํ˜•์ œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  7. node๋ฅผ ๊ทธ parent์˜ ์ž์‹์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  8. node๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ์œผ๋ฉด, node์˜ ํ• ๋‹น๋œ ์Šฌ๋กฏ์— ๋Œ€ํ•ด ์Šฌ๋กฏ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  9. parent์˜ ๋ฃจํŠธ๊ฐ€ ์„€๋„ ๋ฃจํŠธ์ด๊ณ , parent๊ฐ€ ์Šฌ๋กฏ์ด๋ฉฐ ๊ทธ ํ• ๋‹น๋œ ๋…ธ๋“œ๊ฐ€ ๋นˆ ๋ชฉ๋ก์ด๋ฉด, parent์— ๋Œ€ํ•ด ์Šฌ๋กฏ ๋ณ€๊ฒฝ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

  10. node์— ์Šฌ๋กฏ์ธ ํฌ๊ด„์  ์ž์†์ด ์žˆ์œผ๋ฉด:

    1. parent์˜ ๋ฃจํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ์— ์Šฌ๋กฏ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

    2. node๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ์— ์Šฌ๋กฏ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  11. node, true, ๊ทธ๋ฆฌ๊ณ  parent๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๊ฑฐ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  12. isParentConnected๋ฅผ parent์˜ ์—ฐ๊ฒฐ ์ƒํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  13. node๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜์ด๊ณ  isParentConnected๊ฐ€ true์ด๋ฉด, node, ์ฝœ๋ฐฑ ์ด๋ฆ„ "disconnectedCallback", ๊ทธ๋ฆฌ๊ณ  ยซ ยป๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ฝœ๋ฐฑ ๋ฐ˜์‘์„ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

    ํ˜„์žฌ๋กœ์„œ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ์— parent๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์˜๋„๋œ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ํ•„์š”๊ฐ€ ์ƒ๊ธฐ๋ฉด ํ–ฅํ›„ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  14. node์˜ ๊ฐ ์„€๋„๋ฅผ ํฌํ•จํ•˜๋Š” ์ž์† descendant์— ๋Œ€ํ•ด, ์„€๋„๋ฅผ ํฌํ•จํ•˜๋Š” ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ:

    1. descendant, false, ๊ทธ๋ฆฌ๊ณ  parent๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๊ฑฐ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    2. descendant๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜์ด๊ณ  isParentConnected ๊ฐ€ true์ด๋ฉด, descendant, ์ฝœ๋ฐฑ ์ด๋ฆ„ "disconnectedCallback", ๊ทธ๋ฆฌ๊ณ  ยซ ยป๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ฝœ๋ฐฑ ๋ฐ˜์‘์„ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

  15. ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค ์ด๋•Œ node์™€ parent๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

  16. suppressObservers๊ฐ€ false์ด๋ฉด, 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์˜ ์ž์† ๋‚ด์—์„œ ID๊ฐ€ elementId์ธ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋…ธ๋“œ node์™€ ๋ฌธ์ž์—ด elementId๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ID๋กœ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” node์˜ ์ž์† ๋‚ด์—์„œ ID๊ฐ€ elementId์ธ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค; ๊ทธ๋ ‡์ง€ ์•Š๊ณ , ๊ทธ๋Ÿฌํ•œ ์š”์†Œ๊ฐ€ ์—†์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

getElementById(elementId) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” this์™€ elementId๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ID๋กœ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

4.2.5. ๋ฏน์Šค์ธ DocumentOrShadowRoot

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

documentOrShadowRoot์˜ CustomElementRegistry ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐ˜ํ™˜ํ•˜๊ณ ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

customElementRegistry getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. this๊ฐ€ ๋ฌธ์„œ์ด๋ฉด, this์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. Assert: this๋Š” ShadowRoot ๋…ธ๋“œ์ด๋‹ค.

  3. this์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

DocumentOrShadowRoot mixin์€ ๋ฌธ์„œ์™€ ์„€๋„ ๋ฃจํŠธ ์‚ฌ์ด์— ๊ณต์œ ๋˜๋Š” API๋ฅผ ์ •์˜ํ•˜๋ ค๋Š” ๋‹ค๋ฅธ ํ‘œ์ค€์—์„œ๋„ ์‚ฌ์šฉ๋  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€๋œ๋‹ค.

4.2.6. ๋ฏน์Šค์ธ ParentNode

๋ชฉ๋ก์ธ ๋…ธ๋“œ ๋ฐ ๋ฌธ์ž์—ด nodes์™€ ๋ฌธ์„œ document๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด:

  1. nodes์˜ ๊ฐ ๋ฌธ์ž์—ด์„ document์™€ ํ•ด๋‹น ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

  2. nodes์˜ ํฌ๊ธฐ๊ฐ€ 1์ด๋ฉด nodes[0]์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. fragment๋ฅผ document๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ฌธ์„œ ์กฐ๊ฐ์„ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. nodes์˜ ๊ฐ node์— ๋Œ€ํ•ด: node๋ฅผ fragment์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  5. fragment๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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)

nodes๋ฅผ node์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ์•ž์— ์‚ฝ์ž…ํ•˜๋ฉฐ, nodes์˜ ๋ฌธ์ž์—ด์€ ์ด์— ์ƒ์‘ํ•˜๋Š” Text ๋…ธ๋“œ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

๋˜์ง‘๋‹ˆ๋‹ค: ๋…ธ๋“œ ํŠธ๋ฆฌ์˜ ์ œ์•ฝ ์กฐ๊ฑด์ด ์œ„๋ฐ˜๋˜๋ฉด "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

node . append(nodes)

nodes๋ฅผ node์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋’ค์— ์‚ฝ์ž…ํ•˜๋ฉฐ, nodes์˜ ๋ฌธ์ž์—ด์€ ์ด์— ์ƒ์‘ํ•˜๋Š” Text ๋…ธ๋“œ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

๋˜์ง‘๋‹ˆ๋‹ค: ๋…ธ๋“œ ํŠธ๋ฆฌ์˜ ์ œ์•ฝ ์กฐ๊ฑด์ด ์œ„๋ฐ˜๋˜๋ฉด "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

node . replaceChildren(nodes)

node์˜ ๋ชจ๋“  ์ž์‹์„ nodes๋กœ ๊ต์ฒดํ•˜๋ฉฐ, nodes์˜ ๋ฌธ์ž์—ด์€ ์ด์— ์ƒ์‘ํ•˜๋Š” Text ๋…ธ๋“œ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

๋˜์ง‘๋‹ˆ๋‹ค: ๋…ธ๋“œ ํŠธ๋ฆฌ์˜ ์ œ์•ฝ ์กฐ๊ฑด์ด ์œ„๋ฐ˜๋˜๋ฉด "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

node . moveBefore(movedNode, child)

movedNode๋ฅผ ๋จผ์ € ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ , child๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด child ๋’ค์˜ node ์•ˆ์œผ๋กœ ์ด๋™ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด node์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋’ค๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” movedNode์™€ ์—ฐ๊ฒฐ๋œ ์ƒํƒœ๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.

๋˜์ง‘๋‹ˆ๋‹ค: ๋…ธ๋“œ ํŠธ๋ฆฌ์˜ ์ œ์•ฝ ์กฐ๊ฑด์ด ์œ„๋ฐ˜๋˜๊ฑฐ๋‚˜ ์ด๋™๋œ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ์ƒํƒœ๋ฅผ ๋ณด์กดํ•  ์ˆ˜ ์—†์œผ๋ฉด "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

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. node๋ฅผ nodes์™€ this์˜ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. node๋ฅผ this ์•ˆ์— this์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ์•ž์— ์‚ฌ์ „ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

append(nodes) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. node๋ฅผ nodes์™€ this์˜ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. node๋ฅผ this์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

replaceChildren(nodes) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. node๋ฅผ nodes์™€ this์˜ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. node, this, null, ๊ทธ๋ฆฌ๊ณ  this์˜ ์ž์‹์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์‚ฌ์ „ ์‚ฝ์ž… ์œ ํšจ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  3. this ์•ˆ์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์„ node๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

moveBefore(node, child) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. referenceChild๋ฅผ child๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. referenceChild๊ฐ€ node์ด๋ฉด, referenceChild๋ฅผ node์˜ ๋‹ค์Œ ํ˜•์ œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. node๋ฅผ this ์•ˆ์— referenceChild ์•ž์— ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

querySelector(selectors) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” selectors๋ฅผ this์— ๋Œ€ํ•ด ์„ ํƒ์ž ๋ฌธ์ž์—ด์„ ๋ฒ”์œ„ ์ผ์น˜์‹œํ‚จ ๊ฒฐ๊ณผ๊ฐ€ ๋นˆ ๋ชฉ๋ก์ด ์•„๋‹ˆ๋ฉด ๊ทธ ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

querySelectorAll(selectors) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” selectors๋ฅผ this์— ๋Œ€ํ•ด ์„ ํƒ์ž ๋ฌธ์ž์—ด์„ ๋ฒ”์œ„ ์ผ์น˜์‹œํ‚จ ์ •์  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

4.2.7. ๋ฏน์Šค์ธ NonDocumentTypeChildNode

์›น ํ˜ธํ™˜์„ฑ ๋•Œ๋ฌธ์— previousElementSibling ๋ฐ nextElementSibling ์†์„ฑ์€ 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)

nodes์˜ ๋ฌธ์ž์—ด์„ ์ด์— ์ƒ์‘ํ•˜๋Š” Text ๋…ธ๋“œ๋กœ ๊ต์ฒดํ•˜๋ฉด์„œ nodes๋ฅผ node ๋ฐ”๋กœ ์•ž์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

๋˜์ง‘๋‹ˆ๋‹ค: ๋…ธ๋“œ ํŠธ๋ฆฌ์˜ ์ œ์•ฝ ์กฐ๊ฑด์ด ์œ„๋ฐ˜๋˜๋ฉด "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

node . after(...nodes)

nodes์˜ ๋ฌธ์ž์—ด์„ ์ด์— ์ƒ์‘ํ•˜๋Š” Text ๋…ธ๋“œ๋กœ ๊ต์ฒดํ•˜๋ฉด์„œ nodes๋ฅผ node ๋ฐ”๋กœ ๋’ค์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

๋˜์ง‘๋‹ˆ๋‹ค: ๋…ธ๋“œ ํŠธ๋ฆฌ์˜ ์ œ์•ฝ ์กฐ๊ฑด์ด ์œ„๋ฐ˜๋˜๋ฉด "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

node . replaceWith(...nodes)

nodes์˜ ๋ฌธ์ž์—ด์„ ์ด์— ์ƒ์‘ํ•˜๋Š” Text ๋…ธ๋“œ๋กœ ๊ต์ฒดํ•˜๋ฉด์„œ node๋ฅผ nodes๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

๋˜์ง‘๋‹ˆ๋‹ค: ๋…ธ๋“œ ํŠธ๋ฆฌ์˜ ์ œ์•ฝ ์กฐ๊ฑด์ด ์œ„๋ฐ˜๋˜๋ฉด "HierarchyRequestError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

node . remove()
node๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

before(nodes) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. parent๋ฅผ this์˜ ๋ถ€๋ชจ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. parent๊ฐ€ null์ด๋ฉด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. viablePreviousSibling์„ this์˜ ์•ž์— ์˜ค๋Š” ํ˜•์ œ ์ค‘ nodes์— ํฌํ•จ๋˜์ง€ ์•Š์€ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์œผ๋กœ ๋‘๊ณ , ๊ทธ๋Ÿฌํ•œ ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. node๋ฅผ nodes์™€ this์˜ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. viablePreviousSibling์ด null์ด๋ฉด ์ด๋ฅผ parent์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹์œผ๋กœ ์„ค์ •ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด viablePreviousSibling์˜ ๋‹ค์Œ ํ˜•์ œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. node๋ฅผ parent ์•ˆ์— viablePreviousSibling ์•ž์— ์‚ฌ์ „ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

after(nodes) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. parent๋ฅผ this์˜ ๋ถ€๋ชจ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. parent๊ฐ€ null์ด๋ฉด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. viableNextSibling์„ this์˜ ๋’ค์— ์˜ค๋Š” ํ˜•์ œ ์ค‘ nodes์— ํฌํ•จ๋˜์ง€ ์•Š์€ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์œผ๋กœ ๋‘๊ณ , ๊ทธ๋Ÿฌํ•œ ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. node๋ฅผ nodes์™€ this์˜ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. node๋ฅผ parent ์•ˆ์— viableNextSibling ์•ž์— ์‚ฌ์ „ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

replaceWith(nodes) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. parent๋ฅผ this์˜ ๋ถ€๋ชจ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. parent๊ฐ€ null์ด๋ฉด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. viableNextSibling์„ this์˜ ๋’ค์— ์˜ค๋Š” ํ˜•์ œ ์ค‘ nodes์— ํฌํ•จ๋˜์ง€ ์•Š์€ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์œผ๋กœ ๋‘๊ณ , ๊ทธ๋Ÿฌํ•œ ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. node๋ฅผ nodes์™€ this์˜ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. this์˜ ๋ถ€๋ชจ๊ฐ€ parent์ด๋ฉด, parent ์•ˆ์—์„œ this๋ฅผ node๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

    this๊ฐ€ node ์•ˆ์— ์‚ฝ์ž…๋˜์—ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  6. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, node๋ฅผ parent ์•ˆ์— viableNextSibling ์•ž์— ์‚ฌ์ „ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

remove() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. this์˜ ๋ถ€๋ชจ๊ฐ€ null์ด๋ฉด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. this๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

4.2.9. ๋ฏน์Šค์ธ Slottable

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

assignedSlot getter ๋‹จ๊ณ„๋Š” find a slot์„ this์™€ true๋ฅผ ์ธ์ž๋กœ ํ•˜์—ฌ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

4.2.10. ๊ตฌ์‹ ์ปฌ๋ ‰์…˜: NodeList ๋ฐ HTMLCollection

์ปฌ๋ ‰์…˜์€ ๋…ธ๋“œ๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜์€ ๋ผ์ด๋ธŒ์ผ ์ˆ˜๋„ ์žˆ๊ณ , ์ •์ ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, ์ปฌ๋ ‰์…˜์€ ๋ผ์ด๋ธŒ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ปฌ๋ ‰์…˜์ด ๋ผ์ด๋ธŒ์ผ ๊ฒฝ์šฐ, ํ•ด๋‹น ๊ฐ์ฒด์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋Š” ๋ฐ์ดํ„ฐ์˜ ์Šค๋ƒ…์ƒท์ด ์•„๋‹Œ ์‹ค์ œ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ปฌ๋ ‰์…˜์ด ์ƒ์„ฑ๋  ๋•Œ, ํ•„ํ„ฐ์™€ ๋ฃจํŠธ๊ฐ€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์ปฌ๋ ‰์…˜ ์€ ํ•ด๋‹น ์ปฌ๋ ‰์…˜ ์˜ ๋ฃจํŠธ๋ฅผ ๋ฟŒ๋ฆฌ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋ทฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ , ์ฃผ์–ด์ง„ ํ•„ํ„ฐ์— ๋ถ€ํ•ฉํ•˜๋Š” ๋…ธ๋“œ๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ทฐ๋Š” ์„ ํ˜•์ ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋˜๋Š” ๊ตฌ์ฒด์  ์š”๊ตฌ์‚ฌํ•ญ์ด ์—†์œผ๋ฉด ์ปฌ๋ ‰์…˜ ๋‚ด์˜ ๋…ธ๋“œ๋“ค์€ ํŠธ๋ฆฌ ์ˆœ์„œ ๋กœ ์ •๋ ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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๋ถ€ํ„ฐ ์ปฌ๋ ‰์…˜์ด ๋‚˜ํƒ€๋‚ด๋Š” ๋…ธ๋“œ ์ˆ˜๋ณด๋‹ค ํ•˜๋‚˜ ์ž‘์€ ๊ฐ’๊นŒ์ง€์˜ ๋ฒ”์œ„์— ์žˆ๋Š” ์ˆซ์ž์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์š”์†Œ๊ฐ€ ์—†์œผ๋ฉด ์ง€์›๋˜๋Š” ์†์„ฑ ์ธ๋ฑ์Šค๋„ ์—†์Šต๋‹ˆ๋‹ค.

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]
์ปฌ๋ ‰์…˜์—์„œ ID ๋˜๋Š” ์ด๋ฆ„์ด name์ธ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ฐ์ฒด์˜ ์ง€์›๋˜๋Š” ์†์„ฑ ์ธ๋ฑ์Šค๋Š” ์ปฌ๋ ‰์…˜์ด ๋‚˜ํƒ€๋‚ด๋Š” ์š”์†Œ ์ˆ˜๋ณด๋‹ค ํ•˜๋‚˜ ์ž‘์€ ์ˆ˜๊นŒ์ง€์˜ 0๋ถ€ํ„ฐ์˜ ๋ฒ”์œ„์— ์žˆ๋Š” ์ˆซ์ž์ด๋‹ค. ๊ทธ๋Ÿฌํ•œ ์š”์†Œ๊ฐ€ ์—†์œผ๋ฉด, ์ง€์›๋˜๋Š” ์†์„ฑ ์ธ๋ฑ์Šค๋„ ์—†๋‹ค.

length getter ๋‹จ๊ณ„๋Š” ์ปฌ๋ ‰์…˜์ด ๋‚˜ํƒ€๋‚ด๋Š” ๋…ธ๋“œ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

item(index) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ์ปฌ๋ ‰์…˜ ์•ˆ์˜ index๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ปฌ๋ ‰์…˜ ์•ˆ์— index๋ฒˆ์งธ ์š”์†Œ๊ฐ€ ์—†์œผ๋ฉด, ๋ฉ”์„œ๋“œ๋Š” null์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

์ง€์›๋˜๋Š” ์†์„ฑ ์ด๋ฆ„์€ ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชฉ๋ก์˜ ๊ฐ’์ด๋‹ค:

  1. result๋ฅผ ๋นˆ ๋ชฉ๋ก์œผ๋กœ ํ•œ๋‹ค.

  2. ์ปฌ๋ ‰์…˜์ด ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ element์— ๋Œ€ํ•ด, ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ:

    1. element๊ฐ€ result ์•ˆ์— ์—†๋Š” ID๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด, element์˜ ID๋ฅผ result์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    2. element๊ฐ€ HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•ˆ์— ์žˆ๊ณ , ๋นˆ ๋ฌธ์ž์—ด๋„ ์•„๋‹ˆ๊ณ  result ์•ˆ์—๋„ ์—†๋Š” ๊ฐ’์„ ๊ฐ€์ง„ name ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด, element์˜ name ์†์„ฑ ๊ฐ’์„ result์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  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 ๊ฐ์ฒด)๋„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ดˆ๊ธฐ๊ฐ’์€ ๋นˆ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

๊ฐ ์œ ์‚ฌ ์ถœ์ฒ˜ ์ฐฝ ์—์ด์ „ํŠธ์—๋„ ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž ์นด์šดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ดˆ๊นƒ๊ฐ’์ด 0์ธ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž์—๊ฒŒ ์•Œ๋ฆฝ๋‹ˆ๋‹ค:

  1. ๋‹ค์Œ ์ฃผ๋ณ€ ์—์ด์ „ํŠธ์˜ ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ์— ์ถ”๊ฐ€๋จ์„ false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. notifyList๋ฅผ ์ •๋ ฌํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ ์ฃผ๋ณ€ ์—์ด์ „ํŠธ์˜ ๋Œ€๊ธฐ ์ค‘์ธ ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž์ด๋ฉฐ, ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. a๊ฐ€ b๋ณด๋‹ค ์ž‘๋‹ค๋Š” ๊ฒƒ์€ a์˜ ์ƒ์„ฑ ์ธ๋ฑ์Šค๊ฐ€ b์˜ ์ƒ์„ฑ ์ธ๋ฑ์Šค๋ณด๋‹ค ์ž‘๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

  3. ๋น„์›๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ ์ฃผ๋ณ€ ์—์ด์ „ํŠธ์˜ ๋Œ€๊ธฐ ์ค‘์ธ ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

  4. signalSet์„ ๋ณต์ œ๋ณธ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ ์ฃผ๋ณ€ ์—์ด์ „ํŠธ์˜ ์‹ ํ˜ธ ์Šฌ๋กฏ์ž…๋‹ˆ๋‹ค.

  5. ๋น„์›๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ ์ฃผ๋ณ€ ์—์ด์ „ํŠธ์˜ ์‹ ํ˜ธ ์Šฌ๋กฏ์ž…๋‹ˆ๋‹ค.

  6. ๊ฐ๊ฐ์— ๋Œ€ํ•ด notifyList์˜ mo๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

    1. records๋ฅผ ๋ณต์ œ๋ณธ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณต์ œ ๋Œ€์ƒ์€ mo์˜ ๋ ˆ์ฝ”๋“œ ํ์ž…๋‹ˆ๋‹ค.

    2. ๋น„์›๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ mo์˜ ๋ ˆ์ฝ”๋“œ ํ์ž…๋‹ˆ๋‹ค.

    3. ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ mo์ž…๋‹ˆ๋‹ค.

    4. records๊ฐ€ ๋น„์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด, ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. mo์˜ ์ฝœ๋ฐฑ์— ยซ records, mo ยป๋ฅผ ์ „๋‹ฌํ•˜๊ณ  "report"์™€ ํ•จ๊ป˜, ์ฝœ๋ฐฑ this ๊ฐ’์„ mo๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. ๊ฐ๊ฐ์— ๋Œ€ํ•ด signalSet์˜ slot์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ์ด๋ฆ„์€ slotchange์ด๋ฉฐ, bubbles ์†์„ฑ์„ true๋กœ ์„ค์ •ํ•˜๊ณ , slot์—์„œ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.


๊ฐ ๋…ธ๋“œ์—๋Š” ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ๋ชฉ๋ก์ด ์žˆ์œผ๋ฉฐ(0๊ฐœ ์ด์ƒ์˜ ๋ชฉ๋ก์œผ๋กœ, ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค), ์ดˆ๊ธฐ์—๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๋Š” ๊ด€์ฐฐ์ž(MutationObserver ๊ฐ์ฒด)์™€ ์˜ต์…˜(MutationObserverInit ์‚ฌ์ „)์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๋Š” ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž์ด๋ฉฐ, ์ถ”๊ฐ€๋กœ ์›๋ณธ(๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ์ค‘ ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๊ฐ€ ์•„๋‹Œ ๊ฒƒ)๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๋Š” ํŠน์ • ๋…ธ๋“œ์˜ ์ž์†์—์„œ ๋…ธ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๊ฑฐ๋‚˜ ์ด๋™๋œ ํ›„์—๋„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด subtree๊ฐ€ ๋…ธ๋“œ์˜ ์ด์ „ ๋ถ€๋ชจ์—์„œ true๋กœ ์„ค์ •๋˜์—ˆ์„ ๋•Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ˆ„๋ฝ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ด€์ฐฐ์ž๋Š” ๋‹ค์Œ์— ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž์—๊ฒŒ ์•Œ๋ฆด ๋•Œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ node์™€ ๋…ธ๋“œ parent๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด:

  1. parent์˜ ๊ฐ ํฌ๊ด„์  ์กฐ์ƒ inclusiveAncestor์— ๋Œ€ํ•ด, ์ด์–ด์„œ ๊ฐ๊ฐ์— ๋Œ€ํ•ด registered๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ inclusiveAncestor์˜ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค:

    1. registered์˜ ์˜ต์…˜["subtree"]๊ฐ€ false์ด๋ฉด, ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

    2. observer๋ฅผ registered์˜ ๊ด€์ฐฐ์ž๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. registered๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๋ผ๋ฉด ์›๋ณธ์„ source๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น registered๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด registered ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    4. node์˜ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ๋ชฉ๋ก์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž์˜ ์›๋ณธ์ด source๋ผ๋ฉด ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

    5. ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž์˜ ๊ด€์ฐฐ์ž๋Š” observer, ์˜ต์…˜์€ source์˜ ์˜ต์…˜, ์›๋ณธ์€ source์ด๋ฉฐ, node์˜ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    6. ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. node์— ๋Œ€ํ•œ ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ observer์˜ ์ผ์‹œ์  ๋…ธ๋“œ ์ง‘ํ•ฉ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    7. ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. observer๋ฅผ ์ฃผ๋ณ€ ์—์ด์ „ํŠธ์˜ ๋Œ€๊ธฐ ์ค‘์ธ ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      ์ด๋ฅผ ํ†ตํ•ด node์˜ ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๊ฐ€ ์ œ๊ฑฐ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์— ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž์—๊ฒŒ ์•Œ๋ฆด ๋•Œ, MutationRecord ๊ฐ์ฒด๊ฐ€ ํ์— ์ถ”๊ฐ€๋˜์ง€ ์•Š๋”๋ผ๋„ observer์— ๋Œ€ํ•ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

    8. ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

MutationObserver ๊ฐ์ฒด observer์— ๋Œ€ํ•ด ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด:

  1. ๊ฐ๊ฐ์— ๋Œ€ํ•ด observer์˜ ์ผ์‹œ์  ๋…ธ๋“œ ์ง‘ํ•ฉ์— ์žˆ๋Š” ๊ฐ node์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ์ค‘ ๊ด€์ฐฐ์ž๊ฐ€ observer์ธ ํ•ญ๋ชฉ์„ node์˜ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ๋ชฉ๋ก์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  2. ๋น„์›๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ observer์˜ ์ผ์‹œ์  ๋…ธ๋“œ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

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 ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ด€๋ จ ๊ฐœ๋…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ƒ์„ฑ ์‹œ ์„ค์ •๋˜๋Š” ์ฝœ๋ฐฑ์ž…๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ ์‹œ ์„ค์ •๋˜๋Š” ์ƒ์„ฑ ์ธ๋ฑ์Šค(์ˆซ์ž)์ž…๋‹ˆ๋‹ค.
  • ๋…ธ๋“œ ๋ชฉ๋ก(์•ฝํ•œ ์ฐธ์กฐ์˜ ๋ชฉ๋ก์ด๋ฉฐ, ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค)์€ ์ดˆ๊ธฐ์—๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ์‹œ์  ๋…ธ๋“œ ์ง‘ํ•ฉ(์•ฝํ•œ ์ฐธ์กฐ์˜ ์ง‘ํ•ฉ์ด๋ฉฐ, ๋‹ค์Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ)์ด๋ฉฐ, ์ดˆ๊ธฐ์—๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ ˆ์ฝ”๋“œ ํ(0๊ฐœ ์ด์ƒ์˜ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๋Š” ํ์ด๋ฉฐ, ๋‹ค์Œ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. MutationRecord ๊ฐ์ฒด)์ด๋ฉฐ, ์ดˆ๊ธฐ์—๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
observer = new MutationObserver(callback)
MutationObserver ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ฝœ๋ฐฑ์„ callback์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. callback์€ MutationRecord ๊ฐ์ฒด์˜ ๋ชฉ๋ก์„ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ, ์ƒ์„ฑ๋œ MutationObserver ๊ฐ์ฒด๋ฅผ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋ฐ›์•„ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด ์ฝœ๋ฐฑ์€ ๋…ธ๋“œ๊ฐ€ observe() ๋ฉ”์„œ๋“œ๋กœ ๋“ฑ๋ก๋œ ํ›„ ๋ณ€๊ฒฝ๋˜๋ฉด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
observer . observe(target, options)
์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์— ์ง€์ •๋œ target์„ ๊ด€์ฐฐํ•˜๊ณ  (๋…ธ๋“œ) ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณด๊ณ ํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ณด๊ณ  ๊ธฐ์ค€์€ options(๊ฐ์ฒด)๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

options ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด ๋ฉค๋ฒ„๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๊ด€์ฐฐ ์˜ต์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด ๋ฉค๋ฒ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

childList
target์˜ ์ž์‹์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€์ฐฐํ•˜๋ ค๋ฉด true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
attributes
target์˜ ์†์„ฑ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€์ฐฐํ•˜๋ ค๋ฉด true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ•ญ๋ชฉ์„ ์ง€์ •ํ•œ ๊ฒฝ์šฐ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. attributeOldValue ๋˜๋Š” attributeFilter๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
characterData
target์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€์ฐฐํ•˜๋ ค๋ฉด true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ•ญ๋ชฉ์ด ์ง€์ •๋œ ๊ฒฝ์šฐ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. characterDataOldValue๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
subtree
target๋ฟ๋งŒ ์•„๋‹ˆ๋ผ target์˜ ์ž์†์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋„ ๊ด€์ฐฐํ•˜๋ ค๋ฉด true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
attributeOldValue
๋‹ค์Œ ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋ฉด true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. attributes๊ฐ€ true์ด๊ฑฐ๋‚˜ ์ƒ๋žต๋˜์—ˆ์œผ๋ฉฐ, target์˜ ์†์„ฑ ๊ฐ’์„ ๋ณ€๊ฒฝ ์ „์— ๊ธฐ๋กํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
characterDataOldValue
๋‹ค์Œ ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋ฉด true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. characterData๊ฐ€ true๋กœ ์„ค์ •๋˜๊ฑฐ๋‚˜ ์ƒ๋žต๋˜์—ˆ์œผ๋ฉฐ, target์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝ ์ „์— ๊ธฐ๋กํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
attributeFilter
์†์„ฑ์˜ ๋กœ์ปฌ ์ด๋ฆ„ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค(๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ œ์™ธ). ๋ชจ๋“  ์†์„ฑ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€์ฐฐํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  attributes๊ฐ€ true์ด๊ฑฐ๋‚˜ ์ƒ๋žต๋œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
observer . disconnect()
observer๊ฐ€ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€์ฐฐํ•˜์ง€ ์•Š๋„๋ก ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. observe() ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ๋•Œ๊นŒ์ง€ observer์˜ ์ฝœ๋ฐฑ์€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
observer . takeRecords()
๋ ˆ์ฝ”๋“œ ํ๋ฅผ ๋น„์šฐ๊ณ  ํ์— ์žˆ๋˜ ๋‚ด์šฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

new MutationObserver(callback) ์ƒ์„ฑ์ž์˜ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. this์˜ ์ฝœ๋ฐฑ์„ callback์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. this์˜ ์ƒ์„ฑ ์ธ๋ฑ์Šค๋ฅผ this์˜ ๊ด€๋ จ ์—์ด์ „ํŠธ์˜ ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž ์นด์šดํ„ฐ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. this์˜ ๊ด€๋ จ ์—์ด์ „ํŠธ์˜ ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž ์นด์šดํ„ฐ๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

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์ž…๋‹ˆ๋‹ค.

  4. options["attributeOldValue"]๊ฐ€ true์ด๊ณ  options["attributes"]๊ฐ€ false์ด๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค. TypeError์ž…๋‹ˆ๋‹ค.

  5. options["attributeFilter"]๊ฐ€ ์กด์žฌํ•˜๊ณ , options["attributes"]๊ฐ€ false์ด๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค. TypeError์ž…๋‹ˆ๋‹ค.

  6. options["characterDataOldValue"]๊ฐ€ true์ด๊ณ  options["characterData"]๊ฐ€ false์ด๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค. TypeError์ž…๋‹ˆ๋‹ค.

  7. registered๋ฅผ target์˜ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ๋ชฉ๋ก์— ์žˆ์œผ๋ฉฐ, ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๊ฐ€ ์•„๋‹ˆ๊ณ  ๊ด€์ฐฐ์ž๊ฐ€ this์ธ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    target์ด this๊ฐ€ ๊ด€์ฐฐํ•˜๋Š” ํ•˜์œ„ ํŠธ๋ฆฌ์— ์žˆ์—ˆ๊ณ  ์ œ๊ฑฐ๋˜๊ฑฐ๋‚˜ ์ด๋™๋˜์—ˆ๋‹ค๋ฉด, target์˜ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ๋ชฉ๋ก์—๋„ ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋“ค์˜ ๊ด€์ฐฐ์ž๋Š” this์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•ญ๋ชฉ์€ ๋‹ค์Œ์— ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž์—๊ฒŒ ์•Œ๋ฆด ๋•Œ ์ œ๊ฑฐ๋˜๋ฏ€๋กœ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

  8. registered๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. ๊ฐ๊ฐ์— ๋Œ€ํ•ด this์˜ ์ผ์‹œ์  ๋…ธ๋“œ ์ง‘ํ•ฉ์— ์žˆ๋Š” ๊ฐ node์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ์ค‘ ์›๋ณธ์ด registered์ธ ํ•ญ๋ชฉ์„ node์˜ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ๋ชฉ๋ก์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    2. registered์˜ ์˜ต์…˜์„ options๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  9. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

    1. ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž์˜ ๊ด€์ฐฐ์ž๋Š” this์ด๊ณ  ์˜ต์…˜์€ options์ด๋ฉฐ, target์˜ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    2. ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. target์— ๋Œ€ํ•œ ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ this์˜ ๋…ธ๋“œ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

disconnect() ๋ฉ”์„œ๋“œ์˜ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๊ฐ๊ฐ์— ๋Œ€ํ•ด this์˜ ๋…ธ๋“œ ๋ชฉ๋ก์— ์žˆ๋Š” ๊ฐ node์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ์ค‘ node์˜ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ๋ชฉ๋ก์—์„œ this๊ฐ€ ๊ด€์ฐฐ์ž์ธ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  2. ์ผ์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ž…๋‹ˆ๋‹ค.

  3. ๋น„์›๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์˜ ๋…ธ๋“œ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

  4. ๋น„์›๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์˜ ๋ ˆ์ฝ”๋“œ ํ์ž…๋‹ˆ๋‹ค.

takeRecords() ๋ฉ”์„œ๋“œ์˜ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. records๋ฅผ ๋ณต์ œ๋ณธ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์˜ ๋ ˆ์ฝ”๋“œ ํ์ž…๋‹ˆ๋‹ค.

  2. ๋น„์›๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์˜ ๋ ˆ์ฝ”๋“œ ํ์ž…๋‹ˆ๋‹ค.

  3. records๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

4.3.2. ๋ณ€์ด ๋ ˆ์ฝ”๋“œ ํ์ž‰

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ ๋ ˆ์ฝ”๋“œ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. type์„ ์œ ํ˜•์œผ๋กœ, target์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋ฉฐ name, namespace, oldValue, addedNodes, removedNodes, previousSibling, nextSibling์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค:

  1. interestedObservers๋ฅผ ๋นˆ ๋งต์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. nodes๋ฅผ target์˜ ํฌ๊ด„์  ์กฐ์ƒ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. nodes์˜ ๊ฐ node์— ๋Œ€ํ•ด, ์ด์–ด์„œ ๊ฐ๊ฐ์— ๋Œ€ํ•ด node์˜ ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ๋ชฉ๋ก์— ์žˆ๋Š” registered๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

    1. options๋ฅผ registered์˜ ์˜ต์…˜์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. ๋‹ค์Œ ์กฐ๊ฑด ์ค‘ ์–ด๋А ๊ฒƒ๋„ ์ฐธ์ด ์•„๋‹ˆ๋ฉด

      ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

      1. mo๋ฅผ registered์˜ ๊ด€์ฐฐ์ž๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. interestedObservers[mo]๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด, interestedObservers[mo]๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ null์ž…๋‹ˆ๋‹ค.

      3. type์ด "attributes"์ด๊ณ  options["attributeOldValue"]๊ฐ€ true์ด๊ฑฐ๋‚˜, type์ด "characterData"์ด๊ณ  options["characterDataOldValue"]๊ฐ€ true์ด๋ฉด, interestedObservers[mo]๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ oldValue์ž…๋‹ˆ๋‹ค.

  4. interestedObservers๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด, ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. ๊ฐ๊ฐ์— ๋Œ€ํ•ด interestedObservers์˜ observer โ†’ mappedOldValue๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

    1. record๋ฅผ ์ƒˆ๋กœ์šด MutationRecord ๊ฐ์ฒด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด์˜ type์€ type์œผ๋กœ, target์€ target์œผ๋กœ, attributeName์€ name์œผ๋กœ, attributeNamespace๋Š” namespace๋กœ, oldValue๋Š” mappedOldValue๋กœ, addedNodes๋Š” addedNodes๋กœ, removedNodes๋Š” removedNodes๋กœ, previousSibling์€ previousSibling์œผ๋กœ, ๊ทธ๋ฆฌ๊ณ  nextSibling์€ nextSibling์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. record๋ฅผ observer์˜ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ ๋ ˆ์ฝ”๋“œ ํ์ž…๋‹ˆ๋‹ค.

    3. observer๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ ์ฃผ๋ณ€ ์—์ด์ „ํŠธ์˜ ๋Œ€๊ธฐ ์ค‘์ธ ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž์ž…๋‹ˆ๋‹ค.

  6. ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ ๊ตฌ์กฐ ๋ณ€์ด ๋ ˆ์ฝ”๋“œ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•˜๋‹ค๋ฅผ 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"๋Š” ์†์„ฑ ๋ณ€๊ฒฝ์ผ ๋•Œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. "characterData"๋Š” CharacterData ๋…ธ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "childList"๋Š” ํŠธ๋ฆฌ์— ์†ํ•œ ๋…ธ๋“œ์˜ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
record . target
๋ณ€๊ฒฝ์˜ ์˜ํ–ฅ์„ ๋ฐ›์€ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๊ฐ’์€ ๋ณ€๊ฒฝ ์œ ํ˜•์ธ type์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. "attributes"์ธ ๊ฒฝ์šฐ์—๋Š” ์š”์†Œ์ด๋ฉฐ, ํ•ด๋‹น ์š”์†Œ์˜ ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ "characterData"์ธ ๊ฒฝ์šฐ์—๋Š” CharacterData ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "childList"์ธ ๊ฒฝ์šฐ์—๋Š” ๋…ธ๋“œ์ด๋ฉฐ, ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ž์‹์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
record . addedNodes
record . removedNodes
์ถ”๊ฐ€๋œ ๋…ธ๋“œ์™€ ์ œ๊ฑฐ๋œ ๋…ธ๋“œ๋ฅผ ๊ฐ๊ฐ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
record . previousSibling
record . nextSibling
๊ฐ๊ฐ ์ด์ „ ํ˜•์ œ ๋…ธ๋“œ์™€ ๋‹ค์Œ ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์ด๋Š” ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋œ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋Š” null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
record . attributeName
๋ณ€๊ฒฝ๋œ ์†์„ฑ์˜ ๋กœ์ปฌ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ํ•ด๋‹น ์†์„ฑ์ด ์—†์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
record . attributeNamespace
๋ณ€๊ฒฝ๋œ ์†์„ฑ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ํ•ด๋‹น ์†์„ฑ์ด ์—†์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
record . oldValue
๋ฐ˜ํ™˜๊ฐ’์€ type์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ, "attributes"์˜ ๊ฒฝ์šฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณ€๊ฒฝ๋œ ์†์„ฑ์˜ ๋ณ€๊ฒฝ ์ „ ๊ฐ’์ž…๋‹ˆ๋‹ค. "characterData"์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์ด๋Š” ๋ณ€๊ฒฝ๋œ ๋…ธ๋“œ์˜ ๋ณ€๊ฒฝ ์ „ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "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๋Š” ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ ๋…ธ๋“œ์—๋Š” ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ƒ์„ฑ ์‹œ ์„ค์ •๋˜๊ณ  ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋Š” ์ž…์–‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๊ฐ€์ ธ์˜ค๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ event๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๋…ธ๋“œ๊ฐ€ ํ• ๋‹น๋œ ๊ฒฝ์šฐ ๋…ธ๋“œ์˜ ํ• ๋‹น๋œ ์Šฌ๋กฏ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ๋…ธ๋“œ์—๋Š” ๋“ฑ๋ก๋œ ๊ด€์ฐฐ์ž ๋ชฉ๋ก๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค interface๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด, ๋ฌธ์„œ document๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹จ์–ธ: interface๋Š” Document๋„ ์•„๋‹ˆ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋„ ์•„๋‹™๋‹ˆ๋‹ค: ์ƒ์† ๋Œ€์ƒ์ด Document์ธ ์ธํ„ฐํŽ˜์ด์Šค. ์ƒˆ ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋ฌธ์„œ ์ƒ์„ฑ์„ ๋Œ€์‹  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  2. ์ƒˆ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋…ธ๋“œ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ์ด interface์ด๋ฉฐ, document์˜ ๊ด€๋ จ ๋ ๋ฆ„์— ์žˆ๊ณ , ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ document๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


node . nodeType

node์˜ ์œ ํ˜•์— ํ•ด๋‹นํ•˜๋Š” ์ˆซ์ž๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Element
Node . ELEMENT_NODE (1).
Attr
Node . ATTRIBUTE_NODE (2).
๋ฐฐํƒ€์  Text ๋…ธ๋“œ
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 ๋Œ€๋ฌธ์žํ™”๋œ ํ•œ์ • ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
Attr
ํ•ด๋‹น ์†์„ฑ์˜ ํ•œ์ • ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
๋ฐฐํƒ€์  Text ๋…ธ๋“œ
"#text"์ž…๋‹ˆ๋‹ค.
CDATASection
"#cdata-section"์ž…๋‹ˆ๋‹ค.
ProcessingInstruction
ํ•ด๋‹น ์ฒ˜๋ฆฌ ๋ช…๋ น์˜ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค.
Comment
"#comment"์ž…๋‹ˆ๋‹ค.
Document
"#document"์ž…๋‹ˆ๋‹ค.
DocumentType
ํ•ด๋‹น ๋ฌธ์„œ ์œ ํ˜•์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
DocumentFragment
"#document-fragment"์ž…๋‹ˆ๋‹ค.

nodeType ๊ฒŒํ„ฐ ๋‹จ๊ณ„์—์„œ๋Š” this๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ๋ถ„๊ธฐํ•˜์—ฌ ์ฒ˜์Œ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Element
ELEMENT_NODE (1)
Attr
ATTRIBUTE_NODE (2);
๋ฐฐํƒ€์  Text ๋…ธ๋“œ
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 ๊ฒŒํ„ฐ ๋‹จ๊ณ„์—์„œ๋Š” this๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ๋ถ„๊ธฐํ•˜์—ฌ ์ฒ˜์Œ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Element
ํ•ด๋‹น ์š”์†Œ์˜ HTML ๋Œ€๋ฌธ์žํ™”๋œ ํ•œ์ • ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
Attr
ํ•ด๋‹น ์†์„ฑ์˜ ํ•œ์ • ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
๋ฐฐํƒ€์  Text ๋…ธ๋“œ
"#text"์ž…๋‹ˆ๋‹ค.
CDATASection
"#cdata-section"์ž…๋‹ˆ๋‹ค.
ProcessingInstruction
ํ•ด๋‹น ์ฒ˜๋ฆฌ ๋ช…๋ น์˜ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค.
Comment
"#comment"์ž…๋‹ˆ๋‹ค.
Document
"#document"์ž…๋‹ˆ๋‹ค.
DocumentType
ํ•ด๋‹น ๋ฌธ์„œ ์œ ํ˜•์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
DocumentFragment
"#document-fragment"์ž…๋‹ˆ๋‹ค.

node . baseURI
node์˜ ๋…ธ๋“œ ๋ฌธ์„œ์˜ ๊ธฐ์ค€ URL์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

The baseURI getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. baseURL์„ this์˜ ๋…ธ๋“œ ๋ฌธ์„œ์˜ ๊ธฐ์ค€ URL ๊ฐ€์ ธ์˜ค๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. baseURL์ด null์ด๋ฉด baseURL์„ this์˜ ๋…ธ๋“œ ๋ฌธ์„œ์˜ URL๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. baseURL์„ ์ง๋ ฌํ™”ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


node . isConnected

node๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

node . ownerDocument
๋…ธ๋“œ ๋ฌธ์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ์— ๋Œ€ํ•ด์„œ๋Š” null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
node . getRootNode()
node์˜ ๋ฃจํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
node . getRootNode({ composed:true })
node์˜ ์„€๋„๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฃจํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
node . parentNode
๋ถ€๋ชจ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
node . parentElement
๋ถ€๋ชจ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
node . hasChildNodes()
node์— ์ž์‹์ด ์žˆ๋Š”์ง€ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
node . childNodes
์ž์‹์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
node . firstChild
์ฒซ ๋ฒˆ์งธ ์ž์‹์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
node . lastChild
๋งˆ์ง€๋ง‰ ์ž์‹์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
node . previousSibling
์ด์ „ ํ˜•์ œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
node . nextSibling
๋‹ค์Œ ํ˜•์ œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

isConnected getter ๋‹จ๊ณ„๋Š” this๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด true๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ownerDocument getter ๋‹จ๊ณ„๋Š” this๊ฐ€ ๋ฌธ์„œ์ด๋ฉด null์„, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด this์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌธ์„œ์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋Š” ํ•ด๋‹น ๋ฌธ์„œ ์ž์ฒด์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋…ธ๋“œ์—๋Š” ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ ํ•ญ์ƒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

getRootNode(options) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” options["composed"] ๊ฐ€ true์ด๋ฉด this์˜ ์„€๋„๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฃจํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด this์˜ ๋ฃจํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

parentNode getter ๋‹จ๊ณ„๋Š” this์˜ ๋ถ€๋ชจ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

parentElement getter ๋‹จ๊ณ„๋Š” this์˜ ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

hasChildNodes() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” this์— ์ž์‹์ด ์žˆ์œผ๋ฉด true๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

childNodes getter ๋‹จ๊ณ„๋Š” this๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๋ฉฐ ์ž์‹๋งŒ ์ผ์น˜์‹œํ‚ค๋Š” NodeList๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

firstChild getter ๋‹จ๊ณ„๋Š” this์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

lastChild getter ๋‹จ๊ณ„๋Š” this์˜ ๋งˆ์ง€๋ง‰ ์ž์‹์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

previousSibling getter ๋‹จ๊ณ„๋Š” this์˜ ์ด์ „ ํ˜•์ œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

nextSibling getter ๋‹จ๊ณ„๋Š” this์˜ ๋‹ค์Œ ํ˜•์ œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


nodeValue getter ๋‹จ๊ณ„๋Š” this๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ๋‹ค์Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Attr
this์˜ ๊ฐ’.
CharacterData
this์˜ ๋ฐ์ดํ„ฐ.
๊ทธ ๋ฐ–์˜ ๊ฒฝ์šฐ
Null.

nodeValue setter ๋‹จ๊ณ„๋Š” ์ฃผ์–ด์ง„ ๊ฐ’์ด null์ด๋ฉด ๋Œ€์‹  ๋นˆ ๋ฌธ์ž์—ด์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ, this๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Attr

๊ธฐ์กด ์†์„ฑ ๊ฐ’ ์„ค์ •ํ•˜๊ธฐ๋ฅผ this ์™€ ์ฃผ์–ด์ง„ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

CharacterData

๋ฐ์ดํ„ฐ ๋ฐ”๊พธ๊ธฐ๋ฅผ this์— ๋Œ€ํ•ด 0, this์˜ ๊ธธ์ด, ๊ทธ๋ฆฌ๊ณ  ์ฃผ์–ด์ง„ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋ฐ–์˜ ๊ฒฝ์šฐ

์•„๋ฌด ์ž‘์—…๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ node์— ๋Œ€ํ•ด ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, node๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ๋‹ค์Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

DocumentFragment
Element
node์˜ ์ž์† ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ .
Attr
node์˜ ๊ฐ’.
CharacterData
node์˜ ๋ฐ์ดํ„ฐ.
๊ทธ ๋ฐ–์˜ ๊ฒฝ์šฐ
Null.

textContent getter ๋‹จ๊ณ„๋Š” this์— ๋Œ€ํ•ด ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ์ „์ฒด ๋ฐ”๊พธ๊ธฐ๋ฅผ ๋ฌธ์ž์—ด string์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ parent ๋‚ด์—์„œ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. node๋ฅผ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. string์ด ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉด node๋ฅผ ํ…์ŠคํŠธ ๋…ธ๋“œ ์ƒ์„ฑํ•˜๊ธฐ๋ฅผ parent์˜ ๋…ธ๋“œ ๋ฌธ์„œ์™€ string์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. parent ๋‚ด์—์„œ node๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ๋ฐ”๊พธ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ node์™€ ๋ฌธ์ž์—ด value๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ  ์„ค์ •ํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, node๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ์•„๋ž˜์— ์ •์˜๋œ ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

DocumentFragment
Element

node ๋‚ด์—์„œ value๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด ์ „์ฒด ๋ฐ”๊พธ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Attr

node์™€ value๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด ์†์„ฑ ๊ฐ’ ์„ค์ •ํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

CharacterData

node์— ๋Œ€ํ•ด 0, node์˜ ๊ธธ์ด, ๊ทธ๋ฆฌ๊ณ  value๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฐ”๊พธ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋ฐ–์˜ ๊ฒฝ์šฐ

์•„๋ฌด ์ž‘์—…๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

textContent setter ๋‹จ๊ณ„๋Š” ์ฃผ์–ด์ง„ ๊ฐ’์ด null์ด๋ฉด ๋Œ€์‹  ๋นˆ ๋ฌธ์ž์—ด์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ, ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ  ์„ค์ •ํ•˜๊ธฐ๋ฅผ this์™€ ์ฃผ์–ด์ง„ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


node . normalize()
๋น„์–ด ์žˆ๋Š” ๋ฐฐํƒ€์  Text ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๋‚จ์•„ ์žˆ๋Š” ์—ฐ์†๋œ ๋ฐฐํƒ€์  Text ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด๋‹น ๋…ธ๋“œ ์ค‘ ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

normalize() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” this์˜ ๊ฐ ์ž์† ๋ฐฐํƒ€์  Text ๋…ธ๋“œ node์— ๋Œ€ํ•ด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. length๋ฅผ node์˜ ๊ธธ์ด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. length๊ฐ€ 0์ด๋ฉด node๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๋‹ค์Œ ๋ฐฐํƒ€์  Text ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋กœ ๊ณ„์† ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  3. data๋ฅผ node์˜ ์—ฐ์†๋œ ๋ฐฐํƒ€์  Text ๋…ธ๋“œ(์ž๊ธฐ ์ž์‹  ์ œ์™ธ)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํŠธ๋ฆฌ ์ˆœ์„œ๋Œ€๋กœ ์—ฐ๊ฒฐํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. node์˜ ๋ฐ์ดํ„ฐ ๋ฐ”๊พธ๊ธฐ๋ฅผ length, 0, data๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  5. currentNode๋ฅผ node์˜ ๋‹ค์Œ ํ˜•์ œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. currentNode๊ฐ€ ๋ฐฐํƒ€์  Text ๋…ธ๋“œ์ธ ๋™์•ˆ:

    1. ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ currentNode์ธ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด: ํ•ด๋‹น ์‹œ์ž‘ ์˜คํ”„์…‹์— length๋ฅผ ๋”ํ•˜๊ณ  ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ node๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. ๋ ๋…ธ๋“œ๊ฐ€ currentNode์ธ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด: ํ•ด๋‹น ๋ ์˜คํ”„์…‹์— length๋ฅผ ๋”ํ•˜๊ณ  ๋ ๋…ธ๋“œ๋ฅผ node๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ currentNode์˜ ๋ถ€๋ชจ์ด๊ณ  ์‹œ์ž‘ ์˜คํ”„์…‹์ด currentNode์˜ ์ธ๋ฑ์Šค์ธ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด: ํ•ด๋‹น ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ node๋กœ, ํ•ด๋‹น ์‹œ์ž‘ ์˜คํ”„์…‹์„ length๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    4. ๋ ๋…ธ๋“œ๊ฐ€ currentNode์˜ ๋ถ€๋ชจ์ด๊ณ  ๋ ์˜คํ”„์…‹์ด currentNode์˜ ์ธ๋ฑ์Šค์ธ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด: ํ•ด๋‹น ๋ ๋…ธ๋“œ๋ฅผ node๋กœ, ํ•ด๋‹น ๋ ์˜คํ”„์…‹์„ length๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    5. currentNode์˜ ๊ธธ์ด๋ฅผ length์— ๋”ํ•ฉ๋‹ˆ๋‹ค.

    6. currentNode๋ฅผ ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋‹ค์Œ ํ˜•์ œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. node์˜ ์—ฐ์†๋œ ๋ฐฐํƒ€์  Text ๋…ธ๋“œ๋ฅผ (์ž๊ธฐ ์ž์‹  ์ œ์™ธ) ํŠธ๋ฆฌ ์ˆœ์„œ๋Œ€๋กœ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.


node . cloneNode([subtree = false])
node์˜ ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. subtree๊ฐ€ true์ด๋ฉด ๋ณต์‚ฌ๋ณธ์— node์˜ ์ž์†๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
node . isEqualNode(otherNode)
node์™€ otherNode๊ฐ€ ๋™์ผํ•œ ์†์„ฑ์„ ๊ฐ–๋Š”์ง€ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๋ช…์„ธ๋Š” ๋ชจ๋“  ๋…ธ๋“œ ๋˜๋Š” ์ผ๋ถ€ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋ณต์ œ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ๋…ธ๋“œ ๋ณต์ œํ•˜๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋ช…์‹œ๋œ ๋Œ€๋กœ node, copy, subtree๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

HTML์€ input, script, ๊ทธ๋ฆฌ๊ณ  template ๋“ฑ์˜ ์—ฌ๋Ÿฌ ์š”์†Œ์— ๋Œ€ํ•ด ๋ณต์ œ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. SVG๋„ ํ•ด๋‹น script ์š”์†Œ์— ๋Œ€ํ•ด ๋™์ผํ•˜๊ฒŒ ์ •์˜ํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ •์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ node์™€ ์„ ํƒ์  ๋ฌธ์„œ document (๊ธฐ๋ณธ๊ฐ’์€ node์˜ ๋…ธ๋“œ ๋ฌธ์„œ), ๋ถˆ๋ฆฌ์–ธ subtree(๊ธฐ๋ณธ๊ฐ’ false), ๋…ธ๋“œ ๋˜๋Š” null์ธ parent(๊ธฐ๋ณธ๊ฐ’ null), ๊ทธ๋ฆฌ๊ณ  null ๋˜๋Š” CustomElementRegistry ๊ฐ์ฒด fallbackRegistry (๊ธฐ๋ณธ๊ฐ’ null)๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ ๋ณต์ œํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด:

  1. ๋‹จ์–ธ: node๋Š” ๋ฌธ์„œ๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ node๊ฐ€ document์ž…๋‹ˆ๋‹ค.

  2. copy๋ฅผ node, document, fallbackRegistry๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹จ์ผ ๋…ธ๋“œ ๋ณต์ œํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. node์— ๋Œ€ํ•ด ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ ๋ช…์„ธ์— ์ •์˜๋œ ๋ชจ๋“  ๋ณต์ œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ , node, copy, ๊ทธ๋ฆฌ๊ณ  subtree๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  4. parent๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด copy๋ฅผ parent์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  5. subtree๊ฐ€ true์ด๋ฉด node์˜ ์ž์‹ ๊ฐ๊ฐ์— ๋Œ€ํ•ด ํŠธ๋ฆฌ ์ˆœ์„œ๋Œ€๋กœ: child๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ ๋ณต์ œํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋˜, document๋Š” document๋กœ, subtree๋Š” subtree๋กœ, parent๋Š” copy๋กœ, ๊ทธ๋ฆฌ๊ณ  fallbackRegistry๋Š” fallbackRegistry๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. node๊ฐ€ ์š”์†Œ์ด๊ณ , node๊ฐ€ ์„€๋„ ํ˜ธ์ŠคํŠธ์ด๋ฉฐ, node์˜ ์„€๋„ ๋ฃจํŠธ์˜ ๋ณต์ œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๊ฐ€ true์ด๋ฉด:

    1. ๋‹จ์–ธ: copy๋Š” ์„€๋„ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

    2. shadowRootRegistry๋ฅผ node์˜ ์„€๋„ ๋ฃจํŠธ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. shadowRootRegistry๊ฐ€ ์ „์—ญ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์ด๋ฉด, shadowRootRegistry๋ฅผ document์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ์œ ํšจํ•œ ์ „์—ญ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    4. copy, node์˜ ์„€๋„ ๋ฃจํŠธ์˜ ๋ชจ๋“œ, node์˜ ์„€๋„ ๋ฃจํŠธ์˜ ํฌ์ปค์Šค ์œ„์ž„ ์—ฌ๋ถ€, node์˜ ์„€๋„ ๋ฃจํŠธ์˜ ์ง๋ ฌํ™” ๊ฐ€๋Šฅ ์—ฌ๋ถ€, node์˜ ์„€๋„ ๋ฃจํŠธ์˜ ์Šฌ๋กฏ ํ• ๋‹น, true, ๊ทธ๋ฆฌ๊ณ  shadowRootRegistry๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„€๋„ ๋ฃจํŠธ ์—ฐ๊ฒฐํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    5. copy์˜ ์„€๋„ ๋ฃจํŠธ์˜ ์„ ์–ธ์  ์—ฌ๋ถ€๋ฅผ node์˜ ์„€๋„ ๋ฃจํŠธ์˜ ์„ ์–ธ์  ์—ฌ๋ถ€๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    6. copy์˜ ์„€๋„ ๋ฃจํŠธ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ null๋กœ ์œ ์ง€๋ฅผ node์˜ ์„€๋„ ๋ฃจํŠธ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ null๋กœ ์œ ์ง€๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    7. node์˜ ์„€๋„ ๋ฃจํŠธ์˜ ์ž์‹ ๊ฐ๊ฐ์— ๋Œ€ํ•ด ํŠธ๋ฆฌ ์ˆœ์„œ๋Œ€๋กœ: child๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ ๋ณต์ œํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋˜, document๋Š” document๋กœ, subtree๋Š” true๋กœ, ๊ทธ๋ฆฌ๊ณ  parent๋Š” copy์˜ ์„€๋„ ๋ฃจํŠธ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      ์—ฌ๊ธฐ์„œ๋Š” ์˜๋„์ ์œผ๋กœ fallbackRegistry ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  7. copy๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ node, ๋ฌธ์„œ document, ๊ทธ๋ฆฌ๊ณ  null ๋˜๋Š” CustomElementRegistry ๊ฐ์ฒด fallbackRegistry๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹จ์ผ ๋…ธ๋“œ ๋ณต์ œํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด:

  1. copy๋ฅผ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. node๊ฐ€ ์š”์†Œ์ด๋ฉด:

    1. registry๋ฅผ node์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. registry๊ฐ€ null์ด๋ฉด registry๋ฅผ fallbackRegistry๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. registry๊ฐ€ ์ „์—ญ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์ด๋ฉด, registry๋ฅผ document์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ์œ ํšจํ•œ ์ „์—ญ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    4. copy๋ฅผ document, node์˜ ์ง€์—ญ ์ด๋ฆ„, node์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค, node์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ, node์˜ is ๊ฐ’, false, ๊ทธ๋ฆฌ๊ณ  registry๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์š”์†Œ ์ƒ์„ฑํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    5. node์˜ ์†์„ฑ ๋ชฉ๋ก์— ์žˆ๋Š” attribute ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

      1. copyAttribute๋ฅผ attribute, document, null์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹จ์ผ ๋…ธ๋“œ ๋ณต์ œํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. copyAttribute๋ฅผ copy์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  node๊ฐ€ ๋ฌธ์„œ์ด๋ฉด, copy๋ฅผ document์˜ ๊ด€๋ จ ์˜์—ญ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ฌธ์„œ ์ƒ์„ฑํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ node์™€ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด copy๋ฅผ document๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ ์ƒ์„ฑํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ node์™€ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. node๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ๋‹ค์Œ ์ถ”๊ฐ€ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

    Document
    1. copy์˜ ์ธ์ฝ”๋”ฉ, ์ฝ˜ํ…์ธ  ์œ ํ˜•, URL, ์ถœ์ฒ˜, ์œ ํ˜•, ๋ชจ๋“œ, ๊ทธ๋ฆฌ๊ณ  ์„ ์–ธ์  ์„€๋„ ๋ฃจํŠธ ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ node์˜ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. copy์˜ ๊ธฐ์ค€ URL ์žฌ์ •์˜๋ฅผ node์˜ ๊ธฐ์ค€ URL ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. node์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ๋ฒ”์œ„ ์ง€์ • ์—ฌ๋ถ€๊ฐ€ true์ด๋ฉด, copy์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ node์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    DocumentType

    copy์˜ ์ด๋ฆ„, ๊ณต๊ฐœ ID, ๊ทธ๋ฆฌ๊ณ  ์‹œ์Šคํ…œ ID๋ฅผ node์˜ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    Attr

    copy์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ, ์ง€์—ญ ์ด๋ฆ„, ๊ทธ๋ฆฌ๊ณ  ๊ฐ’์„ node์˜ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    Text
    Comment

    copy์˜ ๋ฐ์ดํ„ฐ๋ฅผ node์˜ ๋ฐ์ดํ„ฐ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ProcessingInstruction

    copy์˜ ๋Œ€์ƒ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ node์˜ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๊ทธ ๋ฐ–์˜ ๊ฒฝ์šฐ

    ์•„๋ฌด ์ž‘์—…๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  6. ๋‹จ์–ธ: copy๋Š” ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.

  7. node๊ฐ€ ๋ฌธ์„œ์ด๋ฉด document๋ฅผ copy๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  8. copy์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋ฅผ document๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  9. copy๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

cloneNode(subtree) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. this๊ฐ€ ์„€๋„ ๋ฃจํŠธ์ด๋ฉด "NotSupportedError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  2. this๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ ๋ณต์ œํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋˜, subtree๋ฅผ subtree๋กœ ์„ค์ •ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ A๋Š” ๋‹ค์Œ ์กฐ๊ฑด์ด ๋ชจ๋‘ ์ฐธ์ด๋ฉด ๋…ธ๋“œ B์™€ ๋™๋“ฑํ•ฉ๋‹ˆ๋‹ค.

isEqualNode(otherNode) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” otherNode๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  this๊ฐ€ otherNode์™€ ๋™๋“ฑํ•˜๋ฉด true๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

isSameNode(otherNode) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” otherNode๊ฐ€ this์ด๋ฉด true๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


node . compareDocumentPosition(other)
node์— ๋Œ€ํ•œ other์˜ ์ƒ๋Œ€์  ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋น„ํŠธ๋งˆ์Šคํฌ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„ํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
Node . DOCUMENT_POSITION_DISCONNECTED (1)
node์™€ other๊ฐ€ ๋™์ผํ•œ ํŠธ๋ฆฌ์— ์žˆ์ง€ ์•Š์œผ๋ฉด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
Node . DOCUMENT_POSITION_PRECEDING (2)
other๊ฐ€ node๋ณด๋‹ค ์•ž์— ์žˆ์œผ๋ฉด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
Node . DOCUMENT_POSITION_FOLLOWING (4)
other๊ฐ€ node๋ณด๋‹ค ๋’ค์— ์žˆ์œผ๋ฉด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
Node . DOCUMENT_POSITION_CONTAINS (8)
other๊ฐ€ node์˜ ์กฐ์ƒ์ด๋ฉด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
Node . DOCUMENT_POSITION_CONTAINED_BY (16, 16์ง„์ˆ˜๋กœ 10)
other๊ฐ€ node์˜ ์ž์†์ด๋ฉด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
node . contains(other)
other๊ฐ€ node์˜ ์ž๊ธฐ ์ž์‹ ์„ ํฌํ•จํ•œ ์ž์†์ด๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ compareDocumentPosition() ์ด ๋งˆ์Šคํฌ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค.

  • DOCUMENT_POSITION_DISCONNECTED (1);
  • DOCUMENT_POSITION_PRECEDING (2);
  • DOCUMENT_POSITION_FOLLOWING (4);
  • DOCUMENT_POSITION_CONTAINS (8);
  • DOCUMENT_POSITION_CONTAINED_BY (16, 16์ง„์ˆ˜๋กœ 10);
  • DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC (32, 16์ง„์ˆ˜๋กœ 20).

compareDocumentPosition(other) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. this ๊ฐ€ other์ด๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. node1์„ other๋กœ, node2๋ฅผ this๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. attr1๊ณผ attr2๋ฅผ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. node1์ด ์†์„ฑ์ด๋ฉด attr1์„ node1๋กœ, node1์„ attr1์˜ ์š”์†Œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. node2๊ฐ€ ์†์„ฑ์ด๋ฉด:

    1. attr2๋ฅผ node2๋กœ, node2๋ฅผ attr2์˜ ์š”์†Œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. attr1๊ณผ node1์ด null์ด ์•„๋‹ˆ๊ณ  node2๊ฐ€ node1์ด๋ฉด:

      1. node2์˜ ์†์„ฑ ๋ชฉ๋ก์— ์žˆ๋Š” attr ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

        1. attr์ด attr1๊ณผ ๋™๋“ฑํ•˜๋ฉด, DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC ์™€ DOCUMENT_POSITION_PRECEDING์„ ๋”ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

        2. attr์ด attr2์™€ ๋™๋“ฑํ•˜๋ฉด, DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC ์™€ DOCUMENT_POSITION_FOLLOWING์„ ๋”ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  6. node1 ๋˜๋Š” node2๊ฐ€ null์ด๊ฑฐ๋‚˜ node1์˜ ๋ฃจํŠธ๊ฐ€ node2์˜ ๋ฃจํŠธ์™€ ๋‹ค๋ฅด๋ฉด, DOCUMENT_POSITION_DISCONNECTED, DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC, ๊ทธ๋ฆฌ๊ณ  DOCUMENT_POSITION_PRECEDING ๋˜๋Š” DOCUMENT_POSITION_FOLLOWING ์ค‘ ํ•˜๋‚˜๋ฅผ ์ผ๊ด€์„ฑ์ด ์œ ์ง€๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ฝ์— ๋”ฐ๋ผ ๋ชจ๋‘ ๋”ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    DOCUMENT_POSITION_PRECEDING ๋˜๋Š” DOCUMENT_POSITION_FOLLOWING ์ค‘ ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ• ์ง€๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํฌ์ธํ„ฐ ๋น„๊ต๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. JavaScript ๊ตฌํ˜„์—์„œ๋Š” ์บ์‹œ๋œ Math.random() ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  7. node1์ด node2์˜ ์กฐ์ƒ์ด๊ณ  attr1์ด null์ด๊ฑฐ๋‚˜, node1์ด node2์ด๊ณ  attr2๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, DOCUMENT_POSITION_CONTAINS๋ฅผ DOCUMENT_POSITION_PRECEDING์— ๋”ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  8. node1์ด node2์˜ ์ž์†์ด๊ณ  attr2๊ฐ€ null์ด๊ฑฐ๋‚˜, node1์ด node2์ด๊ณ  attr1์ด null์ด ์•„๋‹ˆ๋ฉด, DOCUMENT_POSITION_CONTAINED_BY๋ฅผ DOCUMENT_POSITION_FOLLOWING์— ๋”ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  9. node1์ด node2๋ณด๋‹ค ์•ž์— ์žˆ์œผ๋ฉด, DOCUMENT_POSITION_PRECEDING์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์†์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ ๋•Œ๋ฌธ์—, ๋…ธ๋“œ์˜ ์†์„ฑ์€ ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ž์‹๋ณด๋‹ค ์•ž์— ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์†์„ฑ์ด ๋™์ผํ•œ ํŠธ๋ฆฌ์— ์ฐธ์—ฌํ•˜์ง€ ์•Š์Œ์—๋„ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

  10. DOCUMENT_POSITION_FOLLOWING์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

contains(other) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” other๊ฐ€ this์˜ ์ž๊ธฐ ์ž์‹ ์„ ํฌํ•จํ•œ ์ž์†์ด๋ฉด true๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ (other๊ฐ€ null์ธ ๊ฒฝ์šฐ ํฌํ•จ) ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


namespace๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ element์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ ์ฐพ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. element์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ namespace์ด๊ณ  ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. element์— ์†์„ฑ์ด ์žˆ๊ณ , ํ•ด๋‹น ์†์„ฑ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๊ฐ€ "xmlns"์ด๊ณ  ๊ฐ’์ด namespace์ด๋ฉด, element์—์„œ ๊ทธ๋Ÿฌํ•œ ์ฒซ ๋ฒˆ์งธ ์†์„ฑ์˜ ์ง€์—ญ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. element์˜ ๋ถ€๋ชจ ์š”์†Œ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, ํ•ด๋‹น ์š”์†Œ์— ๋Œ€ํ•ด namespace๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ ์ฐพ๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

prefix๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ node์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ฐพ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด node๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ๋ถ„๊ธฐํ•ฉ๋‹ˆ๋‹ค.

Element
  1. prefix๊ฐ€ "xml"์ด๋ฉด XML ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. prefix๊ฐ€ "xmlns"์ด๋ฉด XMLNS ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๊ฐ€ prefix์ด๋ฉด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. ํ•ด๋‹น ์š”์†Œ์— ์†์„ฑ์ด ์žˆ๊ณ , ๊ทธ ์†์„ฑ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ XMLNS ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ด๊ณ , ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๊ฐ€ "xmlns"์ด๋ฉฐ, ์ง€์—ญ ์ด๋ฆ„์ด prefix์ด๊ฑฐ๋‚˜, prefix๊ฐ€ null์ด๊ณ  ํ•ด๋‹น ์š”์†Œ์— ์†์„ฑ์ด ์žˆ์œผ๋ฉฐ, ๊ทธ ์†์„ฑ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ XMLNS ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ด๊ณ , ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๊ฐ€ null์ด๋ฉฐ, ์ง€์—ญ ์ด๋ฆ„์ด "xmlns"์ด๋ฉด, ํ•ด๋‹น ๊ฐ’์ด ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ ๊ฒฝ์šฐ ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. ํ•ด๋‹น ๋ถ€๋ชจ ์š”์†Œ๊ฐ€ null์ด๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  6. ํ•ด๋‹น ๋ถ€๋ชจ ์š”์†Œ์— ๋Œ€ํ•ด prefix๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ฐพ๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Document
  1. ํ•ด๋‹น ๋ฌธ์„œ ์š”์†Œ๊ฐ€ null์ด๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. ํ•ด๋‹น ๋ฌธ์„œ ์š”์†Œ์— ๋Œ€ํ•ด 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. this์˜ ๋ฌธ์„œ ์š”์†Œ๊ฐ€ null์ด๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. this์˜ ๋ฌธ์„œ ์š”์†Œ์— ๋Œ€ํ•ด namespace๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ ์ฐพ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    DocumentType
    DocumentFragment

    null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    Attr
    1. this์˜ ์š”์†Œ๊ฐ€ null์ด๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. this์˜ ์š”์†Œ์— ๋Œ€ํ•ด namespace๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ ์ฐพ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    ๊ทธ ๋ฐ–์˜ ๊ฒฝ์šฐ
    1. this์˜ ๋ถ€๋ชจ ์š”์†Œ๊ฐ€ null์ด๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. this์˜ ๋ถ€๋ชจ ์š”์†Œ์— ๋Œ€ํ•ด namespace๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ ์ฐพ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

lookupNamespaceURI(prefix) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. prefix๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. this์— ๋Œ€ํ•ด prefix๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ฐพ๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

isDefaultNamespace(namespace) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. namespace๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. defaultNamespace๋ฅผ this์— ๋Œ€ํ•ด null์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ฐพ๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. defaultNamespace๊ฐ€ namespace์™€ ๊ฐ™์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


insertBefore(node, child) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” child ์•ž์—์„œ node๋ฅผ this์— ์‚ฌ์ „ ์‚ฝ์ž…ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

appendChild(node) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” node๋ฅผ this์— ์ถ”๊ฐ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

replaceChild(node, child) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” this ๋‚ด์—์„œ child๋ฅผ node๋กœ ๊ต์ฒดํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

removeChild(child) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” child๋ฅผ this์—์„œ ์‚ฌ์ „ ์ œ๊ฑฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋…ธ๋“œ root์— ๋Œ€ํ•œ ํ•œ์ • ์ด๋ฆ„์ด qualifiedName์ธ ์š”์†Œ ๋ชฉ๋ก์€ ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜๋Š” HTMLCollection์ž…๋‹ˆ๋‹ค.

  1. qualifiedName์ด U+002A (*)์ด๋ฉด, root๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๊ณ  ์ž์† ์š”์†Œ๋งŒ ์ผ์น˜์‹œํ‚ค๋Š” ํ•„ํ„ฐ๋ฅผ ๊ฐ€์ง„ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  root์˜ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ HTML ๋ฌธ์„œ์ด๋ฉด, root๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๊ณ  ๋‹ค์Œ ์ž์† ์š”์†Œ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ํ•„ํ„ฐ๋ฅผ ๊ฐ€์ง„ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด root๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๊ณ  ์ž์† ์š”์†Œ ์ค‘ ํ•œ์ • ์ด๋ฆ„์ด qualifiedName์ธ ์š”์†Œ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ํ•„ํ„ฐ๋ฅผ ๊ฐ€์ง„ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ์ธ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๊ณ  root์˜ ๋…ธ๋“œ ๋ฌธ์„œ์˜ ์œ ํ˜•์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์ด์ „ ํ˜ธ์ถœ์—์„œ ๋ฐ˜ํ™˜ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ HTMLCollection ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ root์— ๋Œ€ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ namespace์ด๊ณ  ์ง€์—ญ ์ด๋ฆ„์ด localName์ธ ์š”์†Œ ๋ชฉ๋ก์€ ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜๋Š” HTMLCollection์ž…๋‹ˆ๋‹ค.

  1. namespace๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. namespace์™€ localName์ด ๋ชจ๋‘ U+002A (*)์ด๋ฉด, root๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๊ณ  ์ž์† ์š”์†Œ๋งŒ ์ผ์น˜์‹œํ‚ค๋Š” ํ•„ํ„ฐ๋ฅผ ๊ฐ€์ง„ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. namespace๊ฐ€ U+002A (*)์ด๋ฉด, root๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๊ณ  ์ž์† ์š”์†Œ ์ค‘ ์ง€์—ญ ์ด๋ฆ„์ด localName์ธ ์š”์†Œ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ํ•„ํ„ฐ๋ฅผ ๊ฐ€์ง„ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. localName์ด U+002A (*)์ด๋ฉด, root๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๊ณ  ์ž์† ์š”์†Œ ์ค‘ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ namespace์ธ ์š”์†Œ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ํ•„ํ„ฐ๋ฅผ ๊ฐ€์ง„ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. root๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๊ณ  ์ž์† ์š”์†Œ ์ค‘ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ namespace์ด๊ณ  ์ง€์—ญ ์ด๋ฆ„์ด localName์ธ ์š”์†Œ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ํ•„ํ„ฐ๋ฅผ ๊ฐ€์ง„ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ์ธ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋™์ผํ•œ HTMLCollection ๊ฐ์ฒด๋ฅผ ์ด์ „ ํ˜ธ์ถœ์—์„œ ๋ฐ˜ํ™˜ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ root์— ๋Œ€ํ•œ ํด๋ž˜์Šค ์ด๋ฆ„์ด classNames์ธ ์š”์†Œ ๋ชฉ๋ก์€ ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜๋Š” HTMLCollection์ž…๋‹ˆ๋‹ค.

  1. classes๋ฅผ classNames์— ๋Œ€ํ•ด ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์ง‘ํ•ฉ ํŒŒ์„œ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. classes๊ฐ€ ๋นˆ ์ง‘ํ•ฉ์ด๋ฉด ๋นˆ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  3. root๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๊ณ  ์ž์† ์š”์†Œ ์ค‘ ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ classes์— ํฌํ•จ๋˜๋Š” ์š”์†Œ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ํ•„ํ„ฐ๋ฅผ ๊ฐ€์ง„ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    root์˜ ๋…ธ๋“œ ๋ฌธ์„œ์˜ ๋ชจ๋“œ๊ฐ€ "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 ๋…ธ๋“œ๋Š” ๋‹จ์ˆœํžˆ ๋ฌธ์„œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œ์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋Š” ํ•ด๋‹น ๋ฌธ์„œ ์ž์ฒด์ž…๋‹ˆ๋‹ค.

๊ฐ ๋ฌธ์„œ์—๋Š” ๋‹ค์Œ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ฝ”๋”ฉ(์ธ์ฝ”๋”ฉ), ์ฝ˜ํ…์ธ  ์œ ํ˜•(๋ฌธ์ž์—ด), URL(URL), ์ถœ์ฒ˜(์ถœ์ฒ˜), ์œ ํ˜•("xml" ๋˜๋Š” "html"), ๋ชจ๋“œ("no-quirks", "quirks" ๋˜๋Š” "limited-quirks"), ์„ ์–ธ์  ์„€๋„ ๋ฃจํŠธ ํ—ˆ์šฉ ์—ฌ๋ถ€(๋ถˆ๋ฆฌ์–ธ), ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(null ๋˜๋Š” CustomElementRegistry ๊ฐ์ฒด)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. [ENCODING] [URL] [HTML]

๋‹ฌ๋ฆฌ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ, ๋ฌธ์„œ์˜ ์ธ์ฝ”๋”ฉ์€ utf-8 ์ธ์ฝ”๋”ฉ์ด๊ณ , ์ฝ˜ํ…์ธ  ์œ ํ˜•์€ "application/xml"์ด๋ฉฐ, URL์€ "about:blank"์ด๊ณ , ์ถœ์ฒ˜๋Š” ๋ถˆํˆฌ๋ช… ์ถœ์ฒ˜์ด๋ฉฐ, ์œ ํ˜•์€ "xml"์ด๊ณ , ๋ชจ๋“œ๋Š” "no-quirks"์ด๋ฉฐ, ์„ ์–ธ์  ์„€๋„ ๋ฃจํŠธ ํ—ˆ์šฉ ์—ฌ๋ถ€๋Š” false์ด๊ณ , ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” null์ž…๋‹ˆ๋‹ค.

๋ฌธ์„œ์˜ ์œ ํ˜•์ด "xml"์ด๋ฉด ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ XML ๋ฌธ์„œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด HTML ๋ฌธ์„œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ๊ฐ€ HTML ๋ฌธ์„œ์ธ์ง€ XML ๋ฌธ์„œ์ธ์ง€์— ๋”ฐ๋ผ ์ผ๋ถ€ API์˜ ๋™์ž‘์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๊ฐ ๋ฌธ์„œ์—๋Š” ๊ธฐ๋ณธ URL ๊ฐ€์ ธ์˜ค๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ URL ๋˜๋Š” null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ๋ฌธ์„œ์—๋Š” ๊ธฐ๋ณธ URL ์žฌ์ •์˜(URL ๋˜๋Š” null)๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ดˆ๊ธฐ๊ฐ’์€ null์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ URL ์žฌ์ •์˜๋Š” ๋ณต์ œ๋ฅผ ํ†ตํ•ด ๋ฌธ์„œ๋ฅผ ๋ณต์ œํ•  ๋•Œ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. HTML์€ ๊ธฐ๋ณธ URL ๊ฐ€์ ธ์˜ค๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์žฌ์ •์˜ํ•˜์—ฌ base ์š”์†Œ์™€ ๊ธฐ๋ณธ URL์ด "about:" ์Šคํ‚ด์ธ ๋ฌธ์„œ์—์„œ ์ƒ์†๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. [HTML]

๋ฌธ์„œ์˜ ๋ชจ๋“œ๊ฐ€ ๋น„์ฟผํฌ ๋ชจ๋“œ์ด๋ฉด ํ•ด๋‹น ๋ฌธ์„œ๋Š” ๋น„์ฟผํฌ ๋ชจ๋“œ์— ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“œ๊ฐ€ "no-quirks"์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ฟผํฌ ๋ชจ๋“œ๋Š” ๋ชจ๋“œ๊ฐ€ "quirks"์ธ ๊ฒฝ์šฐ์ด๋ฉฐ, ์ œํ•œ๋œ ์ฟผํฌ ๋ชจ๋“œ๋Š” ๋ชจ๋“œ๊ฐ€ "limited-quirks"์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌธ์„œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ์˜ ๊ธฐ๋ณธ๊ฐ’์—์„œ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งค์šฐ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. HTML ํŒŒ์„œ๊ฐ€ DOCTYPE ๋ฌธ์ž์—ด์˜ ์กด์žฌ ์—ฌ๋ถ€, ๋ถ€์žฌ ๋˜๋Š” ๊ฐ’์— ๋”ฐ๋ผ ์ƒ์„ฑํ•œ ๋ฌธ์„œ์™€ ์ƒˆ๋กœ์šด ๋ธŒ๋ผ์šฐ์ง• ์ปจํ…์ŠคํŠธ(์ดˆ๊ธฐ๊ฐ’ "about:blank")์— ํ•œํ•ด์„œ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. [HTML]

๋น„์ฟผํฌ ๋ชจ๋“œ๋Š” ์›๋ž˜ "ํ‘œ์ค€ ๋ชจ๋“œ"๋ผ๊ณ  ๋ถˆ๋ ธ๊ณ , ์ œํ•œ๋œ ์ฟผํฌ ๋ชจ๋“œ๋Š” ํ•œ๋•Œ "๊ฑฐ์˜ ํ‘œ์ค€ ๋ชจ๋“œ"๋ผ๊ณ  ๋ถˆ๋ ธ์Šต๋‹ˆ๋‹ค. ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ์ด์ œ ํ‘œ์ค€์œผ๋กœ ์ •์˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์นญ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (๋˜ํ•œ Ian Hickson์ด ๊ธฐ์กด ๋ช…์นญ์€ ์˜๋ฏธ๊ฐ€ ํ†ตํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ด์œ ๋กœ ๊ฑฐ๋ถ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)

๋ฌธ์„œ์˜ ๋ถ€๋ชจ ๊ฐ€์ ธ์˜ค๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ event๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„, event์˜ type ์†์„ฑ ๊ฐ’์ด "load"์ด๊ฑฐ๋‚˜ ๋ฌธ์„œ์— ๋ธŒ๋ผ์šฐ์ง• ์ปจํ…์ŠคํŠธ๊ฐ€ ์—†์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฌธ์„œ์˜ ๊ด€๋ จ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

interface ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜์—ญ realm์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

  1. ๋‹จ์–ธ: interface๋Š” Document ๋˜๋Š” ๋‹ค์Œ์„ ์ƒ์†ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค: Document.

  2. ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” interface์ด๋ฉฐ, ํ•ด๋‹น ๋…ธ๋“œ๋Š” realm์— ์†ํ•ฉ๋‹ˆ๋‹ค.


document = new Document()
์ƒˆ ๋ฌธ์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
document . implementation
document์— ์—ฐ๊ฒฐ๋œ DOMImplementation ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
document . URL
document . documentURI
document์˜ URL์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
document . compatMode
document์˜ ๋ชจ๋“œ๊ฐ€ "quirks"์ด๋ฉด ๋ฌธ์ž์—ด "BackCompat"๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด "CSS1Compat"๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
document . characterSet
document์˜ ์ธ์ฝ”๋”ฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
document . contentType
document์˜ ์ฝ˜ํ…์ธ  ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

new Document() ์ƒ์„ฑ์ž์˜ ๋‹จ๊ณ„๋Š” this์˜ ์ถœ์ฒ˜๋ฅผ ํ˜„์žฌ ์ „์—ญ ๊ฐ์ฒด์˜ ํ˜„์žฌ ์ „์—ญ ๊ฐ์ฒด์— ์—ฐ๊ฒฐ๋œ ์—ฐ๊ฒฐ๋œ Document์˜ ์ถœ์ฒ˜๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. [HTML]

createDocument()์™€ ๋‹ฌ๋ฆฌ, ์ด ์ƒ์„ฑ์ž๋Š” XMLDocument ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌธ์„œ (Document ๊ฐ์ฒด)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

implementation์˜ getter ๋‹จ๊ณ„๋Š” this์— ์—ฐ๊ฒฐ๋œ DOMImplementation ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

URL ๋ฐ documentURI์˜ getter ๋‹จ๊ณ„๋Š” this์˜ URL์„ ์ง๋ ฌํ™”ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

compatMode์˜ getter ๋‹จ๊ณ„๋Š” this์˜ ๋ชจ๋“œ๊ฐ€ "quirks"์ด๋ฉด "BackCompat"๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด "CSS1Compat"๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

characterSet, charset ๋ฐ inputEncoding์˜ getter ๋‹จ๊ณ„๋Š” this์˜ ์ธ์ฝ”๋”ฉ์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

contentType์˜ getter ๋‹จ๊ณ„๋Š” this์˜ ์ฝ˜ํ…์ธ  ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


document . doctype
doctype์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, doctype์ด ์—†์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
document . documentElement
๋ฌธ์„œ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
collection = document . getElementsByTagName(qualifiedName)

qualifiedName์ด "*"์ด๋ฉด ๋ชจ๋“  ํ•˜์œ„ ์š”์†Œ ์š”์†Œ์˜ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด qualifiedName์ด ์ •๊ทœํ™”๋œ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์š”์†Œ ์š”์†Œ์˜ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. (HTML ๋ฌธ์„œ ๋‚ด HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๋Š” ์š”์†Œ์™€๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.)

collection = document . getElementsByTagNameNS(namespace, localName)

namespace์™€ localName์ด ๋ชจ๋‘ "*"์ด๋ฉด ๋ชจ๋“  ํ•˜์œ„ ์š”์†Œ ์š”์†Œ์˜ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

namespace๋งŒ "*"์ด๋ฉด ํ•˜์œ„ ์š”์†Œ ์ค‘ ์š”์†Œ์˜ ๋กœ์ปฌ ์ด๋ฆ„์ด localName์ธ ๋ชจ๋“  ์š”์†Œ์˜ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

localName๋งŒ "*"์ด๋ฉด ํ•˜์œ„ ์š”์†Œ ์ค‘ ์š”์†Œ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ namespace์ธ ๋ชจ๋“  ์š”์†Œ์˜ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ปฌ๋ ‰์…˜์—๋Š” ํ•˜์œ„ ์š”์†Œ ์ค‘ ์š”์†Œ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ namespace์ด๊ณ  ๋กœ์ปฌ ์ด๋ฆ„์ด localName์ธ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

collection = document . getElementsByClassName(classNames)
collection = element . getElementsByClassName(classNames)

๋ฐ˜ํ™˜๊ฐ’์€ HTMLCollection ์ด๋ฉฐ, ๋‹ค์Œ ์š”์†Œ๋“ค๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ ๊ฐ์ฒด(๋ฌธ์„œ ๋˜๋Š” ์š”์†Œ) ๋‚ด์— ์žˆ์œผ๋ฉฐ, ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋“ค์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ classNames์ž…๋‹ˆ๋‹ค. classNames ์ธ์ˆ˜๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก์œผ๋กœ ํ•ด์„๋˜๋ฉฐ, ๊ฐ ํ•ญ๋ชฉ์€ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ doctype getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์ž์‹ ์ค‘ this์— ์†ํ•˜๋ฉฐ ๋ฌธ์„œ ์œ ํ˜•์ธ ๊ฒƒ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ documentElement getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋ฌธ์„œ ์š”์†Œ.

๋‹ค์Œ getElementsByTagName(qualifiedName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๋‹ค์Œ ํ•œ์ • ์ด๋ฆ„์„ ๊ฐ€์ง„ ์š”์†Œ ๋ชฉ๋ก: qualifiedName ๋Œ€์ƒ์€ this์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ HTML ๋ฌธ์„œ์—์„œ, document.getElementsByTagName("FOO") ๋Š” ๋‹ค์Œ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค: <FOO> ์š”์†Œ ์ค‘ ๋‹ค์Œ์— ์†ํ•˜์ง€ ์•Š๋Š” ์š”์†Œ: HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๊ทธ๋ฆฌ๊ณ  <foo> ์š”์†Œ ์ค‘ ๋‹ค์Œ์— ์†ํ•˜๋Š” ์š”์†Œ: ํ•ด๋‹น HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค. ๊ทธ๋Ÿฌ๋‚˜ <FOO> ์š”์†Œ ์ค‘ ๋‹ค์Œ์— ์†ํ•˜๋Š” ์š”์†Œ์™€๋Š” ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค.

๋‹ค์Œ getElementsByTagNameNS(namespace, localName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ namespace์ด๊ณ  ๋กœ์ปฌ ์ด๋ฆ„์ด localName์ธ ์š”์†Œ ๋ชฉ๋ก. ๋Œ€์ƒ์€ this์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ getElementsByClassName(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 ์ด๋ฉฐ, ๋‹ค์Œ ๋‘ ๋ฌธ๋‹จ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค: p1๊ณผ p2.

๋‹ค์Œ์„ ํ˜ธ์ถœํ•˜๋ฉด: getElementsByClassName("ccc bbb") ๊ทธ๋Ÿฌ๋‚˜ ํ•˜๋‚˜์˜ ๋…ธ๋“œ, ์ฆ‰ p3๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ํ˜ธ์ถœํ•˜๋ฉด: document.getElementById("example").getElementsByClassName("bbb ccc ") ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ํ˜ธ์ถœํ•˜๋ฉด: getElementsByClassName("aaa,bbb") ์•„๋ฌด ๋…ธ๋“œ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์š”์†Œ ์ค‘ ์–ด๋А ๊ฒƒ๋„ ๋‹ค์Œ ํด๋ž˜์Šค์— ์†ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค: aaa,bbb ํด๋ž˜์Šค.


element = document . createElement(localName [, options])

๋ฐ˜ํ™˜๊ฐ’์€ ์š”์†Œ์ด๋ฉฐ, localName์„ ๋‹ค์Œ์œผ๋กœ ๊ฐ€์ง‘๋‹ˆ๋‹ค: ๋กœ์ปฌ ์ด๋ฆ„ (document๊ฐ€ HTML ๋ฌธ์„œ์ด๋ฉด, localName์€ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค). ์ด ์š”์†Œ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ด๋ฉฐ, ๊ทธ ์กฐ๊ฑด์€ document๊ฐ€ HTML ๋ฌธ์„œ์ด๊ฑฐ๋‚˜ document์˜ ์ฝ˜ํ…์ธ  ์œ ํ˜•์ด "application/xhtml+xml"์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null์ž…๋‹ˆ๋‹ค.

์ œ๊ณต๋œ ๊ฒฝ์šฐ, options์˜ customElementRegistry ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์ • ๋Œ€์ƒ์€ CustomElementRegistry์ž…๋‹ˆ๋‹ค.

์ œ๊ณต๋œ ๊ฒฝ์šฐ, options์˜ is ๋Š” ๋‹ค์Œ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์‚ฌ์šฉ์ž ์ •์˜ ๋‚ด์žฅ ์š”์†Œ.

localName์ด ์œ ํšจํ•œ ์š”์†Œ ๋กœ์ปฌ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด "InvalidCharacterError" DOMException ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

options์˜ customElementRegistry ์™€ options์˜ is ๊ฐ€ ๋ชจ๋‘ ์ œ๊ณต๋œ ๊ฒฝ์šฐ, "NotSupportedError" DOMException ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

element = document . createElementNS(namespace, qualifiedName [, options])

๋ฐ˜ํ™˜๊ฐ’์€ ์š”์†Œ์ด๋ฉฐ, ๊ทธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” namespace์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์š”์†Œ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๋Š” ๋‹ค์Œ ๋ฌธ์ž ์•ž์˜ ๋ชจ๋“  ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค: U+003A (:). ํ•ด๋‹น ๋ฌธ์ž๋Š” qualifiedName ๋‚ด์˜ ๋ฌธ์ž์ด๋ฉฐ, ์—†์œผ๋ฉด null์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์š”์†Œ์˜ ๋กœ์ปฌ ์ด๋ฆ„์€ ๋‹ค์Œ ๋ฌธ์ž ๋’ค์˜ ๋ชจ๋“  ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค: qualifiedName ๋‚ด์˜ U+003A (:). ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ์—†์œผ๋ฉด qualifiedName์ž…๋‹ˆ๋‹ค.

์ œ๊ณต๋œ ๊ฒฝ์šฐ, options์˜ customElementRegistry ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์ • ๋Œ€์ƒ์€ CustomElementRegistry์ž…๋‹ˆ๋‹ค.

์ œ๊ณต๋œ ๊ฒฝ์šฐ, options์˜ is ๋Š” ๋‹ค์Œ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์‚ฌ์šฉ์ž ์ •์˜ ๋‚ด์žฅ ์š”์†Œ.

qualifiedName์ด (์ ‘๋‘์‚ฌ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋Š”) ์œ ํšจํ•œ ์š”์†Œ ๋กœ์ปฌ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด "InvalidCharacterError" DOMException ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ฐธ์ด๋ฉด "NamespaceError" DOMException ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:

options์˜ customElementRegistry ์™€ options์˜ is ๊ฐ€ ๋ชจ๋‘ ์ œ๊ณต๋œ ๊ฒฝ์šฐ, "NotSupportedError" DOMException ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

documentFragment = document . createDocumentFragment()
๋ฐ˜ํ™˜๊ฐ’์€ DocumentFragment ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.
text = document . createTextNode(data)
๋ฐ˜ํ™˜๊ฐ’์€ Text ๋…ธ๋“œ์ด๋ฉฐ, ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋Š” data์ž…๋‹ˆ๋‹ค.
text = document . createCDATASection(data)
๋ฐ˜ํ™˜๊ฐ’์€ CDATASection ๋…ธ๋“œ์ด๋ฉฐ, ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋Š” data์ž…๋‹ˆ๋‹ค.
comment = document . createComment(data)
๋ฐ˜ํ™˜๊ฐ’์€ Comment ๋…ธ๋“œ์ด๋ฉฐ, ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋Š” data์ž…๋‹ˆ๋‹ค.
processingInstruction = document . createProcessingInstruction(target, data)
๋ฐ˜ํ™˜๊ฐ’์€ ProcessingInstruction ๋…ธ๋“œ์ด๋ฉฐ, ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋Œ€์ƒ์€ target์ด๊ณ  ๋ฐ์ดํ„ฐ๋Š” data์ž…๋‹ˆ๋‹ค. target์ด ๋‹ค์Œ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด: Name ์ƒ์„ฑ ๊ทœ์น™, "InvalidCharacterError" DOMException ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. data์— "?>"๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด "InvalidCharacterError" DOMException ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์š”์†Œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ž„์˜์˜ name๊ณผ namespace์— ๋Œ€ํ•ด Element์ž…๋‹ˆ๋‹ค. ๋‹จ, ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋œ ๊ฒฝ์šฐ๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด HTML ํ‘œ์ค€์—์„œ๋Š” html๊ณผ HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•ด HTMLHtmlElement ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. [HTML]

๋‹ค์Œ createElement(localName, options) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. localName์ด ์œ ํšจํ•œ ์š”์†Œ ๋กœ์ปฌ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidCharacterError" DOMException.

  2. ๋งŒ์•ฝ this๊ฐ€ HTML ๋ฌธ์„œ์ด๋ฉด, localName์„ ๋‹ค์Œ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: localName์„ ASCII ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’.

  3. registry์™€ is๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์š”์†Œ ์ƒ์„ฑ ์˜ต์…˜ ํ‰ํƒ„ํ™”. ์ฃผ์–ด์ง„ ๊ฐ’์€ options์™€ this์ž…๋‹ˆ๋‹ค.

  4. namespace๋ฅผ HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๋‘ก๋‹ˆ๋‹ค. ๊ทธ ์กฐ๊ฑด์€ this๊ฐ€ HTML ๋ฌธ์„œ์ด๊ฑฐ๋‚˜ this์˜ ์ฝ˜ํ…์ธ  ์œ ํ˜•์ด "application/xhtml+xml"์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: ์š”์†Œ ์ƒ์„ฑ. ์ฃผ์–ด์ง„ ๊ฐ’์€ this, localName, namespace, null, is, true, ๊ทธ๋ฆฌ๊ณ  registry์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‚ด๋ถ€ createElementNS ๋‹จ๊ณ„๋Š”, ์ฃผ์–ด์ง„ ๊ฐ’์ด document, namespace, qualifiedName, options์ผ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. (namespace, prefix, localName)์„ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์ถ”์ถœ. ๋Œ€์ƒ์€ namespace์™€ qualifiedName์ด๋ฉฐ, ์ฃผ์–ด์ง„ ๊ฐ’์€ "element"์ž…๋‹ˆ๋‹ค.

  2. registry์™€ is๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์š”์†Œ ์ƒ์„ฑ ์˜ต์…˜ ํ‰ํƒ„ํ™”. ์ฃผ์–ด์ง„ ๊ฐ’์€ options์™€ this์ž…๋‹ˆ๋‹ค.

  3. ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: ์š”์†Œ ์ƒ์„ฑ. ์ฃผ์–ด์ง„ ๊ฐ’์€ document, localName, namespace, prefix, is, true, ๊ทธ๋ฆฌ๊ณ  registry์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ createElementNS(namespace, qualifiedName, options) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๋‚ด๋ถ€ createElementNS ๋‹จ๊ณ„. ์ฃผ์–ด์ง„ ๊ฐ’์€ this, namespace, qualifiedName, ๊ทธ๋ฆฌ๊ณ  options์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์†Œ ์ƒ์„ฑ ์˜ต์…˜์„ ํ‰ํƒ„ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ ๋ฌธ์ž์—ด ๋˜๋Š” ElementCreationOptions ๋”•์…”๋„ˆ๋ฆฌ options์™€ ๋ฌธ์„œ document์ž…๋‹ˆ๋‹ค:

  1. registry๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์กฐํšŒ ์ฃผ์–ด์ง„ ๊ฐ’์€ document์ž…๋‹ˆ๋‹ค.

  2. is๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. options๊ฐ€ ๋”•์…”๋„ˆ๋ฆฌ์ด๋ฉด:

    1. ๋งŒ์•ฝ options["is"] ๊ฐ€ ์กด์žฌํ•˜๋ฉด, ๋‹ค์Œ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: is๋ฅผ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. ๋งŒ์•ฝ options["customElementRegistry"] ๊ฐ€ ์กด์žฌํ•˜๋ฉด:

      1. is๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException.

      2. registry๋ฅผ ๋‹ค์Œ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: options["customElementRegistry"].

    3. registry๊ฐ€ null์ด ์•„๋‹ˆ๊ณ , registry์˜ ๋ฒ”์œ„ ์ง€์ • ์—ฌ๋ถ€๊ฐ€ false์ด๋ฉฐ, registry๊ฐ€ ๋‹ค์Œ์ด ์•„๋‹ˆ๋ฉด: document์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ, ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException.

  4. registry์™€ is๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

createElement() ์™€ createElementNS()์˜ options ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์›น ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๋ฌธ์ž์—ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ createDocumentFragment() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๋ฌธ์„œ ์กฐ๊ฐ ์ƒ์„ฑ. ์ฃผ์–ด์ง„ ๊ฐ’์€ this์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ createTextNode(data) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ํ…์ŠคํŠธ ๋…ธ๋“œ ์ƒ์„ฑ. ์ฃผ์–ด์ง„ ๊ฐ’์€ this์™€ data์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ createCDATASection(data) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๋งŒ์•ฝ this ๊ฐ€ HTML ๋ฌธ์„œ์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException.

  2. data์— ๋ฌธ์ž์—ด "]]>"๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidCharacterError" DOMException.

  3. ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: CDATA ์„น์…˜ ๋…ธ๋“œ ์ƒ์„ฑ. ์ฃผ์–ด์ง„ ๊ฐ’์€ this ์™€ data์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ createComment(data) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์ฃผ์„ ๋…ธ๋“œ ์ƒ์„ฑ. ์ฃผ์–ด์ง„ ๊ฐ’์€ this์™€ data์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ createProcessingInstruction(target, data) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์ƒ์„ฑํ•˜๋Š” ์ฒ˜๋ฆฌ ๋ช…๋ น ๋…ธ๋“œ. ์ฃผ์–ด์ง„ ๊ฐ’์€ this, target, ๊ทธ๋ฆฌ๊ณ  data์ž…๋‹ˆ๋‹ค.


clone = document . importNode(node [, options = false])

node์˜ ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. options๊ฐ€ true์ด๊ฑฐ๋‚˜ options๊ฐ€ ๋”•์…”๋„ˆ๋ฆฌ์ด๋ฉฐ ๊ทธ selfOnly ๊ฐ€ false์ด๋ฉด, ๋ณต์‚ฌ๋ณธ์—๋Š” ๋‹ค์Œ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค: node์˜ ์ž์†.

options์˜ customElementRegistry ๋Š” ๋‹ค์Œ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: CustomElementRegistry ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์€ ์š”์†Œ์˜ ํ•ด๋‹น ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ.

node๊ฐ€ ๋ฌธ์„œ ๋˜๋Š” ์„€๋„ ๋ฃจํŠธ์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException.

node = document . adoptNode(node)

node๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์„œ์—์„œ ์ด๋™ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

node๊ฐ€ ๋ฌธ์„œ์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException ๋˜๋Š”, node๊ฐ€ ์„€๋„ ๋ฃจํŠธ์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "HierarchyRequestError" DOMException.

๋‹ค์Œ importNode(node, options) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. node๊ฐ€ ๋ฌธ์„œ ๋˜๋Š” ์„€๋„ ๋ฃจํŠธ์ด๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: ๋‹ค์Œ "NotSupportedError" DOMException.

  2. subtree๋ฅผ false๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. registry๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. options๊ฐ€ ๋ถˆ๋ฆฌ์–ธ์ด๋ฉด, subtree๋ฅผ options๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

    1. subtree๋ฅผ ๋‹ค์Œ์˜ ๋…ผ๋ฆฌ ๋ถ€์ •์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: options["selfOnly"].

    2. ๋งŒ์•ฝ options["customElementRegistry"] ๊ฐ€ ์กด์žฌํ•˜๋ฉด, registry๋ฅผ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. registry์˜ ๋ฒ”์œ„ ์ง€์ • ์—ฌ๋ถ€๊ฐ€ false์ด๊ณ  registry๊ฐ€ this์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException.

  6. registry๊ฐ€ null์ด๋ฉด, registry๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์กฐํšŒ ์ฃผ์–ด์ง„ ๊ฐ’์€ this์ž…๋‹ˆ๋‹ค.

  7. ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: ๋…ธ๋“œ ๋ณต์ œ. ์ฃผ์–ด์ง„ ๊ฐ’์€ node์ด๋ฉฐ, document๋Š” this๋กœ ์„ค์ •ํ•˜๊ณ , subtree๋Š” subtree๋กœ ์„ค์ •ํ•˜๋ฉฐ, fallbackRegistry๋Š” registry๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ช…์„ธ๋Š” ๋‹ค์Œ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์ฑ„ํƒ ๋‹จ๊ณ„. ๋Œ€์ƒ์€ ๋ชจ๋“  ๋˜๋Š” ์ผ๋ถ€ ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” node์™€ oldDocument๊ฐ€ ์ „๋‹ฌ๋˜๋ฉฐ, ์ด๋Š” ๋‹ค์Œ์— ๋ช…์‹œ๋œ ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค: ์ฑ„ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฑ„ํƒํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ node๋ฅผ ๋ฐ›์•„๋“ค์ด๋Š” ๊ฒƒ์€ ๋‹ค์Œ ๋ฌธ์„œ document์ž…๋‹ˆ๋‹ค:

  1. oldDocument๋ฅผ node์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. node์˜ ๋ถ€๋ชจ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค: node๋ฅผ.

  3. document๊ฐ€ oldDocument๊ฐ€ ์•„๋‹ˆ๋ฉด, ๊ฐ inclusiveDescendant์— ๋Œ€ํ•ด, node์˜ ์„€๋„๋ฅผ ํฌํ•จํ•˜๋Š” ํฌ๊ด„์  ์ž์†์„ ๋‹ค์Œ ์„€๋„๋ฅผ ํฌํ•จํ•˜๋Š” ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

    1. inclusiveDescendant์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋ฅผ document๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. inclusiveDescendant๊ฐ€ ์„€๋„ ๋ฃจํŠธ์ด๊ณ  ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฐธ์ด๋ฉด:

      inclusiveDescendant์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๋‹ค์Œ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: document์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ์œ ํšจ ์ „์—ญ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ.

    3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , inclusiveDescendant๊ฐ€ ์š”์†Œ์ด๋ฉด:

      1. ๋‹ค์Œ ๋…ธ๋“œ ๋ฌธ์„œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์†์„ฑ์€ inclusiveDescendant์˜ ์†์„ฑ ๋ชฉ๋ก์— ์žˆ์œผ๋ฉฐ, ์„ค์ •ํ•  ๊ฐ’์€ document์ž…๋‹ˆ๋‹ค.

      2. inclusiveDescendant์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๊ฐ€ null์ด๊ฑฐ๋‚˜ inclusiveDescendant์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ๋ฒ”์œ„ ์ง€์ • ์—ฌ๋ถ€๊ฐ€ false์ด๋ฉด:

        1. registry๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

        2. inclusiveDescendant์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๊ฐ€ null์ด ์•„๋‹ˆ๊ฑฐ๋‚˜, inclusiveDescendant์˜ ๋ถ€๋ชจ๊ฐ€ null์ด๊ฑฐ๋‚˜, inclusiveDescendant์˜ ๋ถ€๋ชจ๊ฐ€ ๋ฐฐํƒ€์  DocumentFragment ๋…ธ๋“œ์ด๋ฉด, registry๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •ํ•  ๊ฐ’์€ document์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค.

        3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, registry๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์กฐํšŒ. ์ฃผ์–ด์ง„ ๊ฐ’์€ inclusiveDescendant์˜ ๋ถ€๋ชจ์ž…๋‹ˆ๋‹ค.

        4. inclusiveDescendant์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๋‹ค์Œ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: registry์˜ ์œ ํšจ ์ „์—ญ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ.

      3. inclusiveDescendant๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜์ด๋ฉด, ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ฝœ๋ฐฑ ๋ฐ˜์‘์„ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ๊ฐ’์€ inclusiveDescendant, ์ฝœ๋ฐฑ ์ด๋ฆ„ "adoptedCallback", ๊ทธ๋ฆฌ๊ณ  ยซ oldDocument, document ยป์ž…๋‹ˆ๋‹ค.

    4. ๋‹ค์Œ ์ฑ„ํƒ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ๊ฐ’์€ inclusiveDescendant์™€ oldDocument์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ adoptNode(node) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. node๊ฐ€ ๋ฌธ์„œ์ด๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException.

  2. node๊ฐ€ ์„€๋„ ๋ฃจํŠธ์ด๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "HierarchyRequestError" DOMException.

  3. ์ฑ„ํƒํ•ฉ๋‹ˆ๋‹ค: node๋ฅผ this๋กœ.

  4. node๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


null ๋˜๋Š” CustomElementRegistry ๊ฐ์ฒด์ธ registry๋Š” ๋‹ค์Œ์ผ ๋•Œ ์ „์—ญ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค: registry๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  registry์˜ ๋ฒ”์œ„ ์ง€์ • ์—ฌ๋ถ€๊ฐ€ false์ž…๋‹ˆ๋‹ค.

null ๋˜๋Š” CustomElementRegistry ๊ฐ์ฒด์ธ registry์˜ ์œ ํšจ ์ „์—ญ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. registry๊ฐ€ ์ „์—ญ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์ด๋ฉด, ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: registry๋ฅผ.

  2. null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


๋‹ค์Œ createAttribute(localName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. localName์ด ์œ ํšจํ•œ ์†์„ฑ ๋กœ์ปฌ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidCharacterError" DOMException.

  2. ๋งŒ์•ฝ this๊ฐ€ HTML ๋ฌธ์„œ์ด๋ฉด, ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: localName์„ ๋‹ค์Œ์œผ๋กœ: localName์„ ASCII ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’.
  3. ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: ์†์„ฑ ์ƒ์„ฑ. ์ฃผ์–ด์ง„ ๊ฐ’์€ this์™€ localName์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ createAttributeNS(namespace, qualifiedName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. (namespace, prefix, localName)์„ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์ถ”์ถœ. ๋Œ€์ƒ์€ namespace์™€ qualifiedName์ด๋ฉฐ, ์ฃผ์–ด์ง„ ๊ฐ’์€ "attribute"์ž…๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: ์†์„ฑ ์ƒ์„ฑ. ์ฃผ์–ด์ง„ ๊ฐ’์€ this, localName, namespace, ๊ทธ๋ฆฌ๊ณ  prefix์ž…๋‹ˆ๋‹ค.


๋‹ค์Œ 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์ด๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException.

  4. constructor๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‹ค์Œ์— ๋…ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉด: ๊ด€๋ จ ์ „์—ญ ๊ฐ์ฒด, ๊ทธ ์†Œ์œ ์ž๋Š” this์ด๋ฉฐ, ์ด ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException.

    ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ผ๋ถ€ ๊ตฌ์„ฑ์—์„œ ํ„ฐ์น˜ ์ด๋ฒคํŠธ ์ง€์›์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉฐ, ์ด ๊ฒฝ์šฐ ์ด ์กฐํ•ญ์€ ๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค: TouchEvent.

  5. event๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์ด๋ฒคํŠธ ์ƒ์„ฑ. ์ฃผ์–ด์ง„ ๊ฐ’์€ constructor์ž…๋‹ˆ๋‹ค.

  6. ์ดˆ๊ธฐํ™”ํ•  ๊ฒƒ์€ event์˜ type ์†์„ฑ์ด๋ฉฐ, ๋นˆ ๋ฌธ์ž์—ด๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  7. ์ดˆ๊ธฐํ™”ํ•  ๊ฒƒ์€ event์˜ timeStamp ์†์„ฑ์ด๋ฉฐ, ๋‹ค์Œ์„ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค: ํ˜„์žฌ ๊ณ ํ•ด์ƒ๋„ ์‹œ๊ฐ„. ์‚ฌ์šฉํ•  ๊ฐ’์€ this์˜ ๊ด€๋ จ ์ „์—ญ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

  8. ์ดˆ๊ธฐํ™”ํ•  ๊ฒƒ์€ event์˜ isTrusted ์†์„ฑ์ด๋ฉฐ, false๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  9. event์˜ ์ดˆ๊ธฐํ™”๋จ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

  10. event๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ƒ์„ฑ์ž๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๋‹ค์Œ createRange() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ ๋ฒ”์œ„๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (this, 0)์„ ํ•ด๋‹น ๋ฒ”์œ„์˜ ์‹œ์ž‘๊ณผ ๋์œผ๋กœ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

๋‹ค์Œ Range() ์ƒ์„ฑ์ž๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋‹ค์Œ createNodeIterator(root, whatToShow, filter) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. iterator๋ฅผ ์ƒˆ๋กœ์šด NodeIterator ๊ฐ์ฒด๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. iterator์˜ ๋ฃจํŠธ๋ฅผ root๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. iterator์˜ ์ฐธ์กฐ๋ฅผ (root, true)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. iterator์˜ whatToShow๋ฅผ whatToShow๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. iterator์˜ ํ•„ํ„ฐ๋ฅผ filter๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. iterator๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ createTreeWalker(root, whatToShow, filter) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. walker๋ฅผ ์ƒˆ๋กœ์šด TreeWalker ๊ฐ์ฒด๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. walker์˜ ๋ฃจํŠธ์™€ walker์˜ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ root๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. walker์˜ whatToShow๋ฅผ whatToShow๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. walker์˜ ํ•„ํ„ฐ๋ฅผ filter๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. walker๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

4.5.1. ์ธํ„ฐํŽ˜์ด์Šค DOMImplementation

์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ๋‹ค์Œ DOMImplementation ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฌธ์„œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ทธ ๋ฌธ์„œ์™€ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[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(); // ๊ณผ๊ฑฐ์˜ ๊ธฐ๋Šฅ; ํ•ญ์ƒ true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค
};
doctype = document . implementation . createDocumentType(name, publicId, systemId)
๋ฐ˜ํ™˜๊ฐ’์€ ๋ฌธ์„œ ์œ ํ˜•์ด๋ฉฐ, ์ฃผ์–ด์ง„ name, publicId, systemId๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

name์ด ์œ ํšจํ•œ ๋ฌธ์„œ ์œ ํ˜• ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด, "InvalidCharacterError" DOMException ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

doc = document . implementation . createDocument(namespace, qualifiedName [, doctype = null])
๋ฐ˜ํ™˜๊ฐ’์€ XMLDocument์ด๋ฉฐ, ๋‹ค์Œ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค: ๋ฌธ์„œ ์š”์†Œ. ํ•ด๋‹น ์š”์†Œ์˜ ๋กœ์ปฌ ์ด๋ฆ„์€ qualifiedName์ด๊ณ  ํ•ด๋‹น ์š”์†Œ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” namespace์ž…๋‹ˆ๋‹ค(qualifiedName์ด ๋นˆ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค). ๋˜ํ•œ doctype์ด ์ฃผ์–ด์ง€๋ฉด ์ด๋ฅผ ๋ฌธ์„œ ์œ ํ˜•์œผ๋กœ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ createElementNS() ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋ฉฐ, ์ด๋Š” namespace์™€ qualifiedName์œผ๋กœ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ์˜ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.

doc = document . implementation . createHTMLDocument([title])
๋ฐ˜ํ™˜๊ฐ’์€ ๋ฌธ์„œ์ด๋ฉฐ, ๊ธฐ๋ณธ์ ์ธ ํŠธ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ  ๋‹ค์Œ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค: title ์š”์†Œ. ๋‹จ, title ์ธ์ˆ˜๊ฐ€ ์ƒ๋žต๋œ ๊ฒฝ์šฐ๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ createDocumentType(name, publicId, systemId) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. name์ด ์œ ํšจํ•œ ๋ฌธ์„œ ์œ ํ˜• ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidCharacterError" DOMException.

  2. ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: ๋ฌธ์„œ ์œ ํ˜• ์ƒ์„ฑ. ์ฃผ์–ด์ง„ ๊ฐ’์€ ์—ฐ๊ฒฐ๋œ ๋ฌธ์„œ, ์ฆ‰ this์— ์—ฐ๊ฒฐ๋œ ๋ฌธ์„œ์™€, name, publicId, ๊ทธ๋ฆฌ๊ณ  systemId์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ createDocument(namespace, qualifiedName, doctype) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. document๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ๋ฌธ์„œ ์ƒ์„ฑ. ์ด ๋ฌธ์„œ๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ XMLDocument์ด๋ฉฐ, ์ฃผ์–ด์ง„ ๊ฐ’์€ this์˜ ๊ด€๋ จ ๋ ๋ฆ„์ž…๋‹ˆ๋‹ค.

  2. element๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. qualifiedName์ด ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉด, element๋ฅผ ๋‹ค์Œ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ๋‚ด๋ถ€ createElementNS ๋‹จ๊ณ„. ์ฃผ์–ด์ง„ ๊ฐ’์€ document, namespace, qualifiedName, ๊ทธ๋ฆฌ๊ณ  ๋นˆ ๋”•์…”๋„ˆ๋ฆฌ์ž…๋‹ˆ๋‹ค.

  4. doctype์ด null์ด ์•„๋‹ˆ๋ฉด, ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: doctype์„ document์—.

  5. element๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: element๋ฅผ document์—.

  6. document์˜ ์ถœ์ฒ˜๋Š” this์— ์—ฐ๊ฒฐ๋œ ๋ฌธ์„œ์˜ ์ถœ์ฒ˜์ž…๋‹ˆ๋‹ค.

  7. document์˜ ์ฝ˜ํ…์ธ  ์œ ํ˜•์€ ๋‹ค์Œ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค: namespace:

    HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค
    application/xhtml+xml
    SVG ๋„ค์ž„์ŠคํŽ˜์ด์Šค
    image/svg+xml
    ๊ทธ ๋ฐ–์˜ ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค
    application/xml
  8. document๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ createHTMLDocument(title) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. doc์„ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ๋ฌธ์„œ ์ƒ์„ฑ. ์ด ๋ฌธ์„œ๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ Document์ด๋ฉฐ, ์ฃผ์–ด์ง„ ๊ฐ’์€ this์˜ ๊ด€๋ จ ๋ ๋ฆ„์ž…๋‹ˆ๋‹ค.

  2. doc์˜ ์œ ํ˜•์„ "html"๋กœ ์„ค์ •ํ•˜๊ณ  ์ฝ˜ํ…์ธ  ์œ ํ˜•์„ "text/html"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. doctype์„ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ๋ฌธ์„œ ์œ ํ˜• ์ƒ์„ฑ. ์ฃผ์–ด์ง„ ๊ฐ’์€ doc๊ณผ "html"์ž…๋‹ˆ๋‹ค.

  4. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: doctype์„ doc์—.

  5. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ. ์š”์†Œ ์ƒ์„ฑ์— ์ฃผ์–ด์ง„ ๊ฐ’์€ doc, "html", ๊ทธ๋ฆฌ๊ณ  HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ด๋ฉฐ, ๋ง๋ถ™์ผ ๋Œ€์ƒ์€ doc์ž…๋‹ˆ๋‹ค.

  6. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ. ์š”์†Œ ์ƒ์„ฑ์— ์ฃผ์–ด์ง„ ๊ฐ’์€ doc, "head", ๊ทธ๋ฆฌ๊ณ  HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ด๋ฉฐ, ๋ง๋ถ™์ผ ๋Œ€์ƒ์€ html ์š”์†Œ๋กœ, ์•ž์„œ ์ƒ์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  7. title์ด ์ฃผ์–ด์ง€๋ฉด:

    1. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: ๋‹ค์Œ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ. ์ƒ์„ฑํ•  ๊ฒƒ์€ ์š”์†Œ์ด๋ฉฐ, ์ฃผ์–ด์ง„ ๊ฐ’์€ doc, "title", ๊ทธ๋ฆฌ๊ณ  HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ๋ง๋ถ™์ผ ๋Œ€์ƒ์€ head ์š”์†Œ๋กœ, ์•ž์„œ ์ƒ์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    2. text๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ํ…์ŠคํŠธ ๋…ธ๋“œ ์ƒ์„ฑ. ์ฃผ์–ด์ง„ ๊ฐ’์€ doc๊ณผ title(๋นˆ ๋ฌธ์ž์—ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)์ž…๋‹ˆ๋‹ค.

    3. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: text๋ฅผ ๋‹ค์Œ title ์š”์†Œ์—. ์ด ์š”์†Œ๋Š” ์•ž์„œ ์ƒ์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  8. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ. ์š”์†Œ ์ƒ์„ฑ์— ์ฃผ์–ด์ง„ ๊ฐ’์€ doc, "body", ๊ทธ๋ฆฌ๊ณ  HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ด๋ฉฐ, ๋ง๋ถ™์ผ ๋Œ€์ƒ์€ html ์š”์†Œ๋กœ, ์•ž์„œ ์ƒ์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  9. doc์˜ ์ถœ์ฒ˜๋Š” this์— ์—ฐ๊ฒฐ๋œ ๋ฌธ์„œ์˜ ์ถœ์ฒ˜์ž…๋‹ˆ๋‹ค.

  10. 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 ๋…ธ๋“œ๋Š” ๊ฐ„๋‹จํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ€๋ฆ…๋‹ˆ๋‹ค: ๋ฌธ์„œ ์œ ํ˜•.

๋ฌธ์„œ ์œ ํ˜•์—๋Š” ๋‹ค์Œ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค: ์ด๋ฆ„(๋ฌธ์ž์—ด), ๊ณต๊ฐœ ID(๋ฌธ์ž์—ด), ๊ทธ๋ฆฌ๊ณ  ์‹œ์Šคํ…œ ID(๋ฌธ์ž์—ด).

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌธ์„œ ์œ ํ˜•์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ ๋ฌธ์„œ document, ๋ฌธ์ž์—ด name, ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์ ์œผ๋กœ ๋ฌธ์ž์—ด publicId(๊ธฐ๋ณธ๊ฐ’์€ ๋นˆ ๋ฌธ์ž์—ด)์™€ ๋ฌธ์ž์—ด systemId(๊ธฐ๋ณธ๊ฐ’์€ ๋นˆ ๋ฌธ์ž์—ด)์ž…๋‹ˆ๋‹ค:

  1. doctype์„ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ๋…ธ๋“œ ์ƒ์„ฑ. ์ด ๋…ธ๋“œ๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ DocumentType์ด๋ฉฐ, ์ฃผ์–ด์ง„ ๊ฐ’์€ document์ž…๋‹ˆ๋‹ค.

  2. doctype์˜ ์ด๋ฆ„์„ name์œผ๋กœ, ๊ณต๊ฐœ ID๋ฅผ publicId๋กœ, ๊ทธ๋ฆฌ๊ณ  ์‹œ์Šคํ…œ ID๋ฅผ systemId๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. doctype์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ name getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ์ด๋ฆ„.

๋‹ค์Œ publicId getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๊ณต๊ฐœ ID.

๋‹ค์Œ systemId getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ์‹œ์Šคํ…œ ID.

4.7. ์ธํ„ฐํŽ˜์ด์Šค DocumentFragment

[Exposed=Window]
interface DocumentFragment : Node {
  constructor();
};
tree = new DocumentFragment()
์ƒˆ๋กœ์šด DocumentFragment ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐํƒ€์  DocumentFragment ๋…ธ๋“œ๋Š” DocumentFragment ๋…ธ๋“œ์ด์ง€๋งŒ ShadowRoot ๋…ธ๋“œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

DocumentFragment ๋…ธ๋“œ์—๋Š” ์—ฐ๊ฒฐ๋œ ํ˜ธ์ŠคํŠธ(null ๋˜๋Š” ๋‹ค๋ฅธ ์š”์†Œ์ด๋ฉฐ, ์ด ์š”์†Œ๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ ํŠธ๋ฆฌ์— ์†ํ•ฉ๋‹ˆ๋‹ค)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ฌ๋ฆฌ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ null์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด A๊ฐ€ ํ˜ธ์ŠคํŠธ ํฌํ•จ ํฌ๊ด„์  ์กฐ์ƒ์ธ ๊ฒƒ์€ ๊ฐ์ฒด B์— ๋Œ€ํ•ด A๊ฐ€ ํฌ๊ด„์  ์กฐ์ƒ์ด๊ฑฐ๋‚˜, ๋˜๋Š” B์˜ ๋ฃจํŠธ์— null์ด ์•„๋‹Œ ํ˜ธ์ŠคํŠธ๊ฐ€ ์žˆ๊ณ  A๊ฐ€ ํ˜ธ์ŠคํŠธ ํฌํ•จ ํฌ๊ด„์  ์กฐ์ƒ์œผ๋กœ์„œ B์˜ ๋ฃจํŠธ์˜ ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•ด ์„ฑ๋ฆฝํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

DocumentFragment ๋…ธ๋“œ์˜ ํ˜ธ์ŠคํŠธ ๊ฐœ๋…์€ HTML์˜ template ์š”์†Œ์™€ ์„€๋„ ๋ฃจํŠธ์— ์œ ์šฉํ•˜๋ฉฐ, ์‚ฌ์ „ ์‚ฝ์ž… ๋ฐ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค: ๋ฌธ์„œ ์กฐ๊ฐ์„. ์ฃผ์–ด์ง„ ๊ฐ’์€ ๋ฌธ์„œ document์ž…๋‹ˆ๋‹ค: ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: ๋…ธ๋“œ ์ƒ์„ฑ. ์ด ๋…ธ๋“œ๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ DocumentFragment์ด๋ฉฐ, ์ฃผ์–ด์ง„ ๊ฐ’์€ document์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ new DocumentFragment() ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋ฅผ ํ˜„์žฌ ์ „์—ญ ๊ฐ์ฒด์˜ ์—ฐ๊ฒฐ๋œ Document๋กœ.

4.8. ์ธํ„ฐํŽ˜์ด์Šค ShadowRoot

[Exposed=Window]
interface ShadowRoot : DocumentFragment {
  readonly attribute ShadowRootMode mode;
  readonly attribute boolean delegatesFocus;
  readonly attribute boolean serializable;
  readonly attribute SlotAssignmentMode slotAssignment;
  readonly attribute boolean clonable;
  readonly attribute Element host;

  attribute EventHandler onslotchange;
};

enum ShadowRootMode { "open", "closed" };
enum SlotAssignmentMode { "manual", "named" };

ShadowRoot ๋…ธ๋“œ๋Š” ๊ฐ„๋‹จํžˆ ์„€๋„ ๋ฃจํŠธ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์„€๋„ ๋ฃจํŠธ์— ์—ฐ๊ฒฐ๋œ ํ˜ธ์ŠคํŠธ๋Š” ์ ˆ๋Œ€๋กœ null์ด ์•„๋‹™๋‹ˆ๋‹ค.

์„€๋„ ๋ฃจํŠธ์—๋Š” ์—ฐ๊ฒฐ๋œ ๋ชจ๋“œ("open" ๋˜๋Š” "closed")๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์„€๋„ ๋ฃจํŠธ์—๋Š” ์—ฐ๊ฒฐ๋œ ํฌ์ปค์Šค ์œ„์ž„ (๋ถˆ๋ฆฌ์–ธ)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

์„€๋„ ๋ฃจํŠธ์—๋Š” ๋‹ค์Œ ํ•ญ๋ชฉ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์†Œ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ(๋ถˆ๋ฆฌ์–ธ)์ด๋ฉฐ, ์ดˆ๊ธฐ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

์„€๋„ ๋ฃจํŠธ์—๋Š” ์—ฐ๊ฒฐ๋œ ์„ ์–ธ์  ์—ฌ๋ถ€ (๋ถˆ๋ฆฌ์–ธ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

์„€๋„ ๋ฃจํŠธ์—๋Š” ์—ฐ๊ฒฐ๋œ ์ง๋ ฌํ™” ๊ฐ€๋Šฅ ์—ฌ๋ถ€(๋ถˆ๋ฆฌ์–ธ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

์„€๋„ ๋ฃจํŠธ์—๋Š” ์—ฐ๊ฒฐ๋œ ์Šฌ๋กฏ ํ• ๋‹น ("manual" ๋˜๋Š” "named")์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์„€๋„ ๋ฃจํŠธ์—๋Š” ์—ฐ๊ฒฐ๋œ ๋ณต์ œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€(๋ถˆ๋ฆฌ์–ธ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

์„€๋„ ๋ฃจํŠธ์—๋Š” ์—ฐ๊ฒฐ๋œ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ (null ๋˜๋Š” CustomElementRegistry ๊ฐ์ฒด)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ๊ฐ’์€ null์ž…๋‹ˆ๋‹ค.

์„€๋„ ๋ฃจํŠธ์—๋Š” ๋‹ค์Œ ํ•ญ๋ชฉ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ null๋กœ ์œ ์ง€(๋ถˆ๋ฆฌ์–ธ)์ž…๋‹ˆ๋‹ค. ์ดˆ๊ธฐ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

์ด ๊ฐ’์€ ์„ ์–ธ์  ์„€๋„ ๋ฃจํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ๋•Œ๋งŒ true๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์„€๋„ ๋ฃจํŠธ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๊ฐ€ null์ธ ๋™์•ˆ์—๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


์„€๋„ ๋ฃจํŠธ์˜ ๋ถ€๋ชจ ๊ฐ€์ ธ์˜ค๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ event๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, event์˜ ํ•ฉ์„ฑ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜๊ณ  ์„€๋„ ๋ฃจํŠธ๊ฐ€ event์˜ ๊ฒฝ๋กœ์—์„œ ์ฒซ ๋ฒˆ์งธ ์ด๋ฒคํŠธ ๊ฒฝ๋กœ ํ•ญ๋ชฉ์˜ ํ˜ธ์ถœ ๋Œ€์ƒ์˜ ๋ฃจํŠธ์ด๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์„€๋„ ๋ฃจํŠธ์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


๋‹ค์Œ mode getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋ชจ๋“œ.

๋‹ค์Œ delegatesFocus getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ํฌ์ปค์Šค ์œ„์ž„ ์—ฌ๋ถ€.

๋‹ค์Œ serializable getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ์ง๋ ฌํ™” ๊ฐ€๋Šฅ ์—ฌ๋ถ€.

๋‹ค์Œ slotAssignment getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ์Šฌ๋กฏ ํ• ๋‹น.

๋‹ค์Œ clonable getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋ณต์ œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€.

๋‹ค์Œ host getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ํ˜ธ์ŠคํŠธ.


onslotchange ์†์„ฑ์€ onslotchange ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์œ„ํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ IDL ์†์„ฑ์ด๋ฉฐ, ํ•ด๋‹น ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์ด๋ฒคํŠธ ์œ ํ˜•์€ slotchange์ž…๋‹ˆ๋‹ค.


์„€๋„ ํฌํ•จ ํŠธ๋ฆฌ ์ˆœ์„œ๋Š” ์„€๋„ ํฌํ•จ ์ „์œ„ ๊นŠ์ด ์šฐ์„  ์ˆœํšŒ์— ๋”ฐ๋ฅธ ๋…ธ๋“œ ํŠธ๋ฆฌ์˜ ์ˆœ์„œ์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ ํŠธ๋ฆฌ tree์˜ ์„€๋„ ํฌํ•จ ์ „์œ„ ๊นŠ์ด ์šฐ์„  ์ˆœํšŒ๋Š” tree์˜ ์ „์œ„ ๊นŠ์ด ์šฐ์„  ์ˆœํšŒ์ด๋ฉฐ, ๊ฐ ์„€๋„ ํ˜ธ์ŠคํŠธ๋ฅผ tree์—์„œ ๋งŒ๋‚  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์š”์†Œ์˜ ์„€๋„ ๋ฃจํŠธ์˜ ๋…ธ๋“œ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ์„€๋„ ํฌํ•จ ์ „์œ„ ๊นŠ์ด ์šฐ์„  ์ˆœํšŒ๋ฅผ ์„€๋„ ํ˜ธ์ŠคํŠธ๋ฅผ ๋งŒ๋‚œ ์งํ›„์— ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด์˜ ์„€๋„ ํฌํ•จ ๋ฃจํŠธ๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ฃจํŠธ์˜ ํ˜ธ์ŠคํŠธ์˜ ์„€๋„ ํฌํ•จ ๋ฃจํŠธ์ž…๋‹ˆ๋‹ค. ๋‹จ, ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ฃจํŠธ๊ฐ€ ์„€๋„ ๋ฃจํŠธ์ธ ๊ฒฝ์šฐ์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ฃจํŠธ์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด A๊ฐ€ ๊ฐ์ฒด B์˜ ์„€๋„ ํฌํ•จ ์ž์†์ธ ๊ฒƒ์€ A๊ฐ€ B์˜ ์ž์†์ด๊ฑฐ๋‚˜, A์˜ ๋ฃจํŠธ๊ฐ€ ์„€๋„ ๋ฃจํŠธ์ด๊ณ  A์˜ ๋ฃจํŠธ์˜ ํ˜ธ์ŠคํŠธ๊ฐ€ B์˜ ์„€๋„ ํฌํ•จ ํฌ๊ด„์  ์ž์†์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

์„€๋„ ํฌํ•จ ํฌ๊ด„์  ์ž์†์€ ๊ฐ์ฒด ์ž์‹  ๋˜๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ์„€๋„ ํฌํ•จ ์ž์† ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด A๊ฐ€ ๊ฐ์ฒด B์˜ ์„€๋„ ํฌํ•จ ์กฐ์ƒ์ธ ๊ฒƒ์€ B๊ฐ€ A์˜ ์„€๋„ ํฌํ•จ ์ž์†์ธ ๊ฒฝ์šฐ์— ํ•œํ•ฉ๋‹ˆ๋‹ค.

์„€๋„ ํฌํ•จ ํฌ๊ด„์  ์กฐ์ƒ์€ ๊ฐ์ฒด ์ž์‹  ๋˜๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ์„€๋„ ํฌํ•จ ์กฐ์ƒ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ A๊ฐ€ ๋…ธ๋“œ B์—์„œ ๋‹ซํžŒ ์„€๋„์— ์˜ํ•ด ์ˆจ๊ฒจ์ง„ ๊ฒƒ์€ ๋‹ค์Œ ์กฐ๊ฑด์ด ๋ชจ๋‘ ์ฐธ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด B๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ์ฒด A์˜ ๋Œ€์ƒ์„ ์žฌ์ง€์ •ํ•˜๋ ค๋ฉด, ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฐธ์ด๋ฉด

    A๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. A๋ฅผ A์˜ ๋ฃจํŠธ์˜ ํ˜ธ์ŠคํŠธ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์ƒ ์žฌ์ง€์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด๋ฒคํŠธ ๋””์ŠคํŒจ์น˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ 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, (TrustedType or DOMString) value);
  [CEReactions] undefined setAttributeNS(DOMString? namespace, DOMString qualifiedName, (TrustedType or 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;
  boolean serializable = false;
  SlotAssignmentMode slotAssignment = "named";
  boolean clonable = false;
  CustomElementRegistry? customElementRegistry;
};

ShadowRootInit์€ ๋‹ค์†Œ ์ด๋ก€์ ์œผ๋กœ undefined์™€ null์„ ๋ชจ๋‘ customElementRegistry ๋ฉค๋ฒ„์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์ „ ๋Œ€์‹  ShadowRoot ๋…ธ๋“œ๋ฅผ attachShadow()์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Element ๋…ธ๋“œ๋Š” ๊ฐ„๋‹จํžˆ ์š”์†Œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์š”์†Œ์—๋Š” ๋‹ค์Œ ํ•ญ๋ชฉ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค
Null ๋˜๋Š” ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ
Null ๋˜๋Š” ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
๋กœ์ปฌ ์ด๋ฆ„
๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ
Null ๋˜๋Š” CustomElementRegistry ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ƒํƒœ
"undefined", "failed", "uncustomized", "precustomized" ๋˜๋Š” "custom"์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ •์˜
Null ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ •์˜์ž…๋‹ˆ๋‹ค.
is ๊ฐ’
Null ๋˜๋Š” ์œ ํšจํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

์š”์†Œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ด๋Ÿฌํ•œ ๊ฐ’์€ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

์š”์†Œ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ƒํƒœ๊ฐ€ "uncustomized" ๋˜๋Š” "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() ํ˜ธ์ถœ์„ ์ƒ๋žตํ–ˆ์Šต๋‹ˆ๋‹ค.
    }
  })
</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. qualifiedName์„ ๋‹ค์Œ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: this์˜ ํ•œ์ • ์ด๋ฆ„.

  2. ๋งŒ์•ฝ this๊ฐ€ HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๊ณ  ๊ทธ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ HTML ๋ฌธ์„œ์ด๋ฉด, ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: qualifiedName์„ ASCII ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’.

  3. qualifiedName์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ํ•œ์ • ์ด๋ฆ„๊ณผ HTML ๋Œ€๋ฌธ์žํ™”๋œ ํ•œ์ • ์ด๋ฆ„์„ ๋‚ด๋ถ€ ์Šฌ๋กฏ์— ์ €์žฅํ•˜์—ฌ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด, ๋ฌธ์„œ document, ๋ฌธ์ž์—ด localName, ๋ฌธ์ž์—ด ๋˜๋Š” null์ธ namespace, ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์ ์œผ๋กœ ๋ฌธ์ž์—ด ๋˜๋Š” null์ธ prefix(๊ธฐ๋ณธ๊ฐ’ null), ๋ฌธ์ž์—ด ๋˜๋Š” null์ธ is(๊ธฐ๋ณธ๊ฐ’ null), ๋ถˆ๋ฆฌ์–ธ synchronousCustomElements(๊ธฐ๋ณธ๊ฐ’ false), ๊ทธ๋ฆฌ๊ณ  "default", null ๋˜๋Š” CustomElementRegistry ๊ฐ์ฒด registry(๊ธฐ๋ณธ๊ฐ’ "default")๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ:

  1. result๋ฅผ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. registry๊ฐ€ "default"์ด๋ฉด registry๋ฅผ document๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์กฐํšŒํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. definition์„ registry, namespace, localName, is๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ •์˜๋ฅผ ์กฐํšŒํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. definition์ด null์ด ์•„๋‹ˆ๊ณ  definition์˜ ์ด๋ฆ„์ด ๋กœ์ปฌ ์ด๋ฆ„๊ณผ ๊ฐ™์ง€ ์•Š์œผ๋ฉด(์ฆ‰, definition์ด ์‚ฌ์šฉ์ž ์ •์˜ ๋‚ด์žฅ ์š”์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉด):

    1. interface๋ฅผ localName๊ณผ HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์š”์†Œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. result๋ฅผ document, interface, localName, HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค, prefix, "undefined", is, registry๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. synchronousCustomElements๊ฐ€ true์ด๋ฉด ์˜ˆ์™ธ๋ฅผ ํฌ์ฐฉํ•˜๋ฉด์„œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      1. definition์„ ์‚ฌ์šฉํ•˜์—ฌ result๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค.

      ์ด ๋‹จ๊ณ„์—์„œ ์˜ˆ์™ธ exception์ด ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด:

      1. definition์˜ ์ƒ์„ฑ์ž์— ๋Œ€์‘ํ•˜๋Š” JavaScript ๊ฐ์ฒด์˜ ์—ฐ๊ฒฐ๋œ ์˜์—ญ์˜ ์ „์—ญ ๊ฐ์ฒด์— ๋Œ€ํ•ด exception์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

      2. result์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ƒํƒœ๋ฅผ "failed"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    4. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด result์™€ definition์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐ˜์‘์„ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  5. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  definition์ด null์ด ์•„๋‹ˆ๋ฉด:

    1. synchronousCustomElements๊ฐ€ true์ด๋ฉด:

      1. C๋ฅผ definition์˜ ์ƒ์„ฑ์ž๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. previousRegistry๋ฅผ ์ฃผ๋ณ€ ์—์ด์ „ํŠธ์˜ ํ™œ์„ฑ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ƒ์„ฑ์ž ๋งต[C]์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋ฉฐ, ๊ธฐ๋ณธ๊ฐ’์€ null์ž…๋‹ˆ๋‹ค.

      3. ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋ณ€ ์—์ด์ „ํŠธ์˜ ํ™œ์„ฑ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ƒ์„ฑ์ž ๋งต[C]์„ registry๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      4. ์˜ˆ์™ธ๋ฅผ ํฌ์ฐฉํ•˜๋ฉด์„œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

        1. result๋ฅผ ์ธ์ˆ˜ ์—†์ด C๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

        2. ๋‹จ์–ธํ•ฉ๋‹ˆ๋‹ค: ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ฐธ์ž…๋‹ˆ๋‹ค.

          customElements.define("x-example", class extends HTMLElement {
            constructor() {
              // ๋น„์ค€์ˆ˜: super()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  ๊ธฐ์กด ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
              return document.createElement("p");
            }
          });
          
          document.createElement("x-example");
          

          ์—ฌ๊ธฐ์„œ result๋Š” p ์š”์†Œ์ด๋ฉฐ, ํ•ด๋‹น ์š”์†Œ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ƒํƒœ๋Š” "uncustomized"์ด๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ •์˜๋Š” null์ž…๋‹ˆ๋‹ค.

        3. ๋‹จ์–ธํ•ฉ๋‹ˆ๋‹ค: result์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

          IDL์€ result๊ฐ€ HTMLElement ๊ฐ์ฒด์ž„์„ ๋ณด์žฅํ•˜๋ฉฐ, ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋Š” ๋ชจ๋‘ HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

        4. result์˜ ์†์„ฑ ๋ชฉ๋ก์ด ๋น„์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด "NotSupportedError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

        5. result์— ์ž์‹์ด ์žˆ์œผ๋ฉด "NotSupportedError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

        6. result์˜ ๋ถ€๋ชจ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด "NotSupportedError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

        7. result์˜ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ document๊ฐ€ ์•„๋‹ˆ๋ฉด "NotSupportedError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

        8. result์˜ ๋กœ์ปฌ ์ด๋ฆ„์ด localName๊ณผ ๊ฐ™์ง€ ์•Š์œผ๋ฉด ๋˜์ง‘๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋Š” "NotSupportedError" DOMException์ž…๋‹ˆ๋‹ค.

        9. result์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๋ฅผ prefix๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

        10. result์˜ is ๊ฐ’์„ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

        11. result์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ registry๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

        ์ด ๋‹จ๊ณ„๋“ค ์ค‘ ํ•˜๋‚˜์—์„œ ์˜ˆ์™ธ exception์ด ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด:

        1. definition์˜ ์ƒ์„ฑ์ž์— ๋Œ€์‘ํ•˜๋Š” JavaScript ๊ฐ์ฒด์˜ ์—ฐ๊ฒฐ๋œ ์˜์—ญ์˜ ์ „์—ญ ๊ฐ์ฒด์— ๋Œ€ํ•ด exception์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

        2. result๋ฅผ document, HTMLUnknownElement, localName, HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค, prefix, "failed", null, registry๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      5. previousRegistry๊ฐ€ null์ด๋ฉด ์ฃผ๋ณ€ ์—์ด์ „ํŠธ์˜ ํ™œ์„ฑ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ƒ์„ฑ์ž ๋งต[C]์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

      6. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋ณ€ ์—์ด์ „ํŠธ์˜ ํ™œ์„ฑ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ƒ์„ฑ์ž ๋งต[C]์„ previousRegistry๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

      1. result๋ฅผ document, HTMLElement, localName, HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค, prefix, "undefined", null, registry๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. result์™€ definition์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐ˜์‘์„ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  6. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

    1. interface๋ฅผ localName๊ณผ namespace์— ๋Œ€ํ•œ ์š”์†Œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. result๋ฅผ document, interface, localName, namespace, prefix, "uncustomized", is, registry๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. namespace๊ฐ€ HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ด๊ณ , localName์ด ์œ ํšจํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ด๋ฆ„์ด๊ฑฐ๋‚˜ is๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด result์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ƒํƒœ๋ฅผ "undefined"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. result๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด, ๋ฌธ์„œ document, ์ธํ„ฐํŽ˜์ด์Šค interface, ๋ฌธ์ž์—ด localName, ๋ฌธ์ž์—ด ๋˜๋Š” null์ธ namespace, ๋ฌธ์ž์—ด ๋˜๋Š” null์ธ prefix, ๋ฌธ์ž์—ด state, ๋ฌธ์ž์—ด ๋˜๋Š” null์ธ is, ๊ทธ๋ฆฌ๊ณ  null ๋˜๋Š” CustomElementRegistry ๊ฐ์ฒด registry๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ:

  1. element๋ฅผ document๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ interface๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. element์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ namespace๋กœ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๋ฅผ prefix๋กœ, ๋กœ์ปฌ ์ด๋ฆ„์„ localName์œผ๋กœ, ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ registry๋กœ, ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ƒํƒœ๋ฅผ state๋กœ, ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ •์˜๋ฅผ null๋กœ, ๊ทธ๋ฆฌ๊ณ  is ๊ฐ’์„ is๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. ๋‹จ์–ธํ•ฉ๋‹ˆ๋‹ค: element์˜ ์†์„ฑ ๋ชฉ๋ก์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  4. element๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์š”์†Œ์—๋Š” ์†์„ฑ ๋ชฉ๋ก๋„ ์žˆ์œผ๋ฉฐ, ์ด๋Š” NamedNodeMap์„ ํ†ตํ•ด ๋…ธ์ถœ๋˜๋Š” ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ์š”์†Œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํ•ด๋‹น ์š”์†Œ์˜ ์†์„ฑ ๋ชฉ๋ก์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์†Œ์˜ ์†์„ฑ ๋ชฉ๋ก์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ์š”์†Œ๋Š” ์†์„ฑ A๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ช…์„ธ์™€ ๋‹ค๋ฅธ ๋ช…์„ธ์—์„œ๋Š” ์š”์†Œ์— ๋Œ€ํ•œ ์†์„ฑ ๋ณ€๊ฒฝ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” element, localName, oldValue, value, namespace๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

์†์„ฑ attribute์˜ ์†์„ฑ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด, element, oldValue, newValue๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. element์— ๋Œ€ํ•ด "attributes" ์œ ํ˜•์˜ ๋ณ€๊ฒฝ ๋ ˆ์ฝ”๋“œ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ attribute์˜ ๋กœ์ปฌ ์ด๋ฆ„, attribute์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค, oldValue, ยซ ยป, ยซ ยป, null, null์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  2. element๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ์ด๋ฉด, element, ์ฝœ๋ฐฑ ์ด๋ฆ„ "attributeChangedCallback", ยซ attribute์˜ ๋กœ์ปฌ ์ด๋ฆ„, oldValue, newValue, attribute์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ยป๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ฝœ๋ฐฑ ๋ฐ˜์‘์„ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  3. element, attribute์˜ ๋กœ์ปฌ ์ด๋ฆ„, oldValue, newValue, attribute์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†์„ฑ ๋ณ€๊ฒฝ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ attribute๋ฅผ value๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด:

  1. oldValue๋ฅผ attribute์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. attribute์˜ ๊ฐ’์„ value๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. attribute์— ๋Œ€ํ•œ ์†์„ฑ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ attribute์˜ ์š”์†Œ, oldValue, value๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ attribute๋ฅผ ์š”์†Œ element์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด:

  1. attribute๋ฅผ element์˜ ์†์„ฑ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  2. attribute์˜ ์š”์†Œ๋ฅผ element๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. attribute์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋ฅผ element์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. attribute์— ๋Œ€ํ•œ ์†์„ฑ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ element, null, attribute์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ attribute๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด:

  1. element๋ฅผ attribute์˜ ์š”์†Œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. attribute๋ฅผ element์˜ ์†์„ฑ ๋ชฉ๋ก์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  3. attribute์˜ ์š”์†Œ๋ฅผ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. attribute์— ๋Œ€ํ•œ ์†์„ฑ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ element, attribute์˜ ๊ฐ’, null์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ oldAttribute๋ฅผ ์†์„ฑ newAttribute๋กœ ๊ต์ฒดํ•˜๋ ค๋ฉด:

  1. element๋ฅผ oldAttribute์˜ ์š”์†Œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. element์˜ ์†์„ฑ ๋ชฉ๋ก์—์„œ oldAttribute๋ฅผ newAttribute๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

  3. newAttribute์˜ ์š”์†Œ๋ฅผ element๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. newAttribute์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋ฅผ element์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. oldAttribute์˜ ์š”์†Œ๋ฅผ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. oldAttribute์— ๋Œ€ํ•œ ์†์„ฑ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ element, oldAttribute์˜ ๊ฐ’, newAttribute์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


๋ฌธ์ž์—ด qualifiedName๊ณผ ์š”์†Œ element๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์ด๋ฆ„์œผ๋กœ ์†์„ฑ์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด:

  1. element๊ฐ€ HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๊ณ  ํ•ด๋‹น ์š”์†Œ์˜ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ HTML ๋ฌธ์„œ์ด๋ฉด qualifiedName์„ qualifiedName์˜ ASCII ์†Œ๋ฌธ์ž ํ˜•ํƒœ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. element์˜ ์†์„ฑ ๋ชฉ๋ก์—์„œ ํ•œ์ • ์ด๋ฆ„์ด qualifiedName์ธ ์ฒซ ๋ฒˆ์งธ ์†์„ฑ์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์—†์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Null ๋˜๋Š” ๋ฌธ์ž์—ด namespace, ๋ฌธ์ž์—ด localName, ๊ทธ๋ฆฌ๊ณ  ์š”์†Œ element๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๋กœ์ปฌ ์ด๋ฆ„์œผ๋กœ ์†์„ฑ์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด:

  1. namespace๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. element์˜ ์†์„ฑ ๋ชฉ๋ก์—์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ namespace์ด๊ณ  ๋กœ์ปฌ ์ด๋ฆ„์ด localName์ธ ์†์„ฑ์ด ์žˆ์œผ๋ฉด ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์š”์†Œ element, ๋ฌธ์ž์—ด localName, ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์ ์œผ๋กœ null ๋˜๋Š” ๋ฌธ์ž์—ด namespace(๊ธฐ๋ณธ๊ฐ’ null)๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด:

  1. attr์„ namespace, localName, element๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ์„ ๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. attr์ด null์ด๋ฉด ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. attr์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ attr๊ณผ ์š”์†Œ element๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ์„ ์„ค์ •ํ•˜๋ ค๋ฉด:

  1. verifiedValue๋ฅผ attr์˜ ๋กœ์ปฌ ์ด๋ฆ„, attr์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค, element, ๊ทธ๋ฆฌ๊ณ  attr์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์ค€์ˆ˜ํ•˜๋Š” ์†์„ฑ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. [TRUSTED-TYPES]

  2. attr์˜ ์š”์†Œ๊ฐ€ null๋„ element๋„ ์•„๋‹ˆ๋ฉด "InUseAttributeError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  3. oldAttr์„ attr์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค, attr์˜ ๋กœ์ปฌ ์ด๋ฆ„, ๊ทธ๋ฆฌ๊ณ  element๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ์„ ๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. oldAttr์ด attr์ด๋ฉด attr์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. attr์˜ ๊ฐ’์„ verifiedValue๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. oldAttr์ด null์ด ์•„๋‹ˆ๋ฉด oldAttr์„ attr๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

  7. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด attr์„ element์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  8. oldAttr์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์š”์†Œ element, ๋ฌธ์ž์—ด localName, ๋ฌธ์ž์—ด value, ์„ ํƒ์ ์œผ๋กœ null ๋˜๋Š” ๋ฌธ์ž์—ด prefix(๊ธฐ๋ณธ๊ฐ’ null), ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์ ์œผ๋กœ null ๋˜๋Š” ๋ฌธ์ž์—ด namespace(๊ธฐ๋ณธ๊ฐ’ null)๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ ๊ฐ’์„ ์„ค์ •ํ•˜๋ ค๋ฉด:

  1. attribute๋ฅผ namespace, localName, element๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ์„ ๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. attribute๊ฐ€ null์ด๋ฉด element์˜ ๋…ธ๋“œ ๋ฌธ์„œ, localName, namespace, prefix, value๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ์„ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋ฅผ element์— ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  3. attribute๋ฅผ value๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด qualifiedName๊ณผ ์š”์†Œ element๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์ด๋ฆ„์œผ๋กœ ์†์„ฑ์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด:

  1. attr์„ qualifiedName๊ณผ element๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ์„ ๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. attr์ด null์ด ์•„๋‹ˆ๋ฉด attr์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  3. attr์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Null ๋˜๋Š” ๋ฌธ์ž์—ด namespace, ๋ฌธ์ž์—ด localName, ๊ทธ๋ฆฌ๊ณ  ์š”์†Œ element๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๋กœ์ปฌ ์ด๋ฆ„์œผ๋กœ ์†์„ฑ์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด:

  1. attr์„ namespace, localName, element๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ์„ ๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. attr์ด null์ด ์•„๋‹ˆ๋ฉด attr์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  3. attr์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


์š”์†Œ์—๋Š” ์—ฐ๊ฒฐ๋œ ๊ณ ์œ  ์‹๋ณ„์ž(ID)๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณผ๊ฑฐ์—๋Š” ์š”์†Œ๊ฐ€ ์—ฌ๋Ÿฌ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด HTML์˜ id ์†์„ฑ๊ณผ DTD๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด ๋ช…์„ธ์—์„œ๋Š” ID๋ฅผ DOM์˜ ๊ฐœ๋…์œผ๋กœ ์ •์˜ํ•˜๊ณ , ๊ฐ ์š”์†Œ์— ํ•˜๋‚˜๋งŒ ํ—ˆ์šฉํ•˜๋ฉฐ, id ์†์„ฑ์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์š”์†Œ์˜ ID๋ฅผ ๊ฐฑ์‹ ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์†์„ฑ ๋ณ€๊ฒฝ ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. localName์ด id์ด๊ณ  namespace๊ฐ€ null์ด๋ฉฐ value๊ฐ€ null ๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด element์˜ ID๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  localName์ด id์ด๋ฉฐ namespace๊ฐ€ null์ด๋ฉด element์˜ ID๋ฅผ value๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ช…์„ธ์—์„œ๋Š” ๋ชจ๋“  ์š”์†Œ์˜ class, id, slot ์†์„ฑ์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ •์˜ํ•˜์ง€๋งŒ, ์š”์†Œ์—์„œ ์ด๋Ÿฌํ•œ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•œ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด์„œ๋Š” ๊ทœ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๋…ธ๋“œ์˜ ๋ถ€๋ชจ๊ฐ€ Element ์œ ํ˜•์ด๋ฉด ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ์š”์†Œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๊ฐ€ ๋‹ค๋ฅธ ์œ ํ˜•์ด๋ผ๋ฉด ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ์š”์†Œ๋Š” null์ž…๋‹ˆ๋‹ค.


namespace = element . namespaceURI
๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
prefix = element . prefix
๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
localName = element . localName
๋กœ์ปฌ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
qualifiedName = element . tagName
HTML ๋Œ€๋ฌธ์žํ™”๋œ ํ•œ์ • ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ namespaceURI getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค.

๋‹ค์Œ prefix getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ.

๋‹ค์Œ localName getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋กœ์ปฌ ์ด๋ฆ„.

๋‹ค์Œ tagName getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ HTML ๋Œ€๋ฌธ์žํ™” ํ•œ์ • ์ด๋ฆ„.


element . id [ = value ]

element์˜ id ์ฝ˜ํ…์ธ  ์†์„ฑ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

element . className [ = value ]

element์˜ class ์ฝ˜ํ…์ธ  ์†์„ฑ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

element . classList

element์˜ class ์ฝ˜ํ…์ธ  ์†์„ฑ์„ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ํ† ํฐ ์ง‘ํ•ฉ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ, ๋‹ค์Œ DOMTokenList ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

element . slot [ = value ]

element์˜ slot ์ฝ˜ํ…์ธ  ์†์„ฑ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ๋ฐ˜์˜ํ•˜๋„๋ก ์ •์˜๋œ IDL ์†์„ฑ์€, ๋ฌธ์ž์—ด name์— ๋Œ€ํ•ด ๋‹ค์Œ getter ๋ฐ setter ๋‹จ๊ณ„๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค:

getter ๋‹จ๊ณ„

๋‹ค์Œ์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: ์†์„ฑ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ. ์ฃผ์–ด์ง„ ๊ฐ’์€ this ์™€ name์ž…๋‹ˆ๋‹ค.

setter ๋‹จ๊ณ„

์†์„ฑ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, name๊ณผ ์ฃผ์–ด์ง„ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ id ์†์„ฑ์€ ๋ฐ˜๋“œ์‹œ ๋ฐ˜์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: "id"๋ฅผ.

๋‹ค์Œ className ์†์„ฑ์€ ๋ฐ˜๋“œ์‹œ ๋ฐ˜์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: "class"๋ฅผ.

๋‹ค์Œ classList getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: DOMTokenList ๊ฐ์ฒด๋กœ, ์—ฐ๊ฒฐ๋œ ์š”์†Œ๋Š” this์ด๊ณ  ์—ฐ๊ฒฐ๋œ ์†์„ฑ์˜ ๋กœ์ปฌ ์ด๋ฆ„์€ class์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ํ† ํฐ ์ง‘ํ•ฉ์€ ์ด ํŠน์ • DOMTokenList ๊ฐ์ฒด์— ์†ํ•˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ€๋ฅด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค: ์š”์†Œ์˜ ํด๋ž˜์Šค.

๋‹ค์Œ slot ์†์„ฑ์€ ๋ฐ˜๋“œ์‹œ ๋ฐ˜์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: "slot"์„.

id, class, slot์€ ์‚ฌ์‹ค์ƒ ์ดˆ์ „์—ญ ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์š”์†Œ์— ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์š”์†Œ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๋ฌด๊ด€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


element . hasAttributes()

element์— ์†์„ฑ์ด ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

element . getAttributeNames()

๋ฐ˜ํ™˜๊ฐ’์€ ํ•œ์ • ์ด๋ฆ„๋“ค์ด๋ฉฐ, element์˜ ๋ชจ๋“  ์†์„ฑ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ค‘๋ณต์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

element . getAttribute(qualifiedName)

๋ฐ˜ํ™˜๊ฐ’์€ element์˜ ์ฒซ ๋ฒˆ์งธ ์†์„ฑ์œผ๋กœ, ํ•ด๋‹น ์†์„ฑ์˜ ํ•œ์ • ์ด๋ฆ„์€ qualifiedName์ด๋ฉฐ, ๊ทธ๋Ÿฌํ•œ ์†์„ฑ์ด ์—†์œผ๋ฉด null์ž…๋‹ˆ๋‹ค.

element . getAttributeNS(namespace, localName)

๋ฐ˜ํ™˜๊ฐ’์€ element์˜ ์†์„ฑ์œผ๋กœ, ํ•ด๋‹น ์†์„ฑ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” namespace์ด๊ณ  ๋กœ์ปฌ ์ด๋ฆ„์€ localName์ž…๋‹ˆ๋‹ค. null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: ๊ทธ๋Ÿฌํ•œ ์†์„ฑ์ด ์—†๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

element . setAttribute(qualifiedName, value)

์„ค์ •ํ•  ๊ฐ’์€ element์˜ ์ฒซ ๋ฒˆ์งธ ์†์„ฑ์˜ ๊ฐ’์ด๋ฉฐ, ํ•ด๋‹น ์†์„ฑ์˜ ํ•œ์ • ์ด๋ฆ„์€ qualifiedName์ž…๋‹ˆ๋‹ค. ์„ค์ •ํ•  ๊ฐ’์€ value์ž…๋‹ˆ๋‹ค.

element . setAttributeNS(namespace, localName, value)

์„ค์ •ํ•  ๊ฐ’์€ element์˜ ์†์„ฑ์˜ ๊ฐ’์ด๋ฉฐ, ํ•ด๋‹น ์†์„ฑ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” namespace์ด๊ณ  ๋กœ์ปฌ ์ด๋ฆ„์€ localName์ž…๋‹ˆ๋‹ค. ๊ฐ’์„ value๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

element . removeAttribute(qualifiedName)

์ œ๊ฑฐํ•  ๊ฒƒ์€ element์˜ ์ฒซ ๋ฒˆ์งธ ์†์„ฑ์œผ๋กœ, ํ•ด๋‹น ์†์„ฑ์˜ ํ•œ์ • ์ด๋ฆ„์€ qualifiedName์ž…๋‹ˆ๋‹ค.

element . removeAttributeNS(namespace, localName)

์ œ๊ฑฐํ•  ๊ฒƒ์€ element์˜ ์†์„ฑ์œผ๋กœ, ํ•ด๋‹น ์†์„ฑ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” namespace์ด๊ณ  ๋กœ์ปฌ ์ด๋ฆ„์€ localName์ž…๋‹ˆ๋‹ค.

element . toggleAttribute(qualifiedName [, force])

force๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์œผ๋ฉด, qualifiedName์„ "์ „ํ™˜"ํ•˜๋ฉฐ, ํ•ด๋‹น ์†์„ฑ์ด ์žˆ์œผ๋ฉด ์ œ๊ฑฐํ•˜๊ณ  ์—†์œผ๋ฉด ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. force๊ฐ€ true์ด๋ฉด, ์ถ”๊ฐ€ํ•  ๊ฒƒ์€ qualifiedName์ž…๋‹ˆ๋‹ค. force๊ฐ€ false์ด๋ฉด, qualifiedName์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

qualifiedName์ด ํ˜„์žฌ ์กด์žฌํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

element . hasAttribute(qualifiedName)

true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์กฐ๊ฑด์€ element์— ์†์„ฑ์ด ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์†์„ฑ์˜ ํ•œ์ • ์ด๋ฆ„์ด qualifiedName์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

element . hasAttributeNS(namespace, localName)

true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์กฐ๊ฑด์€ element์— ์†์„ฑ์ด ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์†์„ฑ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ€ namespace์ด๊ณ  ๋กœ์ปฌ ์ด๋ฆ„์ด localName์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ hasAttributes() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์กฐ๊ฑด์€ this์˜ ์†์„ฑ ๋ชฉ๋ก์ด ๋น„์–ด ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ attributes getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์—ฐ๊ฒฐ๋œ NamedNodeMap.

๋‹ค์Œ getAttributeNames() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๋‹ค์Œ ํ•œ์ • ์ด๋ฆ„๋“ค์„. ํ•ด๋‹น ์†์„ฑ๋“ค์€ this์˜ ์†์„ฑ ๋ชฉ๋ก์— ์žˆ์œผ๋ฉฐ, ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ์šด ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ด๋ฆ„๋“ค์ด ๊ณ ์œ ํ•˜๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ getAttribute(qualifiedName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. attr์„ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์†์„ฑ ๊ฐ€์ ธ์˜ค๊ธฐ. ์ฃผ์–ด์ง„ ๊ฐ’์€ qualifiedName๊ณผ this์ž…๋‹ˆ๋‹ค.

  2. attr์ด null์ด๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. ๋ฐ˜ํ™˜๊ฐ’์€ attr์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ getAttributeNS(namespace, localName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. attr์„ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์†์„ฑ ๊ฐ€์ ธ์˜ค๊ธฐ. ์ฃผ์–ด์ง„ ๊ฐ’์€ namespace, localName, ๊ทธ๋ฆฌ๊ณ  this์ž…๋‹ˆ๋‹ค.

  2. attr์ด null์ด๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. ๋ฐ˜ํ™˜๊ฐ’์€ attr์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ setAttribute(qualifiedName, value) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. qualifiedName์ด ์œ ํšจํ•œ ์†์„ฑ ๋กœ์ปฌ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidCharacterError" DOMException.

    ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ๋Š” ๋‹ฌ๋ฆฌ, qualifiedName์ด ํ•œ์ • ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ ์†์„ฑ์ด ์ด๋ฏธ ํ•ด๋‹น ํ•œ์ • ์ด๋ฆ„์œผ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ๋กœ์ปฌ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด๋Š” ์ƒˆ๋กœ์šด ์†์„ฑ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  2. ๋งŒ์•ฝ this๊ฐ€ HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๊ณ  ๊ทธ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ HTML ๋ฌธ์„œ์ด๋ฉด, qualifiedName์„ qualifiedName์˜ ๋‹ค์Œ ๋ณ€ํ™˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ASCII ์†Œ๋ฌธ์ž.

  3. verifiedValue๋ฅผ ๋‹ค์Œ์„ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์ค€์ˆ˜ํ•˜๋Š” ์†์„ฑ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ. ์‚ฌ์šฉํ•  ๊ฐ’์€ qualifiedName, null, this, ๊ทธ๋ฆฌ๊ณ  value์ž…๋‹ˆ๋‹ค. [TRUSTED-TYPES]

  4. attribute์„ ์ฒซ ๋ฒˆ์งธ ์†์„ฑ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ํ•ด๋‹น ์†์„ฑ์€ this์˜ ์†์„ฑ ๋ชฉ๋ก์— ์žˆ์œผ๋ฉฐ, ๊ทธ ํ•œ์ • ์ด๋ฆ„์€ qualifiedName์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. attribute์ด null์ด ์•„๋‹ˆ๋ฉด, ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค: attribute์„ verifiedValue๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  6. attribute์„ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ์†์„ฑ ์ƒ์„ฑ. ์ฃผ์–ด์ง„ ๊ฐ’์€ this์˜ ๋…ธ๋“œ ๋ฌธ์„œ, qualifiedName, null, null, ๊ทธ๋ฆฌ๊ณ  verifiedValue์ž…๋‹ˆ๋‹ค.

  7. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: attribute์„ this์—.

๋‹ค์Œ setAttributeNS(namespace, qualifiedName, value) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. (namespace, prefix, localName)์„ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์ถ”์ถœ. ๋Œ€์ƒ์€ namespace์™€ qualifiedName์ด๋ฉฐ, ์ฃผ์–ด์ง„ ๊ฐ’์€ "attribute"์ž…๋‹ˆ๋‹ค.

  2. verifiedValue๋ฅผ ๋‹ค์Œ์„ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์ค€์ˆ˜ํ•˜๋Š” ์†์„ฑ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ. ์‚ฌ์šฉํ•  ๊ฐ’์€ localName, namespace, this, ๊ทธ๋ฆฌ๊ณ  value์ž…๋‹ˆ๋‹ค. [TRUSTED-TYPES]

  3. ์†์„ฑ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์‚ฌ์šฉํ•  ๊ฐ’์€ localName, verifiedValue, prefix, ๊ทธ๋ฆฌ๊ณ  namespace์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ removeAttribute(qualifiedName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ์†์„ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ qualifiedName๊ณผ this์ด๋ฉฐ, ๊ทธ๋Ÿฐ ๋‹ค์Œ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ removeAttributeNS(namespace, localName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ์†์„ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ namespace, localName, ๊ทธ๋ฆฌ๊ณ  this์ด๋ฉฐ, ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฐ˜ํ™˜ํ•  ๊ฐ’์€ undefined์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ hasAttribute(qualifiedName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๋งŒ์•ฝ this๊ฐ€ HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๊ณ  ๊ทธ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ HTML ๋ฌธ์„œ์ด๋ฉด, qualifiedName์„ qualifiedName์˜ ๋‹ค์Œ ๋ณ€ํ™˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ASCII ์†Œ๋ฌธ์ž.

  2. true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์กฐ๊ฑด์€ this๊ฐ€ ๊ฐ€์ง€๋Š” ์†์„ฑ์˜ ํ•œ์ • ์ด๋ฆ„์ด qualifiedName์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ toggleAttribute(qualifiedName, force) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. qualifiedName์ด ์œ ํšจํ•œ ์†์„ฑ ๋กœ์ปฌ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidCharacterError" DOMException.

    ์œ„์˜ ์„ค๋ช…์„ ์ฐธ์กฐํ•˜์„ธ์š”. ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค: ํ•œ์ • ์ด๋ฆ„์ด ์•„๋‹Œ ๋กœ์ปฌ ์ด๋ฆ„์œผ๋กœ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

  2. ๋งŒ์•ฝ this๊ฐ€ HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๊ณ  ๊ทธ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ HTML ๋ฌธ์„œ์ด๋ฉด, qualifiedName์„ qualifiedName์˜ ๋‹ค์Œ ๋ณ€ํ™˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ASCII ์†Œ๋ฌธ์ž.

  3. attribute์„ ์ฒซ ๋ฒˆ์งธ ์†์„ฑ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ํ•ด๋‹น ์†์„ฑ์€ this์˜ ์†์„ฑ ๋ชฉ๋ก์— ์žˆ์œผ๋ฉฐ, ๊ทธ ํ•œ์ • ์ด๋ฆ„์€ qualifiedName์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. attribute์ด null์ด๋ฉด:

    1. force๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๊ฑฐ๋‚˜ true์ด๋ฉด, ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ. ์†์„ฑ ์ƒ์„ฑ์— ์ฃผ์–ด์ง„ ๊ฐ’์€ this์˜ ๋…ธ๋“œ ๋ฌธ์„œ ์™€ qualifiedName์ด๋ฉฐ, ๋ง๋ถ™์ผ ๋Œ€์ƒ์€ this์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. force๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๊ฑฐ๋‚˜ false์ด๋ฉด, ์†์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ qualifiedName๊ณผ this์ด๋ฉฐ, ๊ทธ๋Ÿฐ ๋‹ค์Œ false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  6. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ hasAttributeNS(namespace, localName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. namespace๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, ์ด๋ฅผ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์กฐ๊ฑด์€ this๊ฐ€ ๊ฐ€์ง€๋Š” ์†์„ฑ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ namespace์ด๊ณ  ๋กœ์ปฌ ์ด๋ฆ„์ด localName์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ getAttributeNode(qualifiedName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์†์„ฑ ๊ฐ€์ ธ์˜ค๊ธฐ. ์ฃผ์–ด์ง„ ๊ฐ’์€ qualifiedName๊ณผ this์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ getAttributeNodeNS(namespace, localName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์†์„ฑ ๊ฐ€์ ธ์˜ค๊ธฐ. ์ฃผ์–ด์ง„ ๊ฐ’์€ namespace, localName, ๊ทธ๋ฆฌ๊ณ  this์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ setAttributeNode(attr)์™€ setAttributeNodeNS(attr) ๋ฉ”์„œ๋“œ์˜ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์†์„ฑ ์„ค์ •. ์ฃผ์–ด์ง„ ๊ฐ’์€ attr๊ณผ this์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ removeAttributeNode(attr) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๋งŒ์•ฝ this์˜ ์†์„ฑ ๋ชฉ๋ก์ด ๋‹ค์Œ์„ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด: attr, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotFoundError" DOMException.

  2. ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค: attr์„.

  3. attr์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


shadow = element . attachShadow(init)

์ƒ์„ฑํ•  ๊ฒƒ์€ ์„€๋„ ๋ฃจํŠธ๋กœ, element์— ๋Œ€ํ•ด ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

shadow = element . shadowRoot

๋ฐ˜ํ™˜๊ฐ’์€ element์˜ ์„€๋„ ๋ฃจํŠธ์ด๋ฉฐ, ํ•ด๋‹น ๋ฃจํŠธ๊ฐ€ ์กด์žฌํ•˜๊ณ  ์„€๋„ ๋ฃจํŠธ์˜ ๋ชจ๋“œ๊ฐ€ "open"์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null์ž…๋‹ˆ๋‹ค.

์œ ํšจํ•œ ์„€๋„ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

์ด ๋ชฉ๋ก์€ ์˜๋„์ ์œผ๋กœ ์ œํ•œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์žฅ ์š”์†Œ๊ฐ€ ๋‚ด๋ถ€ ์„€๋„ ํŠธ๋ฆฌ๋ฅผ ํ–ฅํ›„ ํ•„์š”์— ๋”ฐ๋ผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ attachShadow(init) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. registry๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: this์˜ ๋…ธ๋“œ ๋ฌธ์„œ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ.

  2. ๋งŒ์•ฝ init["customElementRegistry"] ๊ฐ€ ์กด์žฌํ•˜๋ฉด, registry๋ฅผ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. registry๊ฐ€ null์ด ์•„๋‹ˆ๊ณ , registry์˜ ๋ฒ”์œ„ ์ง€์ • ์—ฌ๋ถ€๊ฐ€ false์ด๋ฉฐ, registry๊ฐ€ ๋‹ค์Œ์ด ์•„๋‹ˆ๋ฉด: this์˜ ๋…ธ๋“œ ๋ฌธ์„œ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException.

  4. ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค: ์„€๋„ ๋ฃจํŠธ ์—ฐ๊ฒฐ. ์‚ฌ์šฉํ•  ๊ฐ’์€ this, init["mode"], init["delegatesFocus"], init["serializable"], init["slotAssignment"], init["clonable"], ๊ทธ๋ฆฌ๊ณ  registry์ž…๋‹ˆ๋‹ค.

  5. ๋ฐ˜ํ™˜๊ฐ’์€ this์˜ ์„€๋„ ๋ฃจํŠธ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค: ์„€๋„ ๋ฃจํŠธ๋ฅผ. ์ฃผ์–ด์ง„ ๊ฐ’์€ ์š”์†Œ element, ๋ฌธ์ž์—ด mode, ๋ถˆ๋ฆฌ์–ธ delegatesFocus, ๋ถˆ๋ฆฌ์–ธ serializable, ๋ฌธ์ž์—ด slotAssignment, ๋ถˆ๋ฆฌ์–ธ clonable, ๊ทธ๋ฆฌ๊ณ  null ๋˜๋Š” CustomElementRegistry ๊ฐ์ฒด์ธ registry์ž…๋‹ˆ๋‹ค:

  1. element์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ๋‹ค์Œ์ด ์•„๋‹ˆ๋ฉด: HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException.

  2. element์˜ ๋กœ์ปฌ ์ด๋ฆ„์ด ๋‹ค์Œ์ด ์•„๋‹ˆ๋ฉด: ์œ ํšจํ•œ ์„€๋„ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException.

  3. element์˜ ๋กœ์ปฌ ์ด๋ฆ„์ด ์œ ํšจํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ด๋ฆ„์ด๊ฑฐ๋‚˜, element์˜ is ๊ฐ’์ด null์ด ์•„๋‹ˆ๋ฉด:

    1. definition์„ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ •์˜ ์กฐํšŒ ์ฃผ์–ด์ง„ ๊ฐ’์€ element์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ, ํ•ด๋‹น ์š”์†Œ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ํ•ด๋‹น ์š”์†Œ์˜ ๋กœ์ปฌ ์ด๋ฆ„, ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์š”์†Œ์˜ is ๊ฐ’์ž…๋‹ˆ๋‹ค.

    2. definition์ด null์ด ์•„๋‹ˆ๊ณ  definition์˜ ์„€๋„ ๋น„ํ™œ์„ฑํ™” ์—ฌ๋ถ€๊ฐ€ true์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException.

  4. element๊ฐ€ ์„€๋„ ํ˜ธ์ŠคํŠธ์ด๋ฉด:

    1. currentShadowRoot๋ฅผ element์˜ ์„€๋„ ๋ฃจํŠธ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฐธ์ด๋ฉด:

      ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException.

    3. ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค: currentShadowRoot์˜ ๋ชจ๋“  ์ž์‹์„, ๋‹ค์Œ ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ.

    4. currentShadowRoot์˜ ์„ ์–ธ์  ์—ฌ๋ถ€๋ฅผ false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    5. ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. shadow๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ๋…ธ๋“œ ์ƒ์„ฑ. ์ด ๋…ธ๋“œ๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ShadowRoot์ด๋ฉฐ, ์ฃผ์–ด์ง„ ๊ฐ’์€ element์˜ ๋…ธ๋“œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

  6. shadow์˜ ํ˜ธ์ŠคํŠธ๋ฅผ element๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. shadow์˜ ๋ชจ๋“œ๋ฅผ mode๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  8. shadow์˜ ํฌ์ปค์Šค ์œ„์ž„ ์—ฌ๋ถ€๋ฅผ delegatesFocus๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  9. element์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ƒํƒœ๊ฐ€ "precustomized" ๋˜๋Š” "custom"์ด๋ฉด, ์„ค์ •ํ•  ๊ฒƒ์€ shadow์˜ ์š”์†Œ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€์ด๋ฉฐ, ์„ค์ •ํ•  ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค.

  10. shadow์˜ ์„ ์–ธ์  ์—ฌ๋ถ€๋ฅผ false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  11. shadow์˜ ์ง๋ ฌํ™” ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ serializable๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  12. shadow์˜ ์Šฌ๋กฏ ํ• ๋‹น์„ slotAssignment๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  13. shadow์˜ ๋ณต์ œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ clonable๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  14. shadow์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ registry๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  15. element์˜ ์„€๋„ ๋ฃจํŠธ๋ฅผ shadow๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ shadowRoot getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. shadow๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: this์˜ ์„€๋„ ๋ฃจํŠธ.

  2. shadow๊ฐ€ null์ด๊ฑฐ๋‚˜ ๊ทธ ๋ชจ๋“œ๊ฐ€ "closed"์ด๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. shadow๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


registry = element . customElementRegistry

๋ฐ˜ํ™˜๊ฐ’์€ element์˜ CustomElementRegistry ๊ฐ์ฒด์ด๋ฉฐ, ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ customElementRegistry getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ.


element . closest(selectors)
๋ฐ˜ํ™˜๊ฐ’์€ (element์—์„œ ์‹œ์ž‘ํ•˜๋Š”) ์ฒซ ๋ฒˆ์งธ ํฌ๊ด„์  ์กฐ์ƒ์œผ๋กœ, ๋‹ค์Œ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค: selectors. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null์ž…๋‹ˆ๋‹ค.
element . matches(selectors)
true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์กฐ๊ฑด์€ selectors๋ฅผ element์˜ ๋ฃจํŠธ์— ๋Œ€ํ•ด ์ผ์น˜์‹œํ‚จ ๊ฒฐ๊ณผ๋กœ element๋ฅผ ์–ป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ closest(selectors) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. selector๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์„ ํƒ์ž ํŒŒ์‹ฑ. ์›๋ณธ์€ selectors์ž…๋‹ˆ๋‹ค. [SELECTORS4]

  2. selector๊ฐ€ ์‹คํŒจ์ด๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "SyntaxError" DOMException.

  3. elements๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: this์˜ ํฌ๊ด„์  ์กฐ์ƒ ์ค‘ ์š”์†Œ์ธ ๊ฒƒ๋“ค๋กœ, ์—ญ์ˆœ์˜ ํŠธ๋ฆฌ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

  4. elements์˜ ๊ฐ element์— ๋Œ€ํ•ด: ๋งŒ์•ฝ ์š”์†Œ์— ๋Œ€ํ•ด ์„ ํƒ์ž ์ผ์น˜์‹œํ‚ค๊ธฐ๋ฅผ, selector, element, ๊ทธ๋ฆฌ๊ณ  ๋ฒ”์œ„ ์ง€์ • ๋ฃจํŠธ์ธ this๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์„ฑ๊ณต์ด๋ฉด, element๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. [SELECTORS4]

  5. null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ matches(selectors)์™€ webkitMatchesSelector(selectors) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. selector๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์„ ํƒ์ž ํŒŒ์‹ฑ. ์›๋ณธ์€ selectors์ž…๋‹ˆ๋‹ค. [SELECTORS4]

  2. selector๊ฐ€ ์‹คํŒจ์ด๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "SyntaxError" DOMException.

  3. ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๊ฐ€, ์š”์†Œ์— ๋Œ€ํ•ด ์„ ํƒ์ž ์ผ์น˜์‹œํ‚ค๊ธฐ๋ฅผ, selector, this, ๊ทธ๋ฆฌ๊ณ  ๋ฒ”์œ„ ์ง€์ • ๋ฃจํŠธ์ธ this๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์„ฑ๊ณต์ด๋ฉด, true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. [SELECTORS4]


๋‹ค์Œ getElementsByTagName(qualifiedName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๋‹ค์Œ ํ•œ์ • ์ด๋ฆ„์„ ๊ฐ€์ง„ ์š”์†Œ ๋ชฉ๋ก: qualifiedName ๋Œ€์ƒ์€ this์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ getElementsByTagNameNS(namespace, localName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ namespace์ด๊ณ  ๋กœ์ปฌ ์ด๋ฆ„์ด localName์ธ ์š”์†Œ ๋ชฉ๋ก. ๋Œ€์ƒ์€ this์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ getElementsByClassName(classNames) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ํด๋ž˜์Šค ์ด๋ฆ„์ด classNames์ธ ์š”์†Œ ๋ชฉ๋ก ๋Œ€์ƒ์€ this์ž…๋‹ˆ๋‹ค.


๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธ์ ‘ ์‚ฝ์ž…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ ์š”์†Œ element, ๋ฌธ์ž์—ด where, ๊ทธ๋ฆฌ๊ณ  ๋…ธ๋“œ node์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์ค‘ ์ฒซ ๋ฒˆ์งธ๋กœ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์— ์—ฐ๊ฒฐ๋œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ, ASCII ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  where์™€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค:

"beforebegin"

element์˜ ๋ถ€๋ชจ๊ฐ€ null์ด๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: ์‚ฌ์ „ ์‚ฝ์ž…. node๋ฅผ ์‚ฝ์ž…ํ•  ๋Œ€์ƒ์€ element์˜ ๋ถ€๋ชจ์ด๋ฉฐ, element ์•ž์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

"afterbegin"

๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: ์‚ฌ์ „ ์‚ฝ์ž…. node๋ฅผ element์— ์‚ฝ์ž…ํ•˜๋ฉฐ, ๋‹ค์Œ์˜ ์•ž์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค: element์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹.

"beforeend"

๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: ์‚ฌ์ „ ์‚ฝ์ž…. node๋ฅผ element์— ์‚ฝ์ž…ํ•˜๋ฉฐ, ๋‹ค์Œ์˜ ์•ž์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค: null.

"afterend"

element์˜ ๋ถ€๋ชจ๊ฐ€ null์ด๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: ์‚ฌ์ „ ์‚ฝ์ž…. node๋ฅผ ์‚ฝ์ž…ํ•  ๋Œ€์ƒ์€ element์˜ ๋ถ€๋ชจ์ด๋ฉฐ, ์‚ฝ์ž… ์œ„์น˜๋Š” element์˜ ๋‹ค์Œ ํ˜•์ œ ์•ž์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด

์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "SyntaxError" DOMException.

๋‹ค์Œ insertAdjacentElement(where, element) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์ธ์ ‘ ์‚ฝ์ž…. ์ฃผ์–ด์ง„ ๊ฐ’์€ this, where, ๊ทธ๋ฆฌ๊ณ  element์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ insertAdjacentText(where, data) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. text๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ํ…์ŠคํŠธ ๋…ธ๋“œ ์ƒ์„ฑ. ์ฃผ์–ด์ง„ ๊ฐ’์€ this์˜ ๋…ธ๋“œ ๋ฌธ์„œ์™€ data์ž…๋‹ˆ๋‹ค.

  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. index๊ฐ€ this์˜ ์†์„ฑ ๋ชฉ๋ก์˜ ํฌ๊ธฐ ์ด์ƒ์ด๋ฉด ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: null.

  2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: this์˜ ์†์„ฑ ๋ชฉ๋ก[index].

๋‹ค์Œ NamedNodeMap ๊ฐ์ฒด์˜ ์ง€์›ํ•˜๋Š” ์†์„ฑ ์ด๋ฆ„์€ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ ๋ฐ˜ํ™˜๊ฐ’์ž…๋‹ˆ๋‹ค:

  1. names๋ฅผ ๋‹ค์Œ ํ•œ์ • ์ด๋ฆ„๋“ค๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด ์ด๋ฆ„๋“ค์€ ์†์„ฑ๋“ค์˜ ์ด๋ฆ„์ด๋ฉฐ, ์ด NamedNodeMap ๊ฐ์ฒด์˜ ์†์„ฑ ๋ชฉ๋ก์— ์žˆ๋Š” ๊ฒƒ์—์„œ ์ค‘๋ณต์„ ์ œ์™ธํ•˜๊ณ , ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

  2. ์ด NamedNodeMap ๊ฐ์ฒด์˜ ์š”์†Œ๊ฐ€ HTML ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๊ณ  ๊ทธ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ HTML ๋ฌธ์„œ์ด๋ฉด, ๊ฐ name(names์— ์†ํ•จ)์— ๋Œ€ํ•ด:

    1. lowercaseName์„ name์˜ ASCII ์†Œ๋ฌธ์ž ํ˜•ํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. lowercaseName์ด name๊ณผ ๊ฐ™์ง€ ์•Š์œผ๋ฉด, name์„ ๋‹ค์Œ์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค: names.

  3. names๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

getNamedItem(qualifiedName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” qualifiedName๊ณผ ์š”์†Œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ์„ ๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

getNamedItemNS(namespace, localName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” namespace, localName, ์š”์†Œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ์„ ๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

setNamedItem(attr) ๋ฐ setNamedItemNS(attr) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” attr๊ณผ ์š”์†Œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ์„ ์„ค์ •ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

removeNamedItem(qualifiedName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. attr์„ qualifiedName๊ณผ ์š”์†Œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ์„ ์ œ๊ฑฐํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. attr์ด null์ด๋ฉด "NotFoundError" DOMException์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

  3. attr์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

removeNamedItemNS(namespace, localName) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. attr์„ namespace, localName, ์š”์†Œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ์„ ์ œ๊ฑฐํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. attr์ด null์ด๋ฉด "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; // historical; always returns true
};

Attr ๋…ธ๋“œ๋Š” ๊ฐ„๋‹จํžˆ ์†์„ฑ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. IDL ์†์„ฑ๊ณผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ˜ํ…์ธ  ์†์„ฑ์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ์—๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค (null ๋˜๋Š” ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ฌธ์ž์—ด), ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ (null ๋˜๋Š” ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ฌธ์ž์—ด), ๋กœ์ปฌ ์ด๋ฆ„ (๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ฌธ์ž์—ด), ๊ฐ’ (๋ฌธ์ž์—ด), ๊ทธ๋ฆฌ๊ณ  ์š”์†Œ (null ๋˜๋Š” ์š”์†Œ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  ์„ค๊ณ„ํ–ˆ๋‹ค๋ฉด ์ด๋ฆ„๊ณผ ๊ฐ’๋งŒ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. โ˜น

์†์„ฑ์˜ ํ•œ์ • ์ด๋ฆ„์€ ํ•ด๋‹น ์†์„ฑ์˜ ๋กœ์ปฌ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋‹จ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๊ฐ€ null์ธ ๊ฒฝ์šฐ์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ ๋’ค์— ":"๋ฅผ ๋ถ™์ด๊ณ , ๊ทธ ๋’ค์— ํ•ด๋‹น ์†์„ฑ์˜ ๋กœ์ปฌ ์ด๋ฆ„์„ ๋ถ™์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ด๋ฅผ ๋‚ด๋ถ€ ์Šฌ๋กฏ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, ์ฃผ์–ด์ง„ ๋ฌธ์„œ document, ๋ฌธ์ž์—ด localName, ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์ ์œผ๋กœ ๋ฌธ์ž์—ด ๋˜๋Š” null์ธ namespace(๊ธฐ๋ณธ๊ฐ’์€ null), ๋ฌธ์ž์—ด ๋˜๋Š” null์ธ prefix(๊ธฐ๋ณธ๊ฐ’์€ null), ๋ฌธ์ž์—ด value(๊ธฐ๋ณธ๊ฐ’์€ ๋นˆ ๋ฌธ์ž์—ด)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. attribute๋ฅผ ๋‹ค์Œ ๋…ธ๋“œ ์ƒ์„ฑ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด ๋…ธ๋“œ๋Š” Attr๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์ฃผ์–ด์ง„ ๊ฐ’์€ document์ž…๋‹ˆ๋‹ค.

  2. attribute์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ namespace๋กœ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๋ฅผ prefix๋กœ, ๋กœ์ปฌ ์ด๋ฆ„์„ localName์œผ๋กœ, ๊ฐ’์„ value๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. attribute๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ A ์†์„ฑ์€ ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค: ๋กœ์ปฌ ์ด๋ฆ„์€ A์ด๊ณ , ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๋Š” null์ž…๋‹ˆ๋‹ค.


๋‹ค์Œ namespaceURI getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค.

๋‹ค์Œ prefix getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ.

๋‹ค์Œ localName getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋กœ์ปฌ ์ด๋ฆ„.

๋‹ค์Œ name getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ํ•œ์ • ์ด๋ฆ„.

๋‹ค์Œ value getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๊ฐ’.

๊ธฐ์กด ์†์„ฑ ๊ฐ’ ์„ค์ •์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, ์ฃผ์–ด์ง„ ์†์„ฑ attribute์™€ ๋ฌธ์ž์—ด value๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. attribute์˜ ์š”์†Œ๊ฐ€ null์ด๋ฉด, attribute์˜ ๊ฐ’์„ value๋กœ ์„ค์ •ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. element๋ฅผ attribute์˜ ์š”์†Œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. verifiedValue๋ฅผ ๋‹ค์Œ์„ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค: ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์— ๋ถ€ํ•ฉํ•˜๋Š” ์†์„ฑ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ. ์ธ์ˆ˜๋Š” attribute์˜ ๋กœ์ปฌ ์ด๋ฆ„, attribute์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค, element, ๊ทธ๋ฆฌ๊ณ  value์ž…๋‹ˆ๋‹ค. [TRUSTED-TYPES]

  4. attribute์˜ ์š”์†Œ๊ฐ€ null์ด๋ฉด, attribute์˜ ๊ฐ’์„ verifiedValue๋กœ ์„ค์ •ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค: attribute๋ฅผ verifiedValue๋กœ.

๋‹ค์Œ 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 ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ๋…ธ๋“œ์—๋Š” ์—ฐ๊ฒฐ๋œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด์ด ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ๋ฐ์ดํ„ฐ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ๊ต์ฒดํ•˜๋ ค๋ฉด, ๋…ธ๋“œ node์— ๋Œ€ํ•ด ์ •์ˆ˜ offset, ์ •์ˆ˜ count, ๋ฌธ์ž์—ด data, ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์  ๋ถˆ๋ฆฌ์–ธ piAttributesAlreadyUpdated(๊ธฐ๋ณธ๊ฐ’ false)๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ:

  1. length๋ฅผ node์˜ ๊ธธ์ด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. offset์ด length๋ณด๋‹ค ํฌ๋ฉด "IndexSizeError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  3. offset + count๊ฐ€ length๋ณด๋‹ค ํฌ๋ฉด count๋ฅผ length โˆ’ offset์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. node์— ๋Œ€ํ•ด "characterData" ์œ ํ˜•์˜ ๋ณ€๊ฒฝ ๋ ˆ์ฝ”๋“œ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ null, null, node์˜ ๋ฐ์ดํ„ฐ, ยซ ยป, ยซ ยป, null, ๊ทธ๋ฆฌ๊ณ  null์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  5. data๋ฅผ node์˜ ๋ฐ์ดํ„ฐ์—์„œ offset ์ฝ”๋“œ ๋‹จ์œ„ ๋’ค์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

  6. deleteOffset์„ offset + data์˜ ๊ธธ์ด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. deleteOffset ์ฝ”๋“œ ๋‹จ์œ„๋ถ€ํ„ฐ node์˜ ๋ฐ์ดํ„ฐ์—์„œ count๊ฐœ์˜ ์ฝ”๋“œ ๋‹จ์œ„๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  8. ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ node์ด๊ณ  ์‹œ์ž‘ ์˜คํ”„์…‹์ด offset๋ณด๋‹ค ํฌ์ง€๋งŒ offset + count ์ดํ•˜์ธ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด ํ•ด๋‹น ์‹œ์ž‘ ์˜คํ”„์…‹์„ offset์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  9. ๋ ๋…ธ๋“œ๊ฐ€ node์ด๊ณ  ๋ ์˜คํ”„์…‹์ด offset๋ณด๋‹ค ํฌ์ง€๋งŒ offset + count ์ดํ•˜์ธ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด ํ•ด๋‹น ๋ ์˜คํ”„์…‹์„ offset์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  10. ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ node์ด๊ณ  ์‹œ์ž‘ ์˜คํ”„์…‹์ด offset + count๋ณด๋‹ค ํฐ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด ์‹œ์ž‘ ์˜คํ”„์…‹์— data์˜ ๊ธธ์ด๋ฅผ ๋”ํ•˜๊ณ  count๋ฅผ ๋บ๋‹ˆ๋‹ค.

  11. ๋ ๋…ธ๋“œ๊ฐ€ node์ด๊ณ  ๋ ์˜คํ”„์…‹์ด offset + count๋ณด๋‹ค ํฐ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด ๋ ์˜คํ”„์…‹์— data์˜ ๊ธธ์ด๋ฅผ ๋”ํ•˜๊ณ  count๋ฅผ ๋บ๋‹ˆ๋‹ค.

  12. node๊ฐ€ ProcessingInstruction ๋…ธ๋“œ์ด๊ณ  piAttributesAlreadyUpdated๊ฐ€ false์ด๋ฉด node๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ฐ์ดํ„ฐ์—์„œ ์†์„ฑ ๊ฐฑ์‹ ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  13. node์˜ ๋ถ€๋ชจ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด node์˜ ๋ถ€๋ชจ์— ๋Œ€ํ•ด ์ž์‹ ๋ณ€๊ฒฝ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ node์˜ ๋ฐ์ดํ„ฐ์—์„œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ถ”์ถœํ•˜๋ ค๋ฉด, ์ •์ˆ˜ offset๊ณผ ์ •์ˆ˜ count๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ:

  1. length๋ฅผ node์˜ ๊ธธ์ด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. offset์ด length๋ณด๋‹ค ํฌ๋ฉด "IndexSizeError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  3. offset + count๊ฐ€ length๋ณด๋‹ค ํฌ๋ฉด node์˜ ๋ฐ์ดํ„ฐ์—์„œ offset๋ฒˆ์งธ ์ฝ”๋“œ ๋‹จ์œ„๋ถ€ํ„ฐ ๋๊นŒ์ง€์˜ ์ฝ”๋“œ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. node์˜ ๋ฐ์ดํ„ฐ์—์„œ offset๋ฒˆ์งธ ์ฝ”๋“œ ๋‹จ์œ„๋ถ€ํ„ฐ offset+count๋ฒˆ์งธ ์ฝ”๋“œ ๋‹จ์œ„๊นŒ์ง€์˜ ์ฝ”๋“œ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ data getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋ฐ์ดํ„ฐ. ํ•ด๋‹น setter ๋‹จ๊ณ„๋Š” ๋ฐ์ดํ„ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์ธ์ˆ˜๋Š” 0, this์˜ ๊ธธ์ด, ๊ทธ๋ฆฌ๊ณ  ์ฃผ์–ด์ง„ ๊ฐ’์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ length getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๊ธธ์ด.

๋‹ค์Œ substringData(offset, count) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ถ”์ถœ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์ธ์ˆ˜๋Š” offset๊ณผ count์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ appendData(data) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ ๋ฐ์ดํ„ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์ธ์ˆ˜๋Š” this์˜ ๊ธธ์ด, 0, ๊ทธ๋ฆฌ๊ณ  data์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ insertData(offset, data) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋ฐ์ดํ„ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์ธ์ˆ˜๋Š” offset, 0, ๊ทธ๋ฆฌ๊ณ  data์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ deleteData(offset, count) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋ฐ์ดํ„ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์ธ์ˆ˜๋Š” offset, count, ๊ทธ๋ฆฌ๊ณ  ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ replaceData(offset, count, data) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋ฐ์ดํ„ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์ธ์ˆ˜๋Š” offset, count, ๊ทธ๋ฆฌ๊ณ  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 = ""])
๋ฐ์ดํ„ฐ๊ฐ€ data์ธ ์ƒˆ๋กœ์šด Text ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
text . splitText(offset)
๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ์–ด์ง„ offset์—์„œ ๋ถ„ํ• ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋ฅผ Text ๋…ธ๋“œ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
text . wholeText
๋ชจ๋“  ์ง์ ‘์ ์ธ Text ๋…ธ๋“œ ํ˜•์ œ ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐํ•ฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐํƒ€์  Text ๋…ธ๋“œ๋Š” Text ๋…ธ๋“œ ์ค‘ CDATASection ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ node์˜ ์—ฐ์†๋œ Text ๋…ธ๋“œ๋Š” node, node์˜ ์ด์ „ ํ˜•์ œ ๋…ธ๋“œ์ธ Text ๋…ธ๋“œ(์žˆ๋Š” ๊ฒฝ์šฐ)์™€ ํ•ด๋‹น ๋…ธ๋“œ์˜ ์—ฐ์†๋œ Text ๋…ธ๋“œ, ๊ทธ๋ฆฌ๊ณ  node์˜ ๋‹ค์Œ ํ˜•์ œ ๋…ธ๋“œ์ธ Text ๋…ธ๋“œ(์žˆ๋Š” ๊ฒฝ์šฐ)์™€ ํ•ด๋‹น ๋…ธ๋“œ์˜ ์—ฐ์†๋œ Text ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ค‘๋ณต์€ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ node์˜ ์—ฐ์†๋œ ๋ฐฐํƒ€์  Text ๋…ธ๋“œ๋Š” node, node์˜ ์ด์ „ ํ˜•์ œ ๋…ธ๋“œ์ธ ๋ฐฐํƒ€์  Text ๋…ธ๋“œ(์žˆ๋Š” ๊ฒฝ์šฐ)์™€ ํ•ด๋‹น ๋…ธ๋“œ์˜ ์—ฐ์†๋œ ๋ฐฐํƒ€์  Text ๋…ธ๋“œ, ๊ทธ๋ฆฌ๊ณ  node์˜ ๋‹ค์Œ ํ˜•์ œ ๋…ธ๋“œ์ธ ๋ฐฐํƒ€์  Text ๋…ธ๋“œ(์žˆ๋Š” ๊ฒฝ์šฐ)์™€ ํ•ด๋‹น ๋…ธ๋“œ์˜ ์—ฐ์†๋œ ๋ฐฐํƒ€์  Text ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ค‘๋ณต์€ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ node์˜ ์ž์‹ ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ๋Š” node์˜ Text ๋…ธ๋“œ ์ž์‹ ๋ชจ๋‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ ์—ฐ๊ฒฐํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ node์˜ ์ž์† ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ๋Š” node์˜ Text ๋…ธ๋“œ ์ž์† ๋ชจ๋‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ ์—ฐ๊ฒฐํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

ํ…์ŠคํŠธ ๋…ธ๋“œ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, ์ฃผ์–ด์ง„ ๋ฌธ์„œ document์™€ ๋ฌธ์ž์—ด data๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. text๋ฅผ ๋‹ค์Œ ๋…ธ๋“œ ์ƒ์„ฑ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด ๋…ธ๋“œ๋Š” Text๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์ฃผ์–ด์ง„ ๊ฐ’์€ document์ž…๋‹ˆ๋‹ค.

  2. text์˜ ๋ฐ์ดํ„ฐ๋ฅผ data๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. text๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


๋‹ค์Œ new Text(data) ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” this์˜ ๋ฐ์ดํ„ฐ๋ฅผ data๋กœ ์„ค์ •ํ•˜๊ณ , this์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋ฅผ ํ˜„์žฌ ์ „์—ญ ๊ฐ์ฒด์˜ ์—ฐ๊ฒฐ๋œ Document๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ Text ๋…ธ๋“œ node์ด๋ฉฐ, ์ธ์ˆ˜๋Š” ์ •์ˆ˜ offset์ž…๋‹ˆ๋‹ค:

  1. length๋ฅผ node์˜ ๊ธธ์ด๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. offset์ด length๋ณด๋‹ค ํฌ๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "IndexSizeError" DOMException.

  3. count๋ฅผ length โˆ’ offset์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. newData๋ฅผ ๋‹ค์Œ ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ถ”์ถœ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ node์ด๋ฉฐ, ์ธ์ˆ˜๋Š” offset๊ณผ count์ž…๋‹ˆ๋‹ค.

  5. newNode๋ฅผ ๋‹ค์Œ ํ…์ŠคํŠธ ๋…ธ๋“œ ์ƒ์„ฑ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ node์˜ ๋…ธ๋“œ ๋ฌธ์„œ์™€ newData์ž…๋‹ˆ๋‹ค.

  6. parent๋ฅผ node์˜ ๋ถ€๋ชจ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  7. parent๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค: newNode๋ฅผ parent์—, node์˜ ๋‹ค์Œ ํ˜•์ œ ์•ž์—.

    2. ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด, ๊ทธ ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ node์ด๊ณ  ์‹œ์ž‘ ์˜คํ”„์…‹์ด offset๋ณด๋‹ค ํฌ๋ฉด, ๊ทธ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ newNode๋กœ ์„ค์ •ํ•˜๊ณ  ๊ทธ ์‹œ์ž‘ ์˜คํ”„์…‹์„ offset๋งŒํผ ์ค„์ž…๋‹ˆ๋‹ค.

    3. ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด, ๊ทธ ๋ ๋…ธ๋“œ๊ฐ€ node์ด๊ณ  ๋ ์˜คํ”„์…‹์ด offset๋ณด๋‹ค ํฌ๋ฉด, ๊ทธ ๋ ๋…ธ๋“œ๋ฅผ newNode๋กœ ์„ค์ •ํ•˜๊ณ  ๊ทธ ๋ ์˜คํ”„์…‹์„ offset๋งŒํผ ์ค„์ž…๋‹ˆ๋‹ค.

    4. ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด, ๊ทธ ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ parent์ด๊ณ  ์‹œ์ž‘ ์˜คํ”„์…‹์ด ์ธ๋ฑ์Šค(node์˜ ์ธ๋ฑ์Šค)์— 1์„ ๋”ํ•œ ๊ฐ’๊ณผ ๊ฐ™์œผ๋ฉด, ๊ทธ ์‹œ์ž‘ ์˜คํ”„์…‹์„ 1๋งŒํผ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค.

    5. ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด, ๊ทธ ๋ ๋…ธ๋“œ๊ฐ€ parent์ด๊ณ  ๋ ์˜คํ”„์…‹์ด ์ธ๋ฑ์Šค(node์˜ ์ธ๋ฑ์Šค)์— 1์„ ๋”ํ•œ ๊ฐ’๊ณผ ๊ฐ™์œผ๋ฉด, ๊ทธ ๋ ์˜คํ”„์…‹์„ 1๋งŒํผ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค.

  8. ๋ฐ์ดํ„ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ node์ด๋ฉฐ, ์ธ์ˆ˜๋Š” offset, count, ๊ทธ๋ฆฌ๊ณ  ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

  9. newNode๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ splitText(offset) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋ถ„ํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์ธ์ˆ˜๋Š” ์˜คํ”„์…‹ offset์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ wholeText getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ ์—ฐ๊ฒฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ๋Œ€์ƒ์€ ๋ฐ์ดํ„ฐ์ด๋ฉฐ, ์ด๋Š” ์—ฐ์†๋œ Text ๋…ธ๋“œ(this์— ๋Œ€ํ•œ ๋…ธ๋“œ)์˜ ๋ฐ์ดํ„ฐ๋กœ์„œ, ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

4.12. ์ธํ„ฐํŽ˜์ด์Šค CDATASection

[Exposed=Window]
interface CDATASection : Text {
};

CDATA ์„น์…˜ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋ฌธ์„œ document์™€ ๋ฌธ์ž์—ด data๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ:

  1. node๋ฅผ CDATASection์„ ๊ตฌํ˜„ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด๋•Œ document๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

  2. node์˜ ๋ฐ์ดํ„ฐ๋ฅผ data๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. node๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

4.13. ์ธํ„ฐํŽ˜์ด์Šค ProcessingInstruction

[Exposed=Window]
interface ProcessingInstruction : CharacterData {
  constructor(DOMString target, optional DOMString data = "");

  readonly attribute DOMString target;

  boolean hasAttributes();
  sequence<DOMString> getAttributeNames();
  DOMString? getAttribute(DOMString name);
  undefined setAttribute(DOMString name, DOMString value);
  undefined removeAttribute(DOMString name);
  boolean toggleAttribute(DOMString name, optional boolean force);
  boolean hasAttribute(DOMString name);
};
pi = new ProcessingInstruction(target [, data = ""])
์ƒˆ๋กœ์šด ProcessingInstruction ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋Œ€์ƒ์€ target์ด๊ณ  ๋ฐ์ดํ„ฐ๋Š” data์ž…๋‹ˆ๋‹ค.
pi . target
๋Œ€์ƒ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
pi . hasAttributes()

pi์— ์†์„ฑ์ด ์žˆ์œผ๋ฉด true๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

pi . getAttributeNames()

pi์˜ ๋ชจ๋“  ์†์„ฑ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต๋œ ์ด๋ฆ„์€ ํฌํ•จ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

pi . getAttribute(name)

pi์—์„œ ์ด๋ฆ„์ด name์ธ ์†์„ฑ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ํ•ด๋‹น ์†์„ฑ์ด ์—†์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

pi . setAttribute(name, value)

pi์—์„œ ์ด๋ฆ„์ด name์ธ ์†์„ฑ์„ value๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

pi . removeAttribute(name)

pi์—์„œ ์ด๋ฆ„์ด name์ธ ์†์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

pi . toggleAttribute(name [, force])

force๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์œผ๋ฉด name์„ "ํ† ๊ธ€"ํ•˜์—ฌ, ์กด์žฌํ•˜๋ฉด ์ œ๊ฑฐํ•˜๊ณ  ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. force๊ฐ€ true์ด๋ฉด name์„ ์ถ”๊ฐ€ํ•˜๊ณ , force๊ฐ€ false์ด๋ฉด name์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ name์ด ์กด์žฌํ•˜๋ฉด true๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

pi . hasAttribute(name)

pi์— ์ด๋ฆ„์ด name์ธ ์†์„ฑ์ด ์žˆ์œผ๋ฉด true๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ProcessingInstruction ๋…ธ๋“œ์—๋Š” ์—ฐ๊ฒฐ๋œ ๋Œ€์ƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ProcessingInstruction ๋…ธ๋“œ์—๋Š” ์—ฐ๊ฒฐ๋œ ์†์„ฑ ๋งต์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋งต์œผ๋กœ, ์ดˆ๊ธฐ์—๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜๋ฆฌ ๋ช…๋ น ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด, ๋ฌธ์„œ document, ๋ฌธ์ž์—ด target, ๋ฌธ์ž์—ด data๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ:

  1. pi๋ฅผ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋…ธ๋“œ๋Š” ProcessingInstruction์„ ๊ตฌํ˜„ํ•˜๋ฉฐ, document๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

  2. pi๋ฅผ target๊ณผ data๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  3. pi๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ProcessingInstruction ๋…ธ๋“œ pi๋ฅผ target๊ณผ data๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด:

  1. target์ด Name ์ƒ์„ฑ ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด "InvalidCharacterError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  2. data์— ๋ฌธ์ž์—ด "?>"๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด "InvalidCharacterError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  3. pi์˜ ๋Œ€์ƒ์„ target์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. pi์˜ ๋ฐ์ดํ„ฐ๋ฅผ data๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. pi๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ฐ์ดํ„ฐ์—์„œ ์†์„ฑ์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

ProcessingInstruction ๋…ธ๋“œ pi๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ฐ์ดํ„ฐ์—์„œ ์†์„ฑ์„ ๊ฐฑ์‹ ํ•˜๋ ค๋ฉด:

  1. pi์˜ ์†์„ฑ ๋งต์„ ๋น„์›๋‹ˆ๋‹ค.

  2. result๋ฅผ pi์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ฌธ์ž์—ด์—์„œ ์˜์‚ฌ ์†์„ฑ์„ ํŒŒ์‹ฑํ•˜๋Š” ๊ทœ์น™์„ ํ˜ธ์ถœํ•œ ํŒŒ์‹ฑ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. result๊ฐ€ ์˜ค๋ฅ˜์ด๋ฉด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. result์˜ ๊ฐ ์˜์‚ฌ ์†์„ฑ pseudoAttr์— ๋Œ€ํ•ด: pi์˜ ์†์„ฑ ๋งต[pseudoAttr์˜ ์ด๋ฆ„]์„ pseudoAttr์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

ProcessingInstruction ๋…ธ๋“œ pi๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋ ค๋ฉด:

  1. data๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. pi์˜ ์†์„ฑ ๋งต์— ์žˆ๋Š” ๊ฐ name โ†’ value์— ๋Œ€ํ•ด:

    1. data๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉด U+0020 SPACE๋ฅผ data์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    2. name์„ data์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    3. U+003D (=)๋ฅผ data์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    4. U+0022 (")๋ฅผ data์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    5. value์— ์žˆ๋Š” ๋ชจ๋“  U+0026 (&)๋ฅผ "&amp;"๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

    6. value์— ์žˆ๋Š” ๋ชจ๋“  U+003C (<)๋ฅผ "&lt;"๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

    7. value์— ์žˆ๋Š” ๋ชจ๋“  U+003E (>)๋ฅผ "&gt;"๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

    8. value์— ์žˆ๋Š” ๋ชจ๋“  U+0022 (")๋ฅผ "&quot;"๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

    9. value๋ฅผ data์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    10. U+0022 (")๋ฅผ data์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  3. pi์˜ ๊ธธ์ด, 0, data, true๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ pi์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

ProcessingInstruction ๋…ธ๋“œ pi์™€ ๋ฌธ์ž์—ด name์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์ฒ˜๋ฆฌ ๋ช…๋ น ์†์„ฑ์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด: pi์˜ ์†์„ฑ ๋งต[name]์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๊ธฐ๋ณธ๊ฐ’์€ null์ž…๋‹ˆ๋‹ค.


๋‹ค์Œ new ProcessingInstruction(target, data) ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๋‹ค์Œ this์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋ฅผ ํ˜„์žฌ ์ „์—ญ ๊ฐ์ฒด์˜ ์—ฐ๊ฒฐ๋œ Document๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์ธ์ˆ˜๋Š” target๊ณผ data์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ target getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋Œ€์ƒ.

๋‹ค์Œ hasAttributes() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: ๋‹ค์Œ this์˜ ์†์„ฑ ๋งต์ด ๋น„์–ด ์žˆ์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ getAttributeNames() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ํ‚ค ๊ฐ€์ ธ์˜ค๊ธฐ. ๋Œ€์ƒ์€ this์˜ ์†์„ฑ ๋งต์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ getAttribute(name) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์ฒ˜๋ฆฌ ๋ช…๋ น ์†์„ฑ ๊ฐ€์ ธ์˜ค๊ธฐ. ์ฃผ์–ด์ง„ ๊ฐ’์€ this์™€ name์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ setAttribute(name, value) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. name์ด ์œ ํšจํ•œ ์†์„ฑ ๋กœ์ปฌ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidCharacterError" DOMException.

  2. ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: this์˜ ์†์„ฑ ๋งต[name]์„ value๋กœ.

  3. ์†์„ฑ์—์„œ ๋ฐ์ดํ„ฐ ๊ฐฑ์‹ ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ this์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ removeAttribute(name) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค: this์˜ ์†์„ฑ ๋งต[name].

  2. ์†์„ฑ์—์„œ ๋ฐ์ดํ„ฐ ๊ฐฑ์‹ ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ this์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ toggleAttribute(name, force) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. name์ด ์œ ํšจํ•œ ์†์„ฑ ๋กœ์ปฌ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidCharacterError" DOMException.

  2. attributes๋ฅผ this์˜ ์†์„ฑ ๋งต์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. attributes[name]์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด:

    1. force๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๊ฑฐ๋‚˜ true์ด๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: attributes[name]์„ ๋นˆ ๋ฌธ์ž์—ด๋กœ. ์ด์–ด์„œ ์†์„ฑ์—์„œ ๋ฐ์ดํ„ฐ ๊ฐฑ์‹ ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ this์ด๋ฉฐ, ๊ทธ๋Ÿฐ ๋‹ค์Œ true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. force๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๊ฑฐ๋‚˜ false์ด๋ฉด, ๋‹ค์Œ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค: attributes[name]. ์ด์–ด์„œ ์†์„ฑ์—์„œ ๋ฐ์ดํ„ฐ ๊ฐฑ์‹ ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ this์ด๋ฉฐ, ๊ทธ๋Ÿฐ ๋‹ค์Œ false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ hasAttribute(name) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: this์˜ ์†์„ฑ ๋งต[name]์ด ์กด์žฌํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

4.14. ์ธํ„ฐํŽ˜์ด์Šค Comment

[Exposed=Window]
interface Comment : CharacterData {
  constructor(optional DOMString data = "");
};
comment = new Comment([data = ""])
์ƒˆ๋กœ์šด Comment ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋Š” data์ž…๋‹ˆ๋‹ค.

์ฃผ์„ ๋…ธ๋“œ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, ์ฃผ์–ด์ง„ ๋ฌธ์„œ document์™€ ๋ฌธ์ž์—ด data๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. comment๋ฅผ ๋‹ค์Œ ๋…ธ๋“œ ์ƒ์„ฑ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด ๋…ธ๋“œ๋Š” Comment๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์ฃผ์–ด์ง„ ๊ฐ’์€ document์ž…๋‹ˆ๋‹ค.

  2. comment์˜ ๋ฐ์ดํ„ฐ๋ฅผ data๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. comment๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ new Comment(data) ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” this์˜ ๋ฐ์ดํ„ฐ๋ฅผ data๋กœ ์„ค์ •ํ•˜๊ณ , this์˜ ๋…ธ๋“œ ๋ฌธ์„œ๋ฅผ ํ˜„์žฌ ์ „์—ญ ๊ฐ์ฒด์˜ ์—ฐ๊ฒฐ๋œ Document๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

5. ๋ฒ”์œ„(Ranges)

5.1. "DOM Ranges" ์†Œ๊ฐœ

StaticRange ๋ฐ Range ๊ฐ์ฒด(๋ฒ”์œ„)๋Š” ๋…ธ๋“œ ํŠธ๋ฆฌ ์•ˆ์˜ ์ฝ˜ํ…์ธ  ์‹œํ€€์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ฐ ๋ฒ”์œ„์—๋Š” ์‹œ์ž‘๊ณผ ๋์ด ์žˆ์œผ๋ฉฐ, ์ด๋“ค์€ ๊ฒฝ๊ณ„์ ์ด๋‹ค. ๊ฒฝ๊ณ„์ ์€ ๋…ธ๋“œ์™€ ์˜คํ”„์…‹์œผ๋กœ ๊ตฌ์„ฑ๋œ ํŠœํ”Œ์ด๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ๋ง๋กœ ํ•˜๋ฉด ๋ฒ”์œ„๋Š” ๋…ธ๋“œ ํŠธ๋ฆฌ ์•ˆ์—์„œ ๋‘ ๊ฒฝ๊ณ„์  ์‚ฌ์ด์˜ ์ฝ˜ํ…์ธ  ์กฐ๊ฐ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๋ฒ”์œ„๋Š” ํŽธ์ง‘์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ์„ ํƒํ•˜๊ณ  ๋ณต์‚ฌํ•˜๋Š” ๋ฐ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

์œ„ ๋…ธ๋“œ ํŠธ๋ฆฌ์—์„œ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ โ€œsyndata is awesโ€ ์‹œํ€€์Šค๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. p๊ฐ€ p ์š”์†Œ์— ํ• ๋‹น๋˜๊ณ , em์ด em ์š”์†Œ์— ํ• ๋‹น๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค:

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

์œ„ ๋…ธ๋“œ ํŠธ๋ฆฌ์˜ src ๋ฐ alt์™€ ๊ฐ™์€ ์†์„ฑ์€ ๋ฒ”์œ„๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์—†๋‹ค. ๋ฒ”์œ„๋Š” ๋…ธ๋“œ์—๋งŒ ์œ ์šฉํ•˜๋‹ค.

Range ๊ฐ์ฒด๋Š” StaticRange ๊ฐ์ฒด์™€ ๋‹ฌ๋ฆฌ ๋…ธ๋“œ ํŠธ๋ฆฌ์˜ ๋ณ€๊ฒฝ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋ผ์ด๋ธŒ ๋ฒ”์œ„๋ผ๊ณ ๋„ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์€ ๋ฒ”์œ„๋ฅผ ๋ฌดํšจํ™”ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฒ”์œ„๊ฐ€ ๊ณ„์† ๊ฐ™์€ ์ฝ˜ํ…์ธ  ๋ถ€๋ถ„์„ ๋‚˜ํƒ€๋‚ด๋„๋ก ํ•œ๋‹ค. ํ•„์—ฐ์ ์œผ๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฒ”์œ„๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ์ฝ˜ํ…์ธ  ์ผ๋ถ€๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ผ์ด๋ธŒ ๋ฒ”์œ„ ์ž์ฒด๋„ ๋…ธ๋“œ ํŠธ๋ฆฌ ๋ณ€๊ฒฝ์˜ ์ผ๋ถ€๋กœ ์ˆ˜์ •๋  ์ˆ˜ ์žˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ฝ์ž… ๋ฐ ์ œ๊ฑฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜, normalize() ๋ฉ”์„œ๋“œ, ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ๊ต์ฒด ๋ฐ ๋ถ„ํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฐธ์กฐํ•œ๋‹ค.

๋…ธ๋“œ ํŠธ๋ฆฌ ๋ณ€๊ฒฝ์— ๋Œ€์‘ํ•˜์—ฌ ๋ผ์ด๋ธŒ ๋ฒ”์œ„๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์ž‘์—…์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ๋…ธ๋“œ ํŠธ๋ฆฌ ๋ณ€๊ฒฝ๋งˆ๋‹ค ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ชจ๋“  Range ๊ฐ์ฒด๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ผ๋ถ€ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๊ด€์‹ฌ์ด ์—†๋”๋ผ๋„ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ๋•Œ ์ด๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๋น„์šฉ์„ ์—ฌ์ „ํžˆ ๋ถ€๋‹ดํ•ด์•ผ ํ•œ๋‹ค.

StaticRange ๊ฐ์ฒด๋Š” ๋…ธ๋“œ ํŠธ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ๊ฐฑ์‹ ๋˜์ง€ ์•Š๋Š” ๊ฒฝ๋Ÿ‰ ๋ฒ”์œ„์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์™€ ๋™์ผํ•œ ์œ ์ง€ ๊ด€๋ฆฌ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

5.2. ๊ฒฝ๊ณ„์ (boundary points)

๊ฒฝ๊ณ„์ ์€ ํŠœํ”Œ์ด๋ฉฐ, ๋‹ค์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค: ๋…ธ๋“œ(ํ•˜๋‚˜์˜ ๋…ธ๋“œ)์™€ ์˜คํ”„์…‹(์Œ์ด ์•„๋‹Œ ์ •์ˆ˜).

์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๊ณ„์ ์˜ ์˜คํ”„์…‹์€ 0๊ณผ ๊ฒฝ๊ณ„์ ์˜ ๋…ธ๋“œ์˜ ๊ธธ์ด ์‚ฌ์ด์— ์žˆ์œผ๋ฉฐ, ์–‘ ๋๊ฐ’์„ ํฌํ•จํ•œ๋‹ค.

๊ฒฝ๊ณ„์  (nodeA, offsetA)์˜ ๊ฒฝ๊ณ„์  (nodeB, offsetB)์— ๋Œ€ํ•œ ์œ„์น˜๋Š” ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ์•ž, ๊ฐ™์Œ, ๋˜๋Š” ๋’ค์ด๋‹ค:

  1. ๋‹จ์–ธ: nodeA์™€ nodeB๋Š” ๊ฐ™์€ ๋ฃจํŠธ๋ฅผ ๊ฐ€์ง„๋‹ค.

  2. nodeA๊ฐ€ nodeB์ด๋ฉด, offsetA๊ฐ€ offsetB์ผ ๋•Œ ๊ฐ™์Œ์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , offsetA๊ฐ€ offsetB๋ณด๋‹ค ์ž‘์„ ๋•Œ ์•ž์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, offsetA๊ฐ€ offsetB๋ณด๋‹ค ํด ๋•Œ ๋’ค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  3. nodeA๊ฐ€ nodeB์˜ ๋’ค์— ์˜ค๋Š” ๋…ธ๋“œ์ด๋ฉด, (nodeA, offsetA)์— ๋Œ€ํ•œ (nodeB, offsetB)์˜ ์œ„์น˜๊ฐ€ ์•ž์ด๋ฉด ๋’ค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋’ค์ด๋ฉด ์•ž์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. nodeA๊ฐ€ nodeB์˜ ์กฐ์ƒ์ด๋ฉด:

    1. child๋ฅผ nodeB๋กœ ๋‘”๋‹ค.

    2. child๊ฐ€ nodeA์˜ ์ž์‹์ด ์•„๋‹Œ ๋™์•ˆ, child๋ฅผ ๊ทธ ๋ถ€๋ชจ๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. child์˜ ์ธ๋ฑ์Šค๊ฐ€ offsetA๋ณด๋‹ค ์ž‘์œผ๋ฉด, ๋’ค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. ์•ž์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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์˜ ์‹œ์ž‘ ๋…ธ๋“œ.

๋‹ค์Œ startOffset getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ์‹œ์ž‘ ์˜คํ”„์…‹.

๋‹ค์Œ endContainer getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋ ๋…ธ๋“œ.

๋‹ค์Œ endOffset getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋ ์˜คํ”„์…‹.

๋‹ค์Œ collapsed getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: this๊ฐ€ ์ถ•์†Œ๋œ ์ƒํƒœ์ด๋ฉด 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)

๋…ธ๋“œ ํŠธ๋ฆฌ๊ฐ€ ๋ณ€์ด๋  ๋•Œ ๊ฐฑ์‹ ๋˜์ง€ ์•Š๋Š” ์ƒˆ๋กœ์šด ๋ฒ”์œ„ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋‹ค์Œ new StaticRange(init) ์ƒ์„ฑ์ž์˜ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. init["startContainer"] ๋˜๋Š” init["endContainer"]๊ฐ€ DocumentType ๋˜๋Š” Attr ๋…ธ๋“œ์ด๋ฉด ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidNodeTypeError" DOMException.

  2. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: this์˜ ์‹œ์ž‘์€ (init["startContainer"], init["startOffset"]) ์ด๊ณ  ๋์€ (init["endContainer"], init["endOffset"]).

StaticRange๋Š” ๋‹ค์Œ์ด ๋ชจ๋‘ ์ฐธ์ด๋ฉด ์œ ํšจํ•˜๋‹ค:

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 ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋Š” ๋ผ์ด๋ธŒ ๋ฒ”์œ„๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜(ํŠนํžˆ ์‚ฝ์ž…, ์ œ๊ฑฐ, ์ด๋™, ๋ฐ์ดํ„ฐ ๊ต์ฒด, ๋ถ„ํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜)๋Š” ํ•ด๋‹น ํŠธ๋ฆฌ์— ์—ฐ๊ฒฐ๋œ ๋ผ์ด๋ธŒ ๋ฒ”์œ„๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ ๋ฒ”์œ„์˜ ๋ฃจํŠธ๋Š” ํ•ด๋‹น ๋ฒ”์œ„์˜ ์‹œ์ž‘ ๋…ธ๋“œ์˜ ๋ฃจํŠธ์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ node๊ฐ€ ๋ผ์ด๋ธŒ ๋ฒ”์œ„ range์— ํฌํ•จ๋˜๋Š” ๊ฒƒ์€ node์˜ ๋ฃจํŠธ๊ฐ€ range์˜ ๋ฃจํŠธ์ด๊ณ , (node, 0)์ด range์˜ ์‹œ์ž‘๋ณด๋‹ค ๋’ค์— ์žˆ์œผ๋ฉฐ, (node, node์˜ ๊ธธ์ด)๊ฐ€ range์˜ ๋๋ณด๋‹ค ์•ž์— ์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ๊ฐ€ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋ถ€๋ถ„์ ์œผ๋กœ ํฌํ•จ๋˜๋Š” ๊ฒƒ์€ ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ๊ทธ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์˜ ์‹œ์ž‘ ๋…ธ๋“œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด์ง€๋งŒ ๋ ๋…ธ๋“œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์€ ์•„๋‹ˆ๊ฑฐ๋‚˜, ๊ทธ ๋ฐ˜๋Œ€์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ •์˜๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์‹ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ node๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ผ์ด๋ธŒ ๋ฒ”์œ„ ์‚ฌ์ „ ์ œ๊ฑฐ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. parent๋ฅผ node์˜ ๋ถ€๋ชจ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋‹จ์–ธํ•ฉ๋‹ˆ๋‹ค: parent๋Š” null์ด ์•„๋‹™๋‹ˆ๋‹ค.

  3. index๋ฅผ node์˜ ์ธ๋ฑ์Šค๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ node์˜ ํฌ๊ด„์  ์ž์†์ธ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด ํ•ด๋‹น ์‹œ์ž‘์„ (parent, index)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ๋ ๋…ธ๋“œ๊ฐ€ node์˜ ํฌ๊ด„์  ์ž์†์ธ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด ํ•ด๋‹น ๋์„ (parent, index)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ parent์ด๊ณ  ์‹œ์ž‘ ์˜คํ”„์…‹์ด index๋ณด๋‹ค ํฐ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด ํ•ด๋‹น ์‹œ์ž‘ ์˜คํ”„์…‹์„ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.

  7. ๋ ๋…ธ๋“œ๊ฐ€ parent์ด๊ณ  ๋ ์˜คํ”„์…‹์ด index๋ณด๋‹ค ํฐ ๊ฐ ๋ผ์ด๋ธŒ ๋ฒ”์œ„์— ๋Œ€ํ•ด ํ•ด๋‹น ๋ ์˜คํ”„์…‹์„ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.


range = new Range()
์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ ๋ฒ”์œ„๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ new Range() ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ this์˜ ์‹œ์ž‘์ ๊ณผ ๋์ ์„ (ํ˜„์žฌ ์ „์—ญ ๊ฐ์ฒด์˜ ์—ฐ๊ฒฐ๋œ Document, 0)์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


container = range . commonAncestorContainer
๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋…ธ๋“œ๋Š” ๋ฌธ์„œ์—์„œ ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š” ์กฐ์ƒ์œผ๋กœ, range์˜ ์‹œ์ž‘ ๋…ธ๋“œ์™€ ๋ ๋…ธ๋“œ ๋‘˜ ๋ชจ๋‘์˜ ์กฐ์ƒ์ž…๋‹ˆ๋‹ค.

๊ณตํ†ต ์กฐ์ƒ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, ๋Œ€์ƒ์ธ ๋ผ์ด๋ธŒ ๋ฒ”์œ„ range์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. container๋ฅผ range์˜ ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. container๊ฐ€ ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด ์•„๋‹Œ ๋™์•ˆ: range์˜ ๋ ๋…ธ๋“œ, container๋ฅผ container์˜ ๋ถ€๋ชจ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. container๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ commonAncestorContainer getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๊ณตํ†ต ์กฐ์ƒ ๊ฐ€์ ธ์˜ค๊ธฐ. ๋Œ€์ƒ์€ this์ž…๋‹ˆ๋‹ค.


๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘์  ๋˜๋Š” ๋์ ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ range์ด๋ฉฐ, ์„ค์ •ํ•  ๊ฐ’์€ ๊ฒฝ๊ณ„์  (node, offset)์ž…๋‹ˆ๋‹ค:

  1. node๊ฐ€ ๋ฌธ์„œ ์œ ํ˜•์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidNodeTypeError" DOMException.

  2. offset์ด node์˜ ๊ธธ์ด๋ณด๋‹ค ํฌ๋ฉด, ๋˜์ง‘๋‹ˆ๋‹ค: "IndexSizeError" DOMException.

  3. boundaryPoint๋ฅผ ๋‹ค์Œ ๊ฒฝ๊ณ„์ ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: (node, offset).

  4. ์ด ๋‹จ๊ณ„๋“ค์ด "์‹œ์ž‘์  ์„ค์ •"์œผ๋กœ ํ˜ธ์ถœ๋œ ๊ฒฝ์šฐ
    1. range์˜ ๋ฃจํŠธ๊ฐ€ node์˜ ๋ฃจํŠธ์™€ ๋‹ค๋ฅด๊ฑฐ๋‚˜, boundaryPoint๊ฐ€ ๋‹ค์Œ๋ณด๋‹ค ๋’ค์— ์žˆ์œผ๋ฉด: range์˜ ๋์ , range์˜ ๋์ ์„ boundaryPoint๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. range์˜ ์‹œ์ž‘์ ์„ boundaryPoint๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์ด ๋‹จ๊ณ„๋“ค์ด "๋์  ์„ค์ •"์œผ๋กœ ํ˜ธ์ถœ๋œ ๊ฒฝ์šฐ
    1. range์˜ ๋ฃจํŠธ๊ฐ€ node์˜ ๋ฃจํŠธ์™€ ๋‹ค๋ฅด๊ฑฐ๋‚˜, boundaryPoint๊ฐ€ ๋‹ค์Œ๋ณด๋‹ค ์•ž์— ์žˆ์œผ๋ฉด: range์˜ ์‹œ์ž‘์ , range์˜ ์‹œ์ž‘์ ์„ boundaryPoint๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. range์˜ ๋์ ์„ boundaryPoint๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ setStart(node, offset) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ์‹œ์ž‘์  ์„ค์ •์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์„ค์ •ํ•  ๊ฐ’์€ ๊ฒฝ๊ณ„์  (node, offset)์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ setEnd(node, offset) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋์  ์„ค์ •์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์„ค์ •ํ•  ๊ฐ’์€ ๊ฒฝ๊ณ„์  (node, offset)์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ setStartBefore(node) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. parent๋ฅผ node์˜ ๋ถ€๋ชจ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. parent๊ฐ€ null์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidNodeTypeError" DOMException.

  3. ์‹œ์ž‘์  ์„ค์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์„ค์ •ํ•  ๊ฐ’์€ ๊ฒฝ๊ณ„์  (parent, node์˜ ์ธ๋ฑ์Šค)์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ setStartAfter(node) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. parent๋ฅผ node์˜ ๋ถ€๋ชจ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. parent๊ฐ€ null์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidNodeTypeError" DOMException.

  3. ์‹œ์ž‘์  ์„ค์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์„ค์ •ํ•  ๊ฐ’์€ ๊ฒฝ๊ณ„์  (parent, node์˜ ์ธ๋ฑ์Šค์— 1์„ ๋”ํ•œ ๊ฐ’)์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ setEndBefore(node) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. parent๋ฅผ node์˜ ๋ถ€๋ชจ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. parent๊ฐ€ null์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidNodeTypeError" DOMException.

  3. ๋์  ์„ค์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์„ค์ •ํ•  ๊ฐ’์€ ๊ฒฝ๊ณ„์  (parent, node์˜ ์ธ๋ฑ์Šค)์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ setEndAfter(node) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. parent๋ฅผ node์˜ ๋ถ€๋ชจ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. parent๊ฐ€ null์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidNodeTypeError" DOMException.

  3. ๋์  ์„ค์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ด๋ฉฐ, ์„ค์ •ํ•  ๊ฐ’์€ ๊ฒฝ๊ณ„์  (parent, node์˜ ์ธ๋ฑ์Šค์— 1์„ ๋”ํ•œ ๊ฐ’)์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ collapse(toStart) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: toStart๊ฐ€ true์ด๋ฉด, ๋์ ์„ ์‹œ์ž‘์ ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹œ์ž‘์ ์„ ๋์ ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ ๋…ธ๋“œ node์ด๋ฉฐ, ์„ ํƒ์— ์‚ฌ์šฉํ•˜๋Š” ๋ฒ”์œ„๋Š” range์ž…๋‹ˆ๋‹ค:

  1. parent๋ฅผ node์˜ ๋ถ€๋ชจ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. parent๊ฐ€ null์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidNodeTypeError" DOMException.

  3. index๋ฅผ node์˜ ์ธ๋ฑ์Šค๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. range์˜ ์‹œ์ž‘์ ์„ ๊ฒฝ๊ณ„์  (parent, index)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. range์˜ ๋์ ์„ ๊ฒฝ๊ณ„์  (parent, index์— 1์„ ๋”ํ•œ ๊ฐ’)์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ selectNode(node) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ์„ ํƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ node์ด๋ฉฐ, ์„ ํƒ์— ์‚ฌ์šฉํ•˜๋Š” ๋ฒ”์œ„๋Š” this์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ selectNodeContents(node) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. node๊ฐ€ ๋ฌธ์„œ ์œ ํ˜•์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidNodeTypeError" DOMException.

  2. length๋ฅผ ๋‹ค์Œ ๊ธธ์ด๋กœ ๋‘ก๋‹ˆ๋‹ค: node์˜ ๊ธธ์ด.

  3. ๋‹ค์Œ ์‹œ์ž‘์ ์„ ๊ฒฝ๊ณ„์  (node, 0)์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. ๋‹ค์Œ ๋์ ์„ ๊ฒฝ๊ณ„ ์  (node, length)์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.


๋‹ค์Œ compareBoundaryPoints(how, sourceRange) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. how๊ฐ€ ๋‹ค์Œ ์ค‘ ์–ด๋А ๊ฒƒ๋„ ์•„๋‹ˆ๋ฉด

    ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "NotSupportedError" DOMException.

  2. ๋‹ค์Œ this์˜ ๋ฃจํŠธ๊ฐ€ sourceRange์˜ ๋ฃจํŠธ์™€ ๋‹ค๋ฅด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "WrongDocumentError" DOMException.

  3. thisPoint์™€ sourcePoint๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. how์— ๋”ฐ๋ผ ๋ถ„๊ธฐํ•ฉ๋‹ˆ๋‹ค:

    START_TO_START:

    thisPoint๋ฅผ this์˜ ์‹œ์ž‘์ ์œผ๋กœ, sourcePoint๋ฅผ sourceRange์˜ ์‹œ์ž‘์ ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    START_TO_END:

    thisPoint๋ฅผ this์˜ ๋์ ์œผ๋กœ, sourcePoint๋ฅผ sourceRange์˜ ์‹œ์ž‘์ ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    END_TO_END:

    thisPoint๋ฅผ this์˜ ๋์ ์œผ๋กœ, sourcePoint๋ฅผ sourceRange์˜ ๋์ ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    END_TO_START:

    thisPoint๋ฅผ this์˜ ์‹œ์ž‘์ ์œผ๋กœ, sourcePoint๋ฅผ sourceRange์˜ ๋์ ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ๋‹ค์Œ ์œ„์น˜์— ๋”ฐ๋ผ ๋ถ„๊ธฐํ•ฉ๋‹ˆ๋‹ค. thisPoint์˜ ์œ„์น˜์ด๋ฉฐ, ๊ธฐ์ค€์€ sourcePoint์ž…๋‹ˆ๋‹ค:

    ์•ž
    โˆ’1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    ๊ฐ™์Œ
    0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    ๋’ค
    1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ deleteContents() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๋‹ค์Œ this๊ฐ€ ์ถ•์†Œ๋œ ์ƒํƒœ์ด๋ฉด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. originalStartNode, originalStartOffset, originalEndNode, originalEndOffset์„ ๊ฐ๊ฐ this์˜ ์‹œ์ž‘ ๋…ธ๋“œ, ์‹œ์ž‘ ์˜คํ”„์…‹, ๋ ๋…ธ๋“œ, ๊ทธ๋ฆฌ๊ณ  ๋ ์˜คํ”„์…‹์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. originalStartNode๊ฐ€ originalEndNode์ด๊ณ  ์ด๊ฒƒ์ด CharacterData ๋…ธ๋“œ์ด๋ฉด:

    1. ๋ฐ์ดํ„ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ originalStartNode์ด๋ฉฐ, ์ธ์ˆ˜๋Š” originalStartOffset, originalEndOffset โˆ’ originalStartOffset, ๊ทธ๋ฆฌ๊ณ  ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

    2. ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. nodesToRemove๋ฅผ ๋‹ค์Œ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๋ชฉ๋ก์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด ๋…ธ๋“œ๋“ค์€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„๋Š” this์ด๋ฉฐ, ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ ๋‚˜์—ดํ•˜๋˜, ๋‹ค์Œ ๋…ธ๋“œ๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋˜ํ•œ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„๋Š” this์ž…๋‹ˆ๋‹ค.

  5. newNode์™€ newOffset์„ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  6. originalStartNode๊ฐ€ ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด๋ฉด: originalEndNode, newNode๋ฅผ originalStartNode๋กœ, newOffset์„ originalStartOffset์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

    1. referenceNode๋ฅผ originalStartNode๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. referenceNode์˜ ๋ถ€๋ชจ๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด ์•„๋‹Œ ๋™์•ˆ: originalEndNode, referenceNode๋ฅผ ๊ทธ ๋ถ€๋ชจ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. newNode๋ฅผ referenceNode์˜ ๋ถ€๋ชจ๋กœ, newOffset์„ referenceNode์˜ ์ธ๋ฑ์Šค + 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      referenceNode์˜ ๋ถ€๋ชจ๊ฐ€ null์ด๋ผ๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ๋Š” ๋ฃจํŠธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฒ”์œ„๋Š” this์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋Š” ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค: originalEndNode. ๋”ฐ๋ผ์„œ ์ด ์ง€์ ์— ๋„๋‹ฌํ•  ์ˆ˜ ์—†์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  8. ๋‹ค์Œ this์˜ ์‹œ์ž‘์ ๊ณผ ๋์ ์„ (newNode, newOffset)์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  9. originalStartNode๊ฐ€ CharacterData ๋…ธ๋“œ์ด๋ฉด, ๋ฐ์ดํ„ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ originalStartNode์ด๋ฉฐ, ์ธ์ˆ˜๋Š” originalStartOffset, originalStartNode์˜ ๊ธธ์ด โˆ’ originalStartOffset, ๊ทธ๋ฆฌ๊ณ  ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

  10. ๊ฐ node(nodesToRemove์— ์†ํ•จ)์— ๋Œ€ํ•ด, ํŠธ๋ฆฌ ์ˆœ์„œ๋กœ: ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค: node๋ฅผ.

  11. originalEndNode๊ฐ€ CharacterData ๋…ธ๋“œ์ด๋ฉด, ๋ฐ์ดํ„ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ originalEndNode์ด๋ฉฐ, ์ธ์ˆ˜๋Š” 0, originalEndOffset, ๊ทธ๋ฆฌ๊ณ  ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ ๋ผ์ด๋ธŒ ๋ฒ”์œ„ range์ž…๋‹ˆ๋‹ค:

  1. fragment๋ฅผ ๋‹ค์Œ ๋ฌธ์„œ ์กฐ๊ฐ ์ƒ์„ฑ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ range์˜ ์‹œ์ž‘ ๋…ธ๋“œ์˜ ๋…ธ๋“œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

  2. range๊ฐ€ ์ถ•์†Œ๋œ ์ƒํƒœ์ด๋ฉด, fragment๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. originalStartNode, originalStartOffset, originalEndNode, originalEndOffset์„ ๊ฐ๊ฐ range์˜ ์‹œ์ž‘ ๋…ธ๋“œ, ์‹œ์ž‘ ์˜คํ”„์…‹, ๋ ๋…ธ๋“œ, ๊ทธ๋ฆฌ๊ณ  ๋ ์˜คํ”„์…‹์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. originalStartNode๊ฐ€ originalEndNode์ด๊ณ  ์ด๊ฒƒ์ด CharacterData ๋…ธ๋“œ์ด๋ฉด:

    1. clone์„ ๋‹ค์Œ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: originalStartNode.

    2. clone์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ถ”์ถœ. ๋Œ€์ƒ์€ originalStartNode์ด๋ฉฐ, ์ธ์ˆ˜๋Š” originalStartOffset๊ณผ originalEndOffset โˆ’ originalStartOffset์ž…๋‹ˆ๋‹ค.

    3. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: clone์„ fragment์—.

    4. ๋ฐ์ดํ„ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ originalStartNode์ด๋ฉฐ, ์ธ์ˆ˜๋Š” originalStartOffset, originalEndOffset โˆ’ originalStartOffset, ๊ทธ๋ฆฌ๊ณ  ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

    5. fragment๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  5. commonAncestor๋ฅผ ๋‹ค์Œ ๊ณตํ†ต ์กฐ์ƒ ๊ฐ€์ ธ์˜ค๊ธฐ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ range์ž…๋‹ˆ๋‹ค.

  6. firstPartiallyContainedChild๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  7. originalStartNode๊ฐ€ ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด ์•„๋‹ˆ๋ฉด: originalEndNode, firstPartiallyContainedChild๋ฅผ ๋‹ค์Œ ์ฒซ ๋ฒˆ์งธ ์ž์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ž์‹์€ commonAncestor์˜ ์ž์‹์ด๋ฉฐ, ๋ถ€๋ถ„์ ์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„๋Š” range์ž…๋‹ˆ๋‹ค.
  8. lastPartiallyContainedChild๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  9. originalEndNode๊ฐ€ ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด ์•„๋‹ˆ๋ฉด: originalStartNode, lastPartiallyContainedChild๋ฅผ ๋‹ค์Œ ๋งˆ์ง€๋ง‰ ์ž์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ž์‹์€ commonAncestor์˜ ์ž์‹์ด๋ฉฐ, ๋ถ€๋ถ„์ ์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„๋Š” range์ž…๋‹ˆ๋‹ค.

    ์ด ๋ณ€์ˆ˜ ํ• ๋‹น๋“ค์€ ์‹ค์ œ๋กœ ํ•ญ์ƒ ํƒ€๋‹นํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ์กฐ๊ฑด์„ ์ƒ๊ฐํ•ด ๋ด…๋‹ˆ๋‹ค: originalStartNode๊ฐ€ ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด ์•„๋‹Œ ๊ฒฝ์šฐ: originalEndNode. ๊ทธ๋Ÿฌ๋ฉด originalStartNode ์ž์ฒด๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„๋Š” range์ด๋ฉฐ, ๊ทธ ๋ชจ๋“  ์กฐ์ƒ๋„ ๋‹ค์Œ ์ž์‹์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค: commonAncestor์˜ ์ž์‹. commonAncestor๋Š” originalStartNode์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค: originalEndNode. ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋„ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋‘ ์ž์‹์ด ๋ชจ๋‘ ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด ์ ˆ๋Œ€๋กœ ๊ฐ™์„ ์ˆ˜ ์—†๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ฉ๋‹ˆ๋‹ค.

  10. containedChildren์„ ๋‹ค์Œ ๋ชจ๋“  ์ž์‹์˜ ๋ชฉ๋ก์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด๋“ค์€ commonAncestor์˜ ์ž์‹์ด๋ฉฐ, ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„๊ฐ€ range์ธ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค. ๋‚˜์—ด ์ˆœ์„œ๋Š” ํŠธ๋ฆฌ ์ˆœ์„œ์ž…๋‹ˆ๋‹ค.

  11. containedChildren์˜ ๊ตฌ์„ฑ์› ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ฌธ์„œ ์œ ํ˜•์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "HierarchyRequestError" DOMException.

    ์ฒซ ๋ฒˆ์งธ ๋˜๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ถ€๋ถ„์ ์œผ๋กœ ํฌํ•จ๋œ ๋…ธ๋“œ๋Š” ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ ์œ ํ˜•์€ ์ ˆ๋Œ€๋กœ ๋ถ€๋ถ„์ ์œผ๋กœ ํฌํ•จ๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฒ”์œ„์˜ ๊ฒฝ๊ณ„์ ์ด ๋  ์ˆ˜ ์—†์œผ๋ฉฐ, ์–ด๋–ค ๊ฒƒ์˜ ์กฐ์ƒ๋„ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  12. newNode์™€ newOffset์„ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  13. originalStartNode๊ฐ€ ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด๋ฉด: originalEndNode, newNode๋ฅผ originalStartNode๋กœ, newOffset์„ originalStartOffset์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  14. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

    1. referenceNode๋ฅผ originalStartNode๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. referenceNode์˜ ๋ถ€๋ชจ๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด ์•„๋‹Œ ๋™์•ˆ: originalEndNode, referenceNode๋ฅผ ๊ทธ ๋ถ€๋ชจ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. newNode๋ฅผ ๋‹ค์Œ ๋ถ€๋ชจ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: referenceNode์˜ ๋ถ€๋ชจ. ๊ทธ๋ฆฌ๊ณ  newOffset์„ referenceNode์˜ ์ธ๋ฑ์Šค + 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      referenceNode์˜ ๋ถ€๋ชจ๊ฐ€ null์ด๋ผ๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ๋Š” ๋ฃจํŠธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฒ”์œ„๋Š” range์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋Š” ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค: originalEndNode. ๋”ฐ๋ผ์„œ ์ด ์ง€์ ์— ๋„๋‹ฌํ•  ์ˆ˜ ์—†์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  15. range์˜ ์‹œ์ž‘์ ๊ณผ ๋์ ์„ (newNode, newOffset)์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  16. firstPartiallyContainedChild๊ฐ€ CharacterData ๋…ธ๋“œ์ด๋ฉด:

    ์ด ๊ฒฝ์šฐ, firstPartiallyContainedChild๋Š” originalStartNode์ž…๋‹ˆ๋‹ค.

    1. clone์„ ๋‹ค์Œ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: originalStartNode.

    2. ๋‹ค์Œ ๋ฐ์ดํ„ฐ, ์ฆ‰ clone์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ถ”์ถœ. ๋Œ€์ƒ์€ originalStartNode์ด๋ฉฐ, ์ธ์ˆ˜๋Š” originalStartOffset๊ณผ originalStartNode์˜ ๊ธธ์ด โˆ’ originalStartOffset์ž…๋‹ˆ๋‹ค.

    3. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: clone์„ fragment์—.

    4. ๋ฐ์ดํ„ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ originalStartNode์ด๋ฉฐ, ์ธ์ˆ˜๋Š” originalStartOffset, originalStartNode์˜ ๊ธธ์ด โˆ’ originalStartOffset, ๊ทธ๋ฆฌ๊ณ  ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

  17. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  firstPartiallyContainedChild๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. clone์„ ๋‹ค์Œ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: firstPartiallyContainedChild.

    2. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: clone์„ fragment์—.

    3. subrange๋ฅผ ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ ๋ฒ”์œ„๋กœ ๋‘ก๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ž‘์ ์€ (originalStartNode, originalStartOffset)์ด๊ณ , ๊ทธ ๋์ ์€ (firstPartiallyContainedChild, firstPartiallyContainedChild์˜ ๊ธธ์ด)์ž…๋‹ˆ๋‹ค.

    4. subfragment๋ฅผ ๋‹ค์Œ ์ถ”์ถœ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ subrange์ž…๋‹ˆ๋‹ค.

    5. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: subfragment๋ฅผ clone์—.
  18. ๊ฐ contained child(containedChildren์— ์†ํ•จ)์— ๋Œ€ํ•ด: ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: contained child๋ฅผ fragment์—.

  19. lastPartiallyContainedChild๊ฐ€ CharacterData ๋…ธ๋“œ์ด๋ฉด:

    ์ด ๊ฒฝ์šฐ, lastPartiallyContainedChild๋Š” originalEndNode์ž…๋‹ˆ๋‹ค.

    1. clone์„ ๋‹ค์Œ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: originalEndNode.

    2. clone์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ถ”์ถœ. ๋Œ€์ƒ์€ originalEndNode์ด๋ฉฐ, ์ธ์ˆ˜๋Š” 0๊ณผ originalEndOffset์ž…๋‹ˆ๋‹ค.

    3. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: clone์„ fragment์—.

    4. ๋ฐ์ดํ„ฐ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ originalEndNode์ด๋ฉฐ, ์ธ์ˆ˜๋Š” 0, originalEndOffset, ๊ทธ๋ฆฌ๊ณ  ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

  20. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  lastPartiallyContainedChild๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. clone์„ ๋‹ค์Œ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: lastPartiallyContainedChild.

    2. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: clone์„ fragment์—.

    3. subrange๋ฅผ ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ ๋ฒ”์œ„๋กœ ๋‘ก๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ž‘์ ์€ (lastPartiallyContainedChild, 0)์ด๊ณ , ๊ทธ ๋์ ์€ (originalEndNode, originalEndOffset)์ž…๋‹ˆ๋‹ค.

    4. subfragment๋ฅผ ๋‹ค์Œ ์ถ”์ถœ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ subrange์ž…๋‹ˆ๋‹ค.

    5. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: subfragment๋ฅผ clone์—.

  21. fragment๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ extractContents() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์ถ”์ถœ. ๋Œ€์ƒ์€ this์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚ด์šฉ์„ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ ๋ผ์ด๋ธŒ ๋ฒ”์œ„ range์ž…๋‹ˆ๋‹ค:

  1. fragment๋ฅผ ๋‹ค์Œ ๋ฌธ์„œ ์กฐ๊ฐ ์ƒ์„ฑ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ range์˜ ์‹œ์ž‘ ๋…ธ๋“œ์˜ ๋…ธ๋“œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

  2. range๊ฐ€ ์ถ•์†Œ๋œ ์ƒํƒœ์ด๋ฉด, fragment๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. originalStartNode, originalStartOffset, originalEndNode, originalEndOffset์„ ๊ฐ๊ฐ range์˜ ์‹œ์ž‘ ๋…ธ๋“œ, ์‹œ์ž‘ ์˜คํ”„์…‹, ๋ ๋…ธ๋“œ, ๊ทธ๋ฆฌ๊ณ  ๋ ์˜คํ”„์…‹์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. originalStartNode๊ฐ€ originalEndNode์ด๊ณ  ์ด๊ฒƒ์ด CharacterData ๋…ธ๋“œ์ด๋ฉด:

    1. clone์„ ๋‹ค์Œ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: originalStartNode.

    2. clone์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ถ”์ถœ. ๋Œ€์ƒ์€ originalStartNode์ด๋ฉฐ, ์ธ์ˆ˜๋Š” originalStartOffset๊ณผ originalEndOffset โˆ’ originalStartOffset์ž…๋‹ˆ๋‹ค.

    3. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: clone์„ fragment์—.

    4. fragment๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. commonAncestor๋ฅผ ๋‹ค์Œ ๊ณตํ†ต ์กฐ์ƒ ๊ฐ€์ ธ์˜ค๊ธฐ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ range์ž…๋‹ˆ๋‹ค.

  6. firstPartiallyContainedChild๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  7. originalStartNode๊ฐ€ ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด ์•„๋‹ˆ๋ฉด: originalEndNode, firstPartiallyContainedChild๋ฅผ ๋‹ค์Œ ์ฒซ ๋ฒˆ์งธ ์ž์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ž์‹์€ commonAncestor์˜ ์ž์‹์ด๋ฉฐ, ๋ถ€๋ถ„์ ์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„๋Š” range์ž…๋‹ˆ๋‹ค.

  8. lastPartiallyContainedChild๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  9. originalEndNode๊ฐ€ ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด ์•„๋‹ˆ๋ฉด: originalStartNode, lastPartiallyContainedChild๋ฅผ ๋‹ค์Œ ๋งˆ์ง€๋ง‰ ์ž์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ž์‹์€ commonAncestor์˜ ์ž์‹์ด๋ฉฐ, ๋ถ€๋ถ„์ ์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„๋Š” range์ž…๋‹ˆ๋‹ค.

    ์ด ๋ณ€์ˆ˜ ํ• ๋‹น๋“ค์€ ์‹ค์ œ๋กœ ํ•ญ์ƒ ํƒ€๋‹นํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ์กฐ๊ฑด์„ ์ƒ๊ฐํ•ด ๋ด…๋‹ˆ๋‹ค: originalStartNode๊ฐ€ ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด ์•„๋‹Œ ๊ฒฝ์šฐ: originalEndNode. ๊ทธ๋Ÿฌ๋ฉด originalStartNode ์ž์ฒด๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„๋Š” range์ด๋ฉฐ, ๊ทธ ๋ชจ๋“  ์กฐ์ƒ๋„ ๋‹ค์Œ ์ž์‹์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค: commonAncestor์˜ ์ž์‹. commonAncestor๋Š” originalStartNode์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค: originalEndNode. ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋„ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋‘ ์ž์‹์ด ๋ชจ๋‘ ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด ์ ˆ๋Œ€๋กœ ๊ฐ™์„ ์ˆ˜ ์—†๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ฉ๋‹ˆ๋‹ค.

  10. containedChildren์„ ๋‹ค์Œ ๋ชจ๋“  ์ž์‹์˜ ๋ชฉ๋ก์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด๋“ค์€ commonAncestor์˜ ์ž์‹์ด๋ฉฐ, ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„๊ฐ€ range์ธ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค. ๋‚˜์—ด ์ˆœ์„œ๋Š” ํŠธ๋ฆฌ ์ˆœ์„œ์ž…๋‹ˆ๋‹ค.

  11. containedChildren์˜ ๊ตฌ์„ฑ์› ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ฌธ์„œ ์œ ํ˜•์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "HierarchyRequestError" DOMException.

    ์ฒซ ๋ฒˆ์งธ ๋˜๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ถ€๋ถ„์ ์œผ๋กœ ํฌํ•จ๋œ ๋…ธ๋“œ๋Š” ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ ์œ ํ˜•์€ ์ ˆ๋Œ€๋กœ ๋ถ€๋ถ„์ ์œผ๋กœ ํฌํ•จ๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฒ”์œ„์˜ ๊ฒฝ๊ณ„์ ์ด ๋  ์ˆ˜ ์—†์œผ๋ฉฐ, ์–ด๋–ค ๊ฒƒ์˜ ์กฐ์ƒ๋„ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  12. firstPartiallyContainedChild๊ฐ€ CharacterData ๋…ธ๋“œ์ด๋ฉด:

    ์ด ๊ฒฝ์šฐ, firstPartiallyContainedChild๋Š” originalStartNode์ž…๋‹ˆ๋‹ค.

    1. clone์„ ๋‹ค์Œ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: originalStartNode.

    2. ๋‹ค์Œ ๋ฐ์ดํ„ฐ, ์ฆ‰ clone์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ถ”์ถœ. ๋Œ€์ƒ์€ originalStartNode์ด๋ฉฐ, ์ธ์ˆ˜๋Š” originalStartOffset๊ณผ originalStartNode์˜ ๊ธธ์ด โˆ’ originalStartOffset์ž…๋‹ˆ๋‹ค.

    3. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: clone์„ fragment์—.

  13. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  firstPartiallyContainedChild๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. clone์„ ๋‹ค์Œ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: firstPartiallyContainedChild.

    2. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: clone์„ fragment์—.

    3. subrange๋ฅผ ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ ๋ฒ”์œ„๋กœ ๋‘ก๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ž‘์ ์€ (originalStartNode, originalStartOffset)์ด๊ณ , ๊ทธ ๋์ ์€ (firstPartiallyContainedChild, firstPartiallyContainedChild์˜ ๊ธธ์ด)์ž…๋‹ˆ๋‹ค.

    4. subfragment๋ฅผ ๋‹ค์Œ ๋‚ด์šฉ ๋ณต์ œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ subrange์ž…๋‹ˆ๋‹ค.

    5. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: subfragment๋ฅผ clone์—.

  14. ๊ฐ contained child(containedChildren์— ์†ํ•จ)์— ๋Œ€ํ•ด:

    1. clone์„ ๋‹ค์Œ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: contained child. ์ด๋•Œ subtree๋Š” true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: clone์„ fragment์—.

  15. lastPartiallyContainedChild๊ฐ€ CharacterData ๋…ธ๋“œ์ด๋ฉด:

    ์ด ๊ฒฝ์šฐ, lastPartiallyContainedChild๋Š” originalEndNode์ž…๋‹ˆ๋‹ค.

    1. clone์„ ๋‹ค์Œ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: originalEndNode.

    2. clone์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ถ”์ถœ. ๋Œ€์ƒ์€ originalEndNode์ด๋ฉฐ, ์ธ์ˆ˜๋Š” 0๊ณผ originalEndOffset์ž…๋‹ˆ๋‹ค.

    3. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: clone์„ fragment์—.

  16. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  lastPartiallyContainedChild๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. clone์„ ๋‹ค์Œ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค: lastPartiallyContainedChild.

    2. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: clone์„ fragment์—.

    3. subrange๋ฅผ ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ ๋ฒ”์œ„๋กœ ๋‘ก๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ž‘์ ์€ (lastPartiallyContainedChild, 0)์ด๊ณ , ๊ทธ ๋์ ์€ (originalEndNode, originalEndOffset)์ž…๋‹ˆ๋‹ค.

    4. subfragment๋ฅผ ๋‹ค์Œ ๋‚ด์šฉ ๋ณต์ œ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ subrange์ž…๋‹ˆ๋‹ค.

    5. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: subfragment๋ฅผ clone์—.

  17. fragment๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ cloneContents() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๋‚ด์šฉ ๋ณต์ œ. ๋Œ€์ƒ์€ this์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์‚ฝ์ž…ํ•  ๋…ธ๋“œ๋Š” node์ด๋ฉฐ, ์‚ฝ์ž… ๋Œ€์ƒ์€ ๋ผ์ด๋ธŒ ๋ฒ”์œ„ range์ž…๋‹ˆ๋‹ค:

  1. range์˜ ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ ProcessingInstruction ๋˜๋Š” Comment ๋…ธ๋“œ์ด๊ฑฐ๋‚˜, Text ๋…ธ๋“œ์ด๋ฉด์„œ ๊ทธ ๋ถ€๋ชจ๊ฐ€ null์ด๊ฑฐ๋‚˜, node์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "HierarchyRequestError" DOMException.

  2. referenceNode๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. range์˜ ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ Text ๋…ธ๋“œ์ด๋ฉด, referenceNode๋ฅผ ํ•ด๋‹น Text ๋…ธ๋“œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, referenceNode๋ฅผ ๋‹ค์Œ ์ž์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž์‹์€ range์˜ ์‹œ์ž‘ ๋…ธ๋“œ์˜ ์ž์‹์ด๋ฉฐ, ๊ทธ ์ธ๋ฑ์Šค๋Š” range์˜ ์‹œ์ž‘ ์˜คํ”„์…‹๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์ž์‹์ด ์žˆ์œผ๋ฉด ๊ทธ ์ž์‹์œผ๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. parent๋ฅผ range์˜ ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด๋Š” referenceNode๊ฐ€ null์ธ ๊ฒฝ์šฐ์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด referenceNode์˜ ๋ถ€๋ชจ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  6. ์‚ฌ์ „ ์‚ฝ์ž… ์œ ํšจ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ node, parent, referenceNode, ๊ทธ๋ฆฌ๊ณ  ยซ ยป์ž…๋‹ˆ๋‹ค.

  7. range์˜ ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ Text ๋…ธ๋“œ์ด๋ฉด, referenceNode๋ฅผ ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ถ„ํ• ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์˜คํ”„์…‹์€ range์˜ ์‹œ์ž‘ ์˜คํ”„์…‹์ž…๋‹ˆ๋‹ค.

  8. node๊ฐ€ referenceNode์ด๋ฉด, referenceNode๋ฅผ ๊ทธ ๋‹ค์Œ ํ˜•์ œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  9. node์˜ ๋ถ€๋ชจ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค: node๋ฅผ.

  10. newOffset์„ parent์˜ ๊ธธ์ด๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด๋Š” referenceNode๊ฐ€ null์ธ ๊ฒฝ์šฐ์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด referenceNode์˜ ์ธ๋ฑ์Šค๋กœ ๋‘ก๋‹ˆ๋‹ค.

  11. newOffset์„ node์˜ ๊ธธ์ด๋งŒํผ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Š” node๊ฐ€ DocumentFragment ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 1๋งŒํผ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค.

  12. ์‚ฌ์ „ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค: node๋ฅผ parent์—, referenceNode ์•ž์—.

  13. range๊ฐ€ ์ถ•์†Œ๋œ ์ƒํƒœ์ด๋ฉด, range์˜ ๋์ ์„ (parent, newOffset)์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ insertNode(node) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ์‚ฝ์ž…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฝ์ž…ํ•  ๋…ธ๋“œ๋Š” node์ด๋ฉฐ, ์‚ฝ์ž… ๋Œ€์ƒ์€ this์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ surroundContents(newParent) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๋‹ค์Œ Text๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ๊ณ , ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„๊ฐ€ this์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidStateError" DOMException.

  2. newParent๊ฐ€ Document, DocumentType, ๋˜๋Š” DocumentFragment ๋…ธ๋“œ์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidNodeTypeError" DOMException.

    ์—ญ์‚ฌ์ ์ธ ์ด์œ ๋กœ CharacterData ๋…ธ๋“œ๋Š” ์—ฌ๊ธฐ์„œ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋‚˜์ค‘์— ๋ถ€์ˆ˜ ํšจ๊ณผ๋กœ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  3. fragment๋ฅผ ๋‹ค์Œ ์ถ”์ถœ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์ž…๋‹ˆ๋‹ค.

  4. newParent์— ์ž์‹์ด ์žˆ์œผ๋ฉด, ๋ชจ๋‘ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค. ๊ต์ฒดํ•  ๋…ธ๋“œ๋Š” null์ด๋ฉฐ, ๋Œ€์ƒ์€ newParent์ž…๋‹ˆ๋‹ค.

  5. ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค: newParent๋ฅผ this์—.

  6. ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: fragment๋ฅผ newParent์—.

  7. ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ newParent์ด๋ฉฐ, ์„ ํƒ์— ์‚ฌ์šฉํ•˜๋Š” ๋ฒ”์œ„๋Š” this์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ cloneRange() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ ๋ฒ”์œ„๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฒ”์œ„์˜ ์‹œ์ž‘์ ๊ณผ ๋์ ์€ this์˜ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ detach() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ธฐ๋Šฅ(Range ๊ฐ์ฒด ๋น„ํ™œ์„ฑํ™”)์€ ์ œ๊ฑฐ๋˜์—ˆ์ง€๋งŒ, ๋ฉ”์„œ๋“œ ์ž์ฒด๋Š” ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.


position = range . comparePoint(node, offset)
์ ์ด ๋ฒ”์œ„ ์•ž์— ์žˆ์œผ๋ฉด โˆ’1์„, ์ ์ด ๋ฒ”์œ„ ์•ˆ์— ์žˆ์œผ๋ฉด 0์„, ์ ์ด ๋ฒ”์œ„ ๋’ค์— ์žˆ์œผ๋ฉด 1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
intersects = range . intersectsNode(node)
range๊ฐ€ ๋‹ค์Œ๊ณผ ๊ต์ฐจํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: node.

๋‹ค์Œ isPointInRange(node, offset) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. node์˜ ๋ฃจํŠธ๊ฐ€ this์˜ ๋ฃจํŠธ์™€ ๋‹ค๋ฅด๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. node๊ฐ€ ๋ฌธ์„œ ์œ ํ˜•์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidNodeTypeError" DOMException.

  3. offset์ด node์˜ ๊ธธ์ด๋ณด๋‹ค ํฌ๋ฉด, ๋˜์ง‘๋‹ˆ๋‹ค: "IndexSizeError" DOMException.

  4. (node, offset)์ด ๋‹ค์Œ๋ณด๋‹ค ์•ž์— ์žˆ์œผ๋ฉด: ์‹œ์ž‘์ , ๋˜๋Š” ๋‹ค์Œ๋ณด๋‹ค ๋’ค์— ์žˆ์œผ๋ฉด: ๋์ , ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: false.

  5. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ comparePoint(node, offset) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. node์˜ ๋ฃจํŠธ๊ฐ€ this์˜ ๋ฃจํŠธ์™€ ๋‹ค๋ฅด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "WrongDocumentError" DOMException.

  2. node๊ฐ€ ๋ฌธ์„œ ์œ ํ˜•์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidNodeTypeError" DOMException.

  3. offset์ด node์˜ ๊ธธ์ด๋ณด๋‹ค ํฌ๋ฉด, ๋˜์ง‘๋‹ˆ๋‹ค: "IndexSizeError" DOMException.

  4. (node, offset)์ด ๋‹ค์Œ๋ณด๋‹ค ์•ž์— ์žˆ์œผ๋ฉด: ์‹œ์ž‘์ , โˆ’1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. (node, offset)์ด ๋‹ค์Œ๋ณด๋‹ค ๋’ค์— ์žˆ์œผ๋ฉด: ๋์ , 1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  6. 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


๋‹ค์Œ intersectsNode(node) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. node์˜ ๋ฃจํŠธ๊ฐ€ this์˜ ๋ฃจํŠธ์™€ ๋‹ค๋ฅด๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. parent๋ฅผ node์˜ ๋ถ€๋ชจ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. parent๊ฐ€ null์ด๋ฉด, true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. offset์„ node์˜ ์ธ๋ฑ์Šค๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. (parent, offset)์ด ๋‹ค์Œ๋ณด๋‹ค ์•ž์— ์žˆ๊ณ : ๋์ , (parent, offset + 1)์ด ๋‹ค์Œ๋ณด๋‹ค ๋’ค์— ์žˆ์œผ๋ฉด: ์‹œ์ž‘์ , true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  6. false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


๋‹ค์Œ ๋ฌธ์ž์—ดํ™” ๋™์ž‘์€ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  1. string์„ ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ this์˜ ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ this์˜ ๋ ๋…ธ๋“œ์ด๊ณ , ์ด๊ฒƒ์ด Text ๋…ธ๋“œ์ด๋ฉด, ๋‹ค์Œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น Text ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ ์ค‘ ๋‹ค์Œ this์˜ ์‹œ์ž‘ ์˜คํ”„์…‹์—์„œ ์‹œ์ž‘ํ•˜๊ณ  ๋‹ค์Œ this์˜ ๋ ์˜คํ”„์…‹์—์„œ ๋๋‚˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

  3. ๋‹ค์Œ this์˜ ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ Text ๋…ธ๋“œ์ด๋ฉด, ๋‹ค์Œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋ง๋ถ™์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ ์ค‘ this์˜ ์‹œ์ž‘ ์˜คํ”„์…‹๋ถ€ํ„ฐ ๋๊นŒ์ง€์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด๋ฉฐ, ๋ง๋ถ™์ผ ๋Œ€์ƒ์€ string์ž…๋‹ˆ๋‹ค.

  4. ๋‹ค์Œ ์—ฐ๊ฒฐ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ถ™์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐํ•  ๊ฐ’์€ ๋ฐ์ดํ„ฐ์ด๋ฉฐ, ๋‹ค์Œ ๋ชจ๋“  Text ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๋…ธ๋“œ๋Š” ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„๋Š” this์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ์ˆœ์„œ๋Š” ํŠธ๋ฆฌ ์ˆœ์„œ์ด๋ฉฐ, ๋ง๋ถ™์ผ ๋Œ€์ƒ์€ string์ž…๋‹ˆ๋‹ค.

  5. ๋‹ค์Œ this์˜ ๋ ๋…ธ๋“œ๊ฐ€ Text ๋…ธ๋“œ์ด๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ ์ค‘ ์‹œ์ž‘๋ถ€ํ„ฐ ๋‹ค์Œ this์˜ ๋ ์˜คํ”„์…‹๊นŒ์ง€์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ string์— ๋ง๋ถ™์ž…๋‹ˆ๋‹ค.

  6. string์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


๋‹ค์Œ createContextualFragment(), getClientRects(), ๊ทธ๋ฆฌ๊ณ  getBoundingClientRect() ๋ฉ”์„œ๋“œ๋Š” ๋‹ค๋ฅธ ๋ช…์„ธ์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. [DOM-Parsing] [CSSOM-VIEW]

6. ํŠธ๋ž˜๋ฒ„์„ค(Traversal)

NodeIterator ๋ฐ TreeWalker ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ ํŠธ๋ฆฌ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ NodeIterator ๋ฐ TreeWalker ๊ฐ์ฒด์—๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์ธ ํ™œ์„ฑ ์ƒํƒœ ์—ฌ๋ถ€๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์ดˆ๊ธฐ์—๋Š” false์ž…๋‹ˆ๋‹ค.

๊ฐ NodeIterator ๋ฐ TreeWalker ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํ•ญ๋ชฉ๋„ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฃจํŠธ(๋…ธ๋“œ), whatToShow(๋น„ํŠธ๋งˆ์Šคํฌ), ๊ทธ๋ฆฌ๊ณ  ํ•„ํ„ฐ(์ฝœ๋ฐฑ)์ž…๋‹ˆ๋‹ค.

ํ•„ํ„ฐ๋งํ•˜๋ ค๋ฉด, ๋…ธ๋“œ node๋ฅผ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์ธ NodeIterator ๋˜๋Š” TreeWalker ๊ฐ์ฒด traverser ๋‚ด์—์„œ:

  1. traverser์˜ ํ™œ์„ฑ ์ƒํƒœ ์—ฌ๋ถ€๊ฐ€ true์ด๋ฉด "InvalidStateError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

  2. n์„ node์˜ nodeType ์†์„ฑ ๊ฐ’ โˆ’ 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. traverser์˜ n๋ฒˆ์งธ ๋น„ํŠธ(0์€ ์ตœํ•˜์œ„ ๋น„ํŠธ)๊ฐ€ whatToShow์—์„œ ์„ค์ •๋˜์ง€ ์•Š์•˜์œผ๋ฉด FILTER_SKIP์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. traverser์˜ ํ•„ํ„ฐ๊ฐ€ null์ด๋ฉด FILTER_ACCEPT๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. traverser์˜ ํ™œ์„ฑ ์ƒํƒœ ์—ฌ๋ถ€๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. result๋ฅผ ์‚ฌ์šฉ์ž ๊ฐ์ฒด์˜ ์ž‘์—…์„ ํ˜ธ์ถœํ•œ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ traverser์˜ ํ•„ํ„ฐ, "acceptNode", ๊ทธ๋ฆฌ๊ณ  ยซ node ยป๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด traverser์˜ ํ™œ์„ฑ ์ƒํƒœ ์—ฌ๋ถ€๋ฅผ false๋กœ ์„ค์ •ํ•˜๊ณ  ์˜ˆ์™ธ๋ฅผ ๋‹ค์‹œ ๋˜์ง‘๋‹ˆ๋‹ค.

  7. traverser์˜ ํ™œ์„ฑ ์ƒํƒœ ์—ฌ๋ถ€๋ฅผ false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  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 ๊ฐ์ฒด๋Š” createNodeIterator() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” Document ๊ฐ์ฒด์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๊ฐ NodeIterator ๊ฐ์ฒด์—๋Š” ์—ฐ๊ฒฐ๋œ ๋ฐ˜๋ณต์ž ์ปฌ๋ ‰์…˜์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” NodeIterator ๊ฐ์ฒด์˜ ๋ฃจํŠธ๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์ปฌ๋ ‰์…˜์œผ๋กœ, ํ•„ํ„ฐ๊ฐ€ ๋ชจ๋“  ๋…ธ๋“œ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ ํฌ์ธํ„ฐ๋Š” ๋…ธ๋“œ(๋…ธ๋“œ)์™€ ์•ž์ชฝ ํฌ์ธํ„ฐ(๋ถˆ๋ฆฌ์–ธ)๋กœ ๊ตฌ์„ฑ๋œ ํŠœํ”Œ์ž…๋‹ˆ๋‹ค.

๊ฐ NodeIterator ๊ฐ์ฒด์—๋Š” ์—ฐ๊ฒฐ๋œ ์ฐธ์กฐ( ๋…ธ๋“œ ํฌ์ธํ„ฐ)์™€ ํ›„๋ณด ์ฐธ์กฐ(null ๋˜๋Š” ๋…ธ๋“œ ํฌ์ธํ„ฐ์ด๋ฉฐ, ์ดˆ๊ธฐ๊ฐ’์€ null)๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด NodeIterator ๊ฐ์ฒด์—๋Š” ํ™œ์„ฑ ์ƒํƒœ ์—ฌ๋ถ€, ๋ฃจํŠธ, whatToShow, ๊ทธ๋ฆฌ๊ณ  ํ•„ํ„ฐ๋„ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

NodeIterator ๊ฐ์ฒด nodeIterator์™€ ๋…ธ๋“œ toBeRemovedNode๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ NodeIterator ์‚ฌ์ „ ์ œ๊ฑฐ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. nodeIterator์˜ ์ฐธ์กฐ๋ฅผ nodeIterator์˜ ์ฐธ์กฐ, nodeIterator, ๊ทธ๋ฆฌ๊ณ  toBeRemovedNode๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ ํฌ์ธํ„ฐ๋ฅผ ์กฐ์ •ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. nodeIterator์˜ ํ›„๋ณด ์ฐธ์กฐ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด nodeIterator์˜ ํ›„๋ณด ์ฐธ์กฐ๋ฅผ nodeIterator์˜ ํ›„๋ณด ์ฐธ์กฐ, nodeIterator, toBeRemovedNode๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ ํฌ์ธํ„ฐ๋ฅผ ์กฐ์ •ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.


๋…ธ๋“œ ํฌ์ธํ„ฐ nodePointer, NodeIterator ๊ฐ์ฒด nodeIterator, ๊ทธ๋ฆฌ๊ณ  ๋…ธ๋“œ toBeRemovedNode๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋…ธ๋“œ ํฌ์ธํ„ฐ๋ฅผ ์กฐ์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” ๋…ธ๋“œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  1. toBeRemovedNode๊ฐ€ nodePointer์˜ ๋…ธ๋“œ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด ์•„๋‹ˆ๊ฑฐ๋‚˜, toBeRemovedNode๊ฐ€ nodeIterator์˜ ๋ฃจํŠธ์˜ ํฌ๊ด„์  ์กฐ์ƒ์ด๋ฉด nodePointer๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. nodePointer์˜ ์•ž์ชฝ ํฌ์ธํ„ฐ๊ฐ€ true์ด๋ฉด:

    1. next๋ฅผ toBeRemovedNode์˜ ์ฒซ ๋ฒˆ์งธ ํ›„์† ๋…ธ๋“œ ์ค‘ nodeIterator์˜ ๋ฃจํŠธ์˜ ํฌ๊ด„์  ์ž์†์ด๋ฉด์„œ toBeRemovedNode์˜ ํฌ๊ด„์  ์ž์†์ด ์•„๋‹Œ ๋…ธ๋“œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. next๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด (next, true)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. toBeRemovedNode์˜ ์ด์ „ ํ˜•์ œ ๋…ธ๋“œ๊ฐ€ null์ด๋ฉด newNode๋ฅผ toBeRemovedNode์˜ ๋ถ€๋ชจ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด toBeRemovedNode์˜ ์ด์ „ ํ˜•์ œ ๋…ธ๋“œ์˜ ํฌ๊ด„์  ์ž์† ์ค‘ ํŠธ๋ฆฌ ์ˆœ์„œ์—์„œ ๋งˆ์ง€๋ง‰์— ๋‚˜ํƒ€๋‚˜๋Š” ๋…ธ๋“œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. (newNode, false)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


๋‹ค์Œ root getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋ฃจํŠธ.

๋‹ค์Œ referenceNode getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ์ฐธ์กฐ์˜ ๋…ธ๋“œ.

๋‹ค์Œ pointerBeforeReferenceNode getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ์ฐธ์กฐ์˜ ํฌ์ธํ„ฐ๊ฐ€ ์•ž์— ์žˆ๋Š”์ง€ ์—ฌ๋ถ€.

๋‹ค์Œ whatToShow getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ whatToShow.

๋‹ค์Œ filter getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ํ•„ํ„ฐ.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ’์€ NodeIterator ๊ฐ์ฒด iterator์™€ "next" ๋˜๋Š” "previous"์ธ type์ž…๋‹ˆ๋‹ค:

  1. iterator์˜ ํ›„๋ณด ์ฐธ์กฐ๋ฅผ iterator์˜ ์ฐธ์กฐ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. result๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. true์ธ ๋™์•ˆ:

    1. type์ด "next"์ด๋ฉด:

      1. iterator์˜ ํ›„๋ณด ์ฐธ์กฐ์˜ ํฌ์ธํ„ฐ๊ฐ€ ์•ž์— ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๊ฐ€ false์ด๋ฉด:

        1. following์„ ๋‹ค์Œ ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด ๋…ธ๋“œ๋Š” ๋‹ค์Œ์— ํ›„ํ–‰ํ•ฉ๋‹ˆ๋‹ค: iterator์˜ ํ›„๋ณด ์ฐธ์กฐ์˜ ๋…ธ๋“œ. ์ฐพ๋Š” ๋ฒ”์œ„๋Š” iterator์˜ ๋ฐ˜๋ณต์ž ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด, ๋ฐ˜๋ณต์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

        2. iterator์˜ ํ›„๋ณด ์ฐธ์กฐ๋ฅผ (following, false)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, iterator์˜ ํ›„๋ณด ์ฐธ์กฐ๋ฅผ (iterator์˜ ํ›„๋ณด ์ฐธ์กฐ์˜ ๋…ธ๋“œ, false)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

      1. iterator์˜ ํ›„๋ณด ์ฐธ์กฐ์˜ ํฌ์ธํ„ฐ๊ฐ€ ์•ž์— ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๊ฐ€ true์ด๋ฉด:

        1. preceding์„ ๋‹ค์Œ ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด ๋…ธ๋“œ๋Š” ๋‹ค์Œ์— ์„ ํ–‰ํ•ฉ๋‹ˆ๋‹ค: iterator์˜ ํ›„๋ณด ์ฐธ์กฐ์˜ ๋…ธ๋“œ. ์ฐพ๋Š” ๋ฒ”์œ„๋Š” iterator์˜ ๋ฐ˜๋ณต์ž ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด, ๋ฐ˜๋ณต์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

        2. iterator์˜ ํ›„๋ณด ์ฐธ์กฐ๋ฅผ (preceding, true)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, iterator์˜ ํ›„๋ณด ์ฐธ์กฐ๋ฅผ (iterator์˜ ํ›„๋ณด ์ฐธ์กฐ์˜ ๋…ธ๋“œ, true)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. node๋ฅผ iterator์˜ ํ›„๋ณด ์ฐธ์กฐ์˜ ๋…ธ๋“œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    4. filterResult๋ฅผ ๋‹ค์Œ ํ•„ํ„ฐ๋ง์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ node์ด๋ฉฐ, ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ณต์ž๋Š” iterator์ž…๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋ฉด, iterator์˜ ํ›„๋ณด ์ฐธ์กฐ๋ฅผ null๋กœ ์„ค์ •ํ•˜๊ณ  ํ•ด๋‹น ์˜ˆ์™ธ๋ฅผ ๋‹ค์‹œ ๋˜์ง‘๋‹ˆ๋‹ค.

    5. filterResult๊ฐ€ FILTER_ACCEPT์ด๋ฉด:

      1. iterator์˜ ์ฐธ์กฐ๋ฅผ iterator์˜ ํ›„๋ณด ์ฐธ์กฐ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. result๋ฅผ node๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      3. ๋ฐ˜๋ณต์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

  4. iterator์˜ ํ›„๋ณด ์ฐธ์กฐ๋ฅผ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. result๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ nextNode() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์ˆœํšŒ. ์ธ์ˆ˜๋Š” this์™€ "next"์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ previousNode() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์ˆœํšŒ. ์ธ์ˆ˜๋Š” 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 ๊ฐ์ฒด๋Š” createTreeWalker() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Document ๊ฐ์ฒด์—์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ TreeWalker ๊ฐ์ฒด์—๋Š” ์—ฐ๊ฒฐ๋œ ํ˜„์žฌ ๋…ธ๋“œ(๋…ธ๋“œ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด TreeWalker ๊ฐ์ฒด์—๋Š” ๋ฃจํŠธ, whatToShow, ๊ทธ๋ฆฌ๊ณ  ํ•„ํ„ฐ๋„ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ root getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ๋ฃจํŠธ.

๋‹ค์Œ whatToShow getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ whatToShow.

๋‹ค์Œ filter getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ํ•„ํ„ฐ.

๋‹ค์Œ currentNode getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ํ˜„์žฌ ๋…ธ๋“œ.

๋‹ค์Œ currentNode setter ๋‹จ๊ณ„๋Š” this์˜ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์ฃผ์–ด์ง„ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋‹ค์Œ parentNode() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. node๋ฅผ this์˜ ํ˜„์žฌ ๋…ธ๋“œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. node๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  this์˜ ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ๋™์•ˆ:

    1. node๋ฅผ node์˜ ๋ถ€๋ชจ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. node๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  ํ•„ํ„ฐ๋ง(๋Œ€์ƒ: node, ์ˆ˜ํ–‰ํ•  ๊ฐ์ฒด: this)์˜ ๋ฐ˜ํ™˜๊ฐ’์ด FILTER_ACCEPT์ด๋ฉด, this์˜ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ node๋กœ ์„ค์ •ํ•˜๊ณ  node๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ž์‹ ์ˆœํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, ์ฃผ์–ด์ง„ TreeWalker ๊ฐ์ฒด walker์™€ "first" ๋˜๋Š” "last"์ธ type์— ๋Œ€ํ•ด:

  1. node๋ฅผ walker์˜ ํ˜„์žฌ ๋…ธ๋“œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. node๋ฅผ node์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, type์ด "first"์ธ ๊ฒฝ์šฐ์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด node์˜ ๋งˆ์ง€๋ง‰ ์ž์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. node๊ฐ€ null์ด ์•„๋‹Œ ๋™์•ˆ:

    1. result๋ฅผ ๋‹ค์Œ ํ•„ํ„ฐ๋ง์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ node์ด๋ฉฐ, ์ˆ˜ํ–‰ํ•  ๊ฐ์ฒด๋Š” walker์ž…๋‹ˆ๋‹ค.

    2. result๊ฐ€ FILTER_ACCEPT์ด๋ฉด, walker์˜ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ node๋กœ ์„ค์ •ํ•˜๊ณ  node๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    3. result๊ฐ€ FILTER_SKIP์ด๋ฉด:

      1. child๋ฅผ node์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋‹จ, type์ด "first"์ธ ๊ฒฝ์šฐ์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด node์˜ ๋งˆ์ง€๋ง‰ ์ž์‹์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

      2. child๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, node๋ฅผ child๋กœ ์„ค์ •ํ•˜๊ณ  ๋‹ค์Œ ๋ฐ˜๋ณต์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

    4. node๊ฐ€ null์ด ์•„๋‹Œ ๋™์•ˆ:

      1. sibling์„ node์˜ ๋‹ค์Œ ํ˜•์ œ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋‹จ, type์ด "first"์ธ ๊ฒฝ์šฐ์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด node์˜ ์ด์ „ ํ˜•์ œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

      2. sibling์ด null์ด ์•„๋‹ˆ๋ฉด, node๋ฅผ sibling์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฐ˜๋ณต์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

      3. parent๋ฅผ node์˜ ๋ถ€๋ชจ๋กœ ๋‘ก๋‹ˆ๋‹ค.

      4. parent๊ฐ€ null, walker์˜ ๋ฃจํŠธ, ๋˜๋Š” walker์˜ ํ˜„์žฌ ๋…ธ๋“œ์ด๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

      5. node๋ฅผ parent๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ firstChild() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž์‹ ์ˆœํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” this์™€ "first"์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ lastChild() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž์‹ ์ˆœํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” this์™€ "last"์ž…๋‹ˆ๋‹ค.

ํ˜•์ œ ์ˆœํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, ์ฃผ์–ด์ง„ TreeWalker ๊ฐ์ฒด walker์™€ "next" ๋˜๋Š” "previous"์ธ type์— ๋Œ€ํ•ด:

  1. node๋ฅผ walker์˜ ํ˜„์žฌ ๋…ธ๋“œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. node๊ฐ€ ๋ฃจํŠธ์ด๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. true์ธ ๋™์•ˆ:

    1. sibling์„ node์˜ ๋‹ค์Œ ํ˜•์ œ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋‹จ, type์ด "next"์ธ ๊ฒฝ์šฐ์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด node์˜ ์ด์ „ ํ˜•์ œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. sibling์ด null์ด ์•„๋‹Œ ๋™์•ˆ:

      1. node๋ฅผ sibling์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. result๋ฅผ ๋‹ค์Œ ํ•„ํ„ฐ๋ง์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ node์ด๋ฉฐ, ์ˆ˜ํ–‰ํ•  ๊ฐ์ฒด๋Š” walker์ž…๋‹ˆ๋‹ค.

      3. result๊ฐ€ FILTER_ACCEPT์ด๋ฉด, walker์˜ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ node๋กœ ์„ค์ •ํ•˜๊ณ  node๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

      4. sibling์„ node์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, type์ด "next"์ธ ๊ฒฝ์šฐ์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด node์˜ ๋งˆ์ง€๋ง‰ ์ž์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      5. result๊ฐ€ FILTER_REJECT์ด๊ฑฐ๋‚˜ sibling์ด null์ด๋ฉด, sibling์„ node์˜ ๋‹ค์Œ ํ˜•์ œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, type์˜ ๊ฐ’์ด "next"์ธ ๊ฒฝ์šฐ์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด node์˜ ์ด์ „ ํ˜•์ œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. node๋ฅผ node์˜ ๋ถ€๋ชจ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    4. node๊ฐ€ null์ด๊ฑฐ๋‚˜ walker์˜ ๋ฃจํŠธ์ด๋ฉด, ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: null.

    5. ๋‹ค์Œ ํ•„ํ„ฐ๋ง์˜ ๋ฐ˜ํ™˜๊ฐ’(๋Œ€์ƒ: node, ์ˆ˜ํ–‰ํ•  ๊ฐ์ฒด: walker)์ด FILTER_ACCEPT์ด๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ nextSibling() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜•์ œ ์ˆœํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” this์™€ "next"์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ previousSibling() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜•์ œ ์ˆœํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” this์™€ "previous"์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ previousNode() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. node๋ฅผ this์˜ ํ˜„์žฌ ๋…ธ๋“œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. node๊ฐ€ this์˜ ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ๋™์•ˆ:

    1. sibling์„ node์˜ ์ด์ „ ํ˜•์ œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. sibling์ด null์ด ์•„๋‹Œ ๋™์•ˆ:

      1. node๋ฅผ sibling์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. result๋ฅผ ๋‹ค์Œ ํ•„ํ„ฐ๋ง์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ node์ด๋ฉฐ, ์ˆ˜ํ–‰ํ•  ๊ฐ์ฒด๋Š” this์ž…๋‹ˆ๋‹ค.

      3. result๊ฐ€ FILTER_REJECT๊ฐ€ ์•„๋‹ˆ๊ณ  node์— ์ž์‹์ด ์žˆ๋Š” ๋™์•ˆ:

        1. node๋ฅผ node์˜ ๋งˆ์ง€๋ง‰ ์ž์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

        2. result๋ฅผ ๋‹ค์Œ ํ•„ํ„ฐ๋ง์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ node์ด๋ฉฐ, ์ˆ˜ํ–‰ํ•  ๊ฐ์ฒด๋Š” this์ž…๋‹ˆ๋‹ค.

      4. result๊ฐ€ FILTER_ACCEPT์ด๋ฉด, this์˜ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ node๋กœ ์„ค์ •ํ•˜๊ณ  node๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

      5. sibling์„ node์˜ ์ด์ „ ํ˜•์ œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. node๊ฐ€ this์˜ ๋ฃจํŠธ์ด๊ฑฐ๋‚˜ node์˜ ๋ถ€๋ชจ๊ฐ€ null์ด๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    4. node๋ฅผ node์˜ ๋ถ€๋ชจ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    5. ๋‹ค์Œ ํ•„ํ„ฐ๋ง์˜ ๋ฐ˜ํ™˜๊ฐ’(๋Œ€์ƒ: node, ์ˆ˜ํ–‰ํ•  ๊ฐ์ฒด: this)์ด FILTER_ACCEPT์ด๋ฉด, this์˜ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ node๋กœ ์„ค์ •ํ•˜๊ณ  node๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ nextNode() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. node๋ฅผ this์˜ ํ˜„์žฌ ๋…ธ๋“œ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. result๋ฅผ FILTER_ACCEPT๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. true์ธ ๋™์•ˆ:

    1. result๊ฐ€ FILTER_REJECT๊ฐ€ ์•„๋‹ˆ๊ณ  node์— ์ž์‹์ด ์žˆ๋Š” ๋™์•ˆ:

      1. node๋ฅผ ์ž์‹ ์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. result๋ฅผ ๋‹ค์Œ ํ•„ํ„ฐ๋ง์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ node์ด๋ฉฐ, ์ˆ˜ํ–‰ํ•  ๊ฐ์ฒด๋Š” this์ž…๋‹ˆ๋‹ค.

      3. result๊ฐ€ FILTER_ACCEPT์ด๋ฉด, this์˜ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ node๋กœ ์„ค์ •ํ•˜๊ณ  node๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. sibling์„ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

    3. temporary๋ฅผ node๋กœ ๋‘ก๋‹ˆ๋‹ค.

    4. temporary๊ฐ€ null์ด ์•„๋‹Œ ๋™์•ˆ:

      1. temporary๊ฐ€ this์˜ ๋ฃจํŠธ์ด๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

      2. sibling์„ temporary์˜ ๋‹ค์Œ ํ˜•์ œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      3. sibling์ด null์ด ์•„๋‹ˆ๋ฉด, ๋ฐ˜๋ณต์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

      4. temporary๋ฅผ temporary์˜ ๋ถ€๋ชจ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    5. sibling์ด null์ด๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    6. node๋ฅผ sibling์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    7. result๋ฅผ ๋‹ค์Œ ํ•„ํ„ฐ๋ง์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ node์ด๋ฉฐ, ์ˆ˜ํ–‰ํ•  ๊ฐ์ฒด๋Š” this์ž…๋‹ˆ๋‹ค.

    8. result๊ฐ€ FILTER_ACCEPT์ด๋ฉด, this์˜ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ 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 ๊ฐ์ฒด๋Š” ํ•„ํ„ฐ๋กœ์„œ NodeIterator ๋ฐ TreeWalker ๊ฐ์ฒด์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , whatToShow ๋น„ํŠธ๋งˆ์Šคํฌ ์ƒ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. NodeFilter ๊ฐ์ฒด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

์ด ์ƒ์ˆ˜๋“ค์€ filter(ํ•„ํ„ฐ) ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • FILTER_ACCEPT (1);
  • FILTER_REJECT (2);
  • FILTER_SKIP (3);

์ด ์ƒ์ˆ˜๋“ค์€ whatToShow์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • SHOW_ALL (4294967295, 16์ง„์ˆ˜๋กœ FFFFFFFF);
  • SHOW_ELEMENT (1);
  • SHOW_ATTRIBUTE (2);
  • SHOW_TEXT (4);
  • SHOW_CDATA_SECTION (8);
  • SHOW_PROCESSING_INSTRUCTION (64, 16์ง„์ˆ˜๋กœ 40);
  • SHOW_COMMENT (128, 16์ง„์ˆ˜๋กœ 80);
  • SHOW_DOCUMENT (256, 16์ง„์ˆ˜๋กœ 100);
  • SHOW_DOCUMENT_TYPE (512, 16์ง„์ˆ˜๋กœ 200);
  • SHOW_DOCUMENT_FRAGMENT (1024, 16์ง„์ˆ˜๋กœ 400);

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 ๊ฐ์ฒด์—๋Š” ์—ฐ๊ฒฐ๋œ ํ† ํฐ ์ง‘ํ•ฉ(์ง‘ํ•ฉ)์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ดˆ๊ธฐ์—๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ DOMTokenList ๊ฐ์ฒด์—๋Š” ์—ฐ๊ฒฐ๋œ ์š”์†Œ (์š”์†Œ)์™€ ์†์„ฑ ์ด๋ฆ„(์†์„ฑ์˜ ๋กœ์ปฌ ์ด๋ฆ„)๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…์„ธ๋Š” DOMTokenList์˜ ์š”์†Œ์™€ ์†์„ฑ ์ด๋ฆ„์— ๋Œ€ํ•œ ์ง€์›๋˜๋Š” ํ† ํฐ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DOMTokenList ๊ฐ์ฒด set์˜ ๊ฒ€์ฆ ๋‹จ๊ณ„๋Š” ์ฃผ์–ด์ง„ token์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. set์˜ ์š”์†Œ์™€ ์†์„ฑ ์ด๋ฆ„์— ์ง€์›๋˜๋Š” ํ† ํฐ์ด ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด TypeError๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค.

  2. lowercaseToken์„ token์„ ASCII ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. lowercaseToken์ด set์˜ ์š”์†Œ์™€ ์†์„ฑ ์ด๋ฆ„์˜ ์ง€์›๋˜๋Š” ํ† ํฐ์— ์กด์žฌํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

DOMTokenList ๊ฐ์ฒด set์˜ ๊ฐฑ์‹  ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. null, set์˜ ์†์„ฑ ์ด๋ฆ„, ๊ทธ๋ฆฌ๊ณ  set์˜ ์š”์†Œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๋กœ์ปฌ ์ด๋ฆ„์œผ๋กœ ์†์„ฑ์„ ๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ๊ฐ€ null์ด๊ณ  set์˜ ํ† ํฐ ์ง‘ํ•ฉ์ด ๋น„์–ด ์žˆ์œผ๋ฉด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. set์˜ ์š”์†Œ, set์˜ ์†์„ฑ ์ด๋ฆ„, ๊ทธ๋ฆฌ๊ณ  set์˜ ํ† ํฐ ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์ง‘ํ•ฉ ์ง๋ ฌํ™”๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

DOMTokenList ๊ฐ์ฒด set์˜ ์ง๋ ฌํ™” ๋‹จ๊ณ„์—์„œ๋Š” set์˜ ์š”์†Œ์™€ set์˜ ์†์„ฑ ์ด๋ฆ„์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


DOMTokenList ๊ฐ์ฒด set์—๋Š” set์˜ ์š”์†Œ์— ๋Œ€ํ•œ ๋‹ค์Œ ์†์„ฑ ๋ณ€๊ฒฝ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. localName์ด set์˜ ์†์„ฑ ์ด๋ฆ„์ด๊ณ , namespace๊ฐ€ null์ด๊ณ  value๊ฐ€ null์ด๋ฉด set์˜ ํ† ํฐ ์ง‘ํ•ฉ์„ ๋น„์›๋‹ˆ๋‹ค.

  2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  localName์ด set์˜ ์†์„ฑ ์ด๋ฆ„์ด๊ณ  namespace๊ฐ€ null์ด๋ฉด set์˜ ํ† ํฐ ์ง‘ํ•ฉ์„ value๋ฅผ ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

DOMTokenList ๊ฐ์ฒด set์ด ์ƒ์„ฑ๋  ๋•Œ:

  1. element๋ฅผ set์˜ ์š”์†Œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. attributeName์„ set์˜ ์†์„ฑ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. value๋ฅผ element์™€ attributeName์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์†์„ฑ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. element, attributeName, value, value, null์— ๋Œ€ํ•ด ์†์„ฑ ๋ณ€๊ฒฝ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

tokenlist . length

ํ† ํฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

tokenlist . item(index)
tokenlist[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)

token์„ newToken์œผ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

token์ด newToken์œผ๋กœ ๊ต์ฒด๋˜์—ˆ์œผ๋ฉด true๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ˆ˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด "SyntaxError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

์ธ์ˆ˜ ์ค‘ ํ•˜๋‚˜์— ASCII ๊ณต๋ฐฑ ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด "InvalidCharacterError" DOMException์„ ๋˜์ง‘๋‹ˆ๋‹ค.

tokenlist . supports(token)

token์ด ์—ฐ๊ฒฐ๋œ ์†์„ฑ์˜ ์ง€์›๋˜๋Š” ํ† ํฐ์— ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ๋œ ์†์„ฑ์— ์ง€์›๋˜๋Š” ํ† ํฐ์ด ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด TypeError๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค.

tokenlist . value

์—ฐ๊ฒฐ๋œ ์ง‘ํ•ฉ์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋œ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ length getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ํ† ํฐ ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ.

๊ฐ์ฒด์˜ ์ง€์›๋˜๋Š” ์†์„ฑ ์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ ๋ฒ”์œ„์˜ ์ˆซ์ž์ž…๋‹ˆ๋‹ค: 0๋ถ€ํ„ฐ ๊ฐ์ฒด์˜ ํ† ํฐ ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ โˆ’ 1๊นŒ์ง€. ๋‹จ, ํ† ํฐ ์ง‘ํ•ฉ์ด ๋น„์–ด ์žˆ์œผ๋ฉด, ์ด ๊ฒฝ์šฐ์—๋Š” ์ง€์›๋˜๋Š” ์†์„ฑ ์ธ๋ฑ์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ item(index) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. index๊ฐ€ this์˜ ํ† ํฐ ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: this์˜ ํ† ํฐ ์ง‘ํ•ฉ[index].

๋‹ค์Œ contains(token) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ, this์˜ ํ† ํฐ ์ง‘ํ•ฉ[token]์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ add(tokensโ€ฆ) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๊ฐ token(tokens์— ์†ํ•จ)์— ๋Œ€ํ•ด:

    1. token์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "SyntaxError" DOMException.

    2. token์— ASCII ๊ณต๋ฐฑ์ด ํ•˜๋‚˜๋ผ๋„ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด, ๋˜์ง‘๋‹ˆ๋‹ค: ๋‹ค์Œ ์˜ˆ์™ธ์ธ "InvalidCharacterError" DOMException.

  2. ๊ฐ token(tokens์— ์†ํ•จ)์— ๋Œ€ํ•ด: ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: token์„ this์˜ ํ† ํฐ ์ง‘ํ•ฉ์—.

  3. ๋‹ค์Œ ๊ฐฑ์‹  ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ remove(tokensโ€ฆ) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๊ฐ token(tokens์— ์†ํ•จ)์— ๋Œ€ํ•ด:

    1. token์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "SyntaxError" DOMException.

    2. token์— ASCII ๊ณต๋ฐฑ์ด ํ•˜๋‚˜๋ผ๋„ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด, ๋˜์ง‘๋‹ˆ๋‹ค: ๋‹ค์Œ ์˜ˆ์™ธ์ธ "InvalidCharacterError" DOMException.

  2. ๊ฐ token(tokens์— ์†ํ•จ)์— ๋Œ€ํ•ด: ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค: token์„ ๋‹ค์Œ์—์„œ: this์˜ ํ† ํฐ ์ง‘ํ•ฉ.

  3. ๋‹ค์Œ ๊ฐฑ์‹  ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ toggle(token, force) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. token์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "SyntaxError" DOMException.

  2. token์— ASCII ๊ณต๋ฐฑ์ด ํ•˜๋‚˜๋ผ๋„ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidCharacterError" DOMException.

  3. ๋งŒ์•ฝ this์˜ ํ† ํฐ ์ง‘ํ•ฉ[token]์ด ์กด์žฌํ•˜๋ฉด:

    1. force๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๊ฑฐ๋‚˜ false์ด๋ฉด, ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค: token์„ this์˜ ํ† ํฐ ์ง‘ํ•ฉ์—์„œ. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐฑ์‹  ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: false.

    2. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , force๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๊ฑฐ๋‚˜ true์ด๋ฉด, ๋ง๋ถ™์ž…๋‹ˆ๋‹ค: token์„ ๋‹ค์Œ this์˜ ํ† ํฐ ์ง‘ํ•ฉ์—. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐฑ์‹  ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ฐฑ์‹  ๋‹จ๊ณ„๋Š” toggle()์—์„œ ์›น ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ํ•ญ์ƒ ์‹คํ–‰๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ replace(token, newToken) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. token ๋˜๋Š” newToken ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "SyntaxError" DOMException.

  2. token ๋˜๋Š” newToken ์ค‘ ํ•˜๋‚˜๋ผ๋„ ASCII ๊ณต๋ฐฑ์„ ํฌํ•จํ•˜๋ฉด, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค: "InvalidCharacterError" DOMException.

  3. ๋งŒ์•ฝ this์˜ ํ† ํฐ ์ง‘ํ•ฉ์— ๋‹ค์Œ ํ† ํฐ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด: token, false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค: token์„ this์˜ ํ† ํฐ ์ง‘ํ•ฉ์—์„œ newToken์œผ๋กœ.

  5. ๋‹ค์Œ ๊ฐฑ์‹  ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  6. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ฐฑ์‹  ๋‹จ๊ณ„๋Š” replace()์—์„œ ์›น ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ํ•ญ์ƒ ์‹คํ–‰๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ supports(token) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. result๋ฅผ ๋‹ค์Œ ๊ฒ€์ฆ ๋‹จ๊ณ„์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์ธ์ˆ˜๋Š” token์ž…๋‹ˆ๋‹ค.

  2. result๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ value getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ ๋‹จ๊ณ„์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: this์˜ ์ง๋ ฌํ™” ๋‹จ๊ณ„.

๋‹ค์Œ value setter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†์„ฑ ๊ฐ’ ์„ค์ •์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ this์˜ ์š”์†Œ์ด๋ฉฐ, ์‚ฌ์šฉํ•  ์ธ์ˆ˜๋Š” this์˜ ์†์„ฑ ์ด๋ฆ„๊ณผ ์ฃผ์–ด์ง„ ๊ฐ’์ž…๋‹ˆ๋‹ค.

8. XPath

DOM Level 3 XPath๋Š” XPath 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

๋ธŒ๋ผ์šฐ์ €์—์„œ ํด๋ผ์ด์–ธํŠธ ์ธก XSLT๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์˜ XSLT ๊ตฌํ˜„์€ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „ ์ทจ์•ฝ์ ์— ๋งค์šฐ ์ทจ์•ฝํ•˜๋ฉฐ, ์›น ํ”Œ๋žซํผ์€ ์•ˆ์ „ํ•œ ๋Œ€์ฒด ์ˆ˜๋‹จ์œผ๋กœ JavaScript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐœ์ „ํ•ด ์™”๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ด ๊ธฐ๋Šฅ์€ ์›น ํ”Œ๋žซํผ์—์„œ ์ œ๊ฑฐ๋˜๋Š” ์ค‘์ด๋‹ค. (์ด๋Š” ์ˆ˜๋…„์ด ๊ฑธ๋ฆฌ๋Š” ๊ธด ๊ณผ์ •์ด๋‹ค.)

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)

์ด ํ‘œ์ค€์—๋Š” ์ œ๊ฑฐ๋œ ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

  • DOMConfiguration
  • DOMError
  • DOMErrorHandler
  • DOMImplementationList
  • DOMImplementationSource
  • DOMLocator
  • DOMObject
  • DOMUserData
  • Entity
  • EntityReference
  • MutationEvent
  • MutationNameEvent
  • NameList
  • Notation
  • RangeException
  • TypeInfo
  • UserDataHandler

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„๋“ค์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

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, Armen Michaeli, 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, Evgeny Kapun, 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, Jayson Chen, 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, Steven Obiajulu, 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. ์ฝ˜์†” ํ‘œ์ค€. Living Standard. URL: https://console.spec.whatwg.org/
[DEVICE-ORIENTATION]
Reilly Grant; Marcos Caceres. ๋””๋ฐ”์ด์Šค ๋ฐฉํ–ฅ ๋ฐ ๋ชจ์…˜. URL: https://w3c.github.io/deviceorientation/
[ECMASCRIPT]
ECMAScript ์–ธ์–ด ๋ช…์„ธ. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. ์ธ์ฝ”๋”ฉ ํ‘œ์ค€. Living Standard. URL: https://encoding.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. ๊ณ ํ•ด์ƒ๋„ ์‹œ๊ฐ„. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML ํ‘œ์ค€. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra ํ‘œ์ค€. Living Standard. URL: https://infra.spec.whatwg.org/
[LONG-ANIMATION-FRAMES]
Noam Rosenthal. ๋กฑ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ”„๋ ˆ์ž„ API. URL: https://w3c.github.io/long-animation-frames/
[POINTEREVENTS3]
Patrick Lauke; Robert Flack. ํฌ์ธํ„ฐ ์ด๋ฒคํŠธ. URL: https://w3c.github.io/pointerevents/
[SELECTORS4]
Elika Etemad; Tab Atkins Jr.. ์…€๋ ‰ํ„ฐ 4๋‹จ๊ณ„. URL: https://drafts.csswg.org/selectors/
[SERVICE-WORKERS]
Monica CHINTALA; Yoshisato Yanagisawa. Service Workers Nightly. URL: https://w3c.github.io/ServiceWorker/
[TOUCH-EVENTS]
Doug Schepers; et al. ํ„ฐ์น˜ ์ด๋ฒคํŠธ. URL: https://w3c.github.io/touch-events/
[TRUSTED-TYPES]
Krzysztof Kotowicz. ์‹ ๋ขฐ๋œ ํƒ€์ž…. URL: https://w3c.github.io/trusted-types/dist/spec/
[UIEVENTS]
Xiaoqian Wu. UI ์ด๋ฒคํŠธ. URL: https://w3c.github.io/uievents/
[URL]
Anne van Kesteren. URL ํ‘œ์ค€. Living Standard. URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL ํ‘œ์ค€. Living Standard. URL: https://webidl.spec.whatwg.org/
[XML]
Tim Bray; et al. ํ™•์žฅ ๋งˆํฌ์—… ์–ธ์–ด (XML) 1.0 (๋‹ค์„ฏ ๋ฒˆ์งธ ํŒ). 26 November 2008. REC. URL: https://www.w3.org/TR/xml/
[XML-NAMES]
Tim Bray; et al. XML ๋„ค์ž„์ŠคํŽ˜์ด์Šค 1.0 (์„ธ ๋ฒˆ์งธ ํŒ). 8 December 2009. REC. URL: https://www.w3.org/TR/xml-names/
[XML-STYLESHEET]
James Clark; Simon Pieters; Henry Thompson. XML ๋ฌธ์„œ์™€ ์Šคํƒ€์ผ์‹œํŠธ ์—ฐ๊ฒฐ 1.0 (์ œ2ํŒ). 2010๋…„ 10์›” 28์ผ. REC. URL: https://www.w3.org/TR/xml-stylesheet/

๋น„ํ‘œ์ค€ ์ฐธ๊ณ  ๋ฌธํ—Œ

[CSSOM-VIEW]
Simon Fraser; Emilio Cobos รlvarez. CSSOM ๋ทฐ ๋ชจ๋“ˆ. URL: https://drafts.csswg.org/cssom-view/
[DOM-Level-3-XPath]
Ray Whitmer. ๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ (DOM) ๋ ˆ๋ฒจ 3 XPath ๋ช…์„ธ. 2020๋…„ 11์›” 3์ผ. NOTE. URL: https://www.w3.org/TR/DOM-Level-3-XPath/
[DOM-Parsing]
Travis Leithead. DOM ํŒŒ์‹ฑ ๋ฐ ์ง๋ ฌํ™”. URL: https://w3c.github.io/DOM-Parsing/
[FULLSCREEN]
Philip Jรคgenstedt. ์ „์ฒดํ™”๋ฉด API ํ‘œ์ค€. Living Standard. URL: https://fullscreen.spec.whatwg.org/
[INDEXEDDB]
Nikunj Mehta; et al. ์ธ๋ฑ์Šค๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค API. URL: https://w3c.github.io/IndexedDB/
[XPath]
James Clark; Steven DeRose. XML ๊ฒฝ๋กœ ์–ธ์–ด (XPath) ๋ฒ„์ „ 1.0. 1999๋…„ 11์›” 16์ผ. REC. URL: https://www.w3.org/TR/xpath-10/
[XSLT]
James Clark. XSL ๋ณ€ํ™˜(XSLT) ๋ฒ„์ „ 1.0. 1999๋…„ 11์›” 16์ผ. 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(); // historical; 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 boolean serializable;
  readonly attribute SlotAssignmentMode slotAssignment;
  readonly attribute boolean clonable;
  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, (TrustedType or DOMString) value);
  [CEReactions] undefined setAttributeNS(DOMString? namespace, DOMString qualifiedName, (TrustedType or 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;
  boolean serializable = false;
  SlotAssignmentMode slotAssignment = "named";
  boolean clonable = false;
  CustomElementRegistry? customElementRegistry;
};

[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; // historical; 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 {
  constructor(DOMString target, optional DOMString data = "");

  readonly attribute DOMString target;

  boolean hasAttributes();
  sequence<DOMString> getAttributeNames();
  DOMString? getAttribute(DOMString name);
  undefined setAttribute(DOMString name, DOMString value);
  undefined removeAttribute(DOMString name);
  boolean toggleAttribute(DOMString name, optional boolean force);
  boolean hasAttribute(DOMString name);
};
[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
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN
โœ”MDN