ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ์—”์ง„์€ HTML ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ธ DOM์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ƒ์„ฑ๋˜๋Š” DOM(Document Object Model)์€ HTML ๋ฌธ์„œ์˜ ๊ณ„์ธต์  ๊ตฌ์กฐ์™€ ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•˜๋ฉฐ ์ด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” API(ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ)๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.


๋…ธ๋“œ

HTML ์š”์†Œ์™€ ๋…ธ๋“œ ๊ฐ์ฒด

HTML ์š”์†Œ๋Š” HTML ๋ฌธ์„œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐœ๋ณ„์ ์ธ ์š”์†Œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ HTML ์š”์†Œ๋Š” ๋ Œ๋”๋ง ์—”์ง„์— ์˜ํ•ด ํŒŒ์‹ฑ๋˜์–ด DOM์„ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ ๋…ธ๋“œ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, HTML ์š”์†Œ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ๋กœ, HTML ์š”์†Œ์˜ ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ๋Š” ํ…์ŠคํŠธ ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

 

 

HTML ๋ฌธ์„œ๋Š” ์ค‘์ฒฉ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” HTML ์š”์†Œ๋“ค์˜ ์ง‘ํ•ฉ(ํ…์ŠคํŠธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ HTML ์š”์†Œ๋„ ํฌํ•จ)์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด ๊ณ„์ธต์ ์ธ ๋ถ€์ž ๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ HTML ์š”์†Œ๋ฅผ ๊ฐ์ฒดํ™”ํ•œ ๋ชจ๋“  ๋…ธ๋“œ ๊ฐ์ฒด๋“ค์€ ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

  • ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์ž์‹ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ๋…ธ๋“œ ๊ฐ„์˜ ๊ณ„์ธต์  ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ
  • ํ•˜๋‚˜์˜ ์ตœ์ƒ์œ„ ๋…ธ๋“œ(๋ฃจํŠธ๋…ธ๋“œ)์—์„œ ์‹œ์ž‘ํ•˜๋Š”๋ฐ, ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์—†์Œ
  • ๋ฃจํŠธ ๋…ธ๋“œ๋Š” 0๊ฐœ ์ด์ƒ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง
  • ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ๋ฅผ ๋ฆฌํ”„ ๋…ธ๋“œ๋ผ ํ•จ

์ด๋ ‡๊ฒŒ ๋…ธ๋“œ ๊ฐ์ฒด๋“ค๋กœ ๊ตฌ์„ฑ๋œ ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ DOM์ด๋ผ ํ•˜๋ฉฐ, DOM ํŠธ๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

 

๋…ธ๋“œ ๊ฐ์ฒด ํƒ€์ž…

๋…ธ๋“œ ๊ฐ์ฒด๋Š” ์ด 12๊ฐœ์˜ ์ข…๋ฅ˜(๋…ธ๋“œ ํƒ€์ž…)์ด ์žˆ๊ณ  ์ƒ์† ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด ์ค‘์—์„œ ์ค‘์š”ํ•œ ๋…ธ๋“œ ํƒ€์ž…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 4๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋…ธ๋“œ ํƒ€์ž… ์„ค๋ช…
๋ฌธ์„œ ๋…ธ๋“œ - DOM ํŠธ๋ฆฌ์˜ ์ตœ์ƒ์œ„์— ์กด์žฌํ•˜๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋กœ์„œ *document ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด
- window.document ๋˜๋Š” document๋กœ ์ฐธ์กฐ ๊ฐ€๋Šฅ
- HTML ๋ฌธ์„œ๋‹น document ๊ฐ์ฒด๋Š” ์œ ์ผ
- DOM ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๋“ค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ „์ž…์  ์—ญํ• ์„ ๋‹ด๋‹น
์š”์†Œ ๋…ธ๋“œ - HTML ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด
- ๋ฌธ์„œ์˜ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•จ
- HTML ์š”์†Œ ๊ฐ„์˜ ์ค‘์ฒฉ์— ์˜ํ•ด ๋ถ€์ž ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๊ตฌ์กฐํ™”ํ•จ
์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ - HTML ์š”์†Œ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด
- ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์ง€์ •๋œ HTML ์š”์†Œ์˜ ์š”์†Œ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ
- ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์—†์–ด ์š”์†Œ ๋…ธ๋“œ์˜ ํ˜•์ œ ๋…ธ๋“œ๋Š” ์•„๋‹˜
- ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜์—ฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ฐธ์กฐ/๋ณ€๊ฒฝ ํ•˜๋ ค๋ฉด ๋จผ์ € ์š”์†Œ ๋…ธ๋“œ์— ์ ‘๊ทผํ•ด์•ผ ํ•จ
ํ…์ŠคํŠธ ๋…ธํŠธ - HTML ์š”์†Œ์˜ ํ…์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด
- ๋ฌธ์„œ์˜ ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•จ
- ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ์ด๋ฉฐ, ์ž์‹์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ์ž„
- DOM ํŠธ๋ฆฌ์˜ ์ตœ์ข…๋‹จ์ž„์œผ๋กœ ํ…์ŠคํŠธ ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋จผ์ € ๋ถ€๋ชจ ๋…ธ๋“œ์ธ ์š”์†Œ ๋…ธ๋“œ์— ์ ‘๊ทผํ•ด์•ผ ํ•จ

 

*document ๊ฐ์ฒด : ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ Œ๋”๋งํ•œ HTML ๋ฌธ์„œ ์ „์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๋กœ์„œ ์ „์—ญ ๊ฐ์ฒด window์˜ document ํ”„๋กœํผํ‹ฐ์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ์Œ

 

 

๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒ์† ๊ตฌ์กฐ

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

 

 

์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ƒ์† ๊ด€๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ๋…ธ๋“œ ๊ฐ์ฒด : Object, EventTarget, Node ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†
  • ๋ฌธ์„œ ๋…ธ๋“œ : Document, HTMLDocument ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†
  • ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ : Attr ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†
  • ํ…์ŠคํŠธ ๋…ธ๋“œ : CharacterData ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†
  • ์š”์†Œ ๋…ธ๋“œ : Element ์ธํ„ฐํŽ˜์ด์Šค์™€ HTMLElement์™€ ํƒœ๊ทธ์˜ ์ข…๋ฅ˜๋ณ„๋กœ ์„ธ๋ถ„ํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋“ค๋ฅผ ์ƒ์†๋ฐ›์Œ

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

 

<!DOCTYPE html>
<html>
<body>
  <input type="text">
  <script>
    // input ์š”์†Œ ๋…ธ๋“œ ๊ฐ์ฒด๋ฅผ ์„ ํƒ
    const $input = document.querySelector('input');

    // input ์š”์†Œ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ
    console.log(
      Object.getPrototypeOf($input) === HTMLInputElement.prototype,
      Object.getPrototypeOf(HTMLInputElement.prototype) === HTMLElement.prototype,
      Object.getPrototypeOf(HTMLElement.prototype) === Element.prototype,
      Object.getPrototypeOf(Element.prototype) === Node.prototype,
      Object.getPrototypeOf(Node.prototype) === EventTarget.prototype,
      Object.getPrototypeOf(EventTarget.prototype) === Object.prototype
    ); // ๋ชจ๋‘ true
  </script>
</body>
</html>

 

๋ฐฐ์—ด์ด ๊ฐ์ฒด์ธ ๋™์‹œ์— ๋ฐฐ์—ด์ธ ๊ฒƒ์ฒ˜๋Ÿผ input ์š”์†Œ ๋…ธ๋“œ ๊ฐ์ฒด๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ํŠน์„ฑ์„ ๊ฐ–๋Š” ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„

๋‚˜ํƒ€๋‚ด๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ƒ์†์„ ํ†ตํ•ด ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.

 

input ์š”์†Œ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ํŠน์„ฑ ํ”„๋กœํ† ํƒ€์ž…์„ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด
๊ฐ์ฒด Object
์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฐ์ฒด EventTarget
ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๋…ธ๋“œ ๊ฐ์ฒด Node
๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š” ์›น ๋ฌธ์„œ์˜ ์š”์†Œ๋ฅผ ํ‘œํ˜„ํ•œ ๊ฐ์ฒด Element
์›น ๋ฌธ์„œ์˜ ์š”์†Œ ์ค‘์—์„œ HTML ์š”์†Œ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ์ฒด HTMLElemnet
HTML ์š”์†Œ ์ค‘์—์„œ input ์š”์†Œ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ์ฒด HTMLInputElement

 

*๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒ์† ๊ตฌ์กฐ๋Š” ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ Elements ํŒจ๋„ ์šฐ์ธก์˜ Properties ํŒจ๋„์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ

 

 

์ด์ฒ˜๋Ÿผ ๋…ธ๋“œ ๊ฐ์ฒด์—๋Š” ๋…ธ๋“œ ๊ฐ์ฒด์˜ ํƒ€์ž…์— ์ƒ๊ด€์—†์ด ๋ชจ๋“  ๋…ธ๋“œ ๊ฐ์ฒด๊ฐ€ ๊ณตํ†ต์œผ๋กœ ๊ฐ–๋Š” ๊ธฐ๋Šฅ๋„ ์žˆ๊ณ , ๋…ธ๋“œ ํƒ€์ž…์— ๋”ฐ๋ผ ๊ณ ์œ ํ•œ ๊ธฐ๋Šฅ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ HTML ์š”์†Œ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๊ฐ๊ฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

 

๋˜ํ•œ, ๋…ธ๋“œ ๊ฐ์ฒด๋Š” ๊ณตํ†ตํ™”๋œ ๊ธฐ๋Šฅ์ผ์ˆ˜๋ก ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ์ƒ์œ„์—, ๊ฐœ๋ณ„์ ์ธ ๊ณ ์œ  ๊ธฐ๋Šฅ์ผ์ˆ˜๋ก ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ํ•˜์œ„์— ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ๋…ธ๋“œ ๊ฐ์ฒด์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ(ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ)๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ƒ์† ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

 

์ •๋ฆฌํ•˜์ž๋ฉด DOM์€ HTML ๋ฌธ์„œ์˜ ๊ณ„์ธต์  ๊ตฌ์กฐ์™€ ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋ฌผ๋ก  ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ข…๋ฅ˜(ํƒ€์ž…)์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ์˜ ์ง‘ํ•ฉ์ธ DOM API๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ DOM API๋ฅผ ํ†ตํ•ด HTML ๊ตฌ์กฐ๋‚˜ ๋‚ด์šฉ ๋˜๋Š” ์Šคํƒ€์ผ ๋“ฑ์„ ๋™์ ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์š”์†Œ ๋…ธ๋“œ ์ทจ๋“

HTML์˜ ๊ตฌ์กฐ๋‚˜ ๋‚ด์šฉ ๋˜๋Š” ์Šคํƒ€์ผ ๋“ฑ์„ ๋™์ ์œผ๋กœ ์กฐ์ž‘ํ•˜๋ ค๋ฉด ๋จผ์ € ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

  • ํ…์ŠคํŠธ ๋…ธ๋“œ : ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹
  • ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ : ์š”์†Œ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ

์ด์ฒ˜๋Ÿผ HTML ์š”์†Œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ์‹œ์ž‘์ ์ธ ์š”์†Œ ๋…ธ๋“œ์˜ ์ทจ๋“์„ ์œ„ํ•ด DOM์€ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

id๋ฅผ ์ด์šฉํ•œ ์š”์†Œ ๋…ธ๋“œ ์ทจ๋“

Document.prototype.getElementById ๋ฉ”์„œ๋“œ๋Š” ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ id ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ๊ฐ–๋Š” ํ•˜๋‚˜์˜ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, getElementById๋Š” Document.prototype์˜ ํ”„๋กœํผํ‹ฐ๋กœ ๋ฐ˜๋“œ์‹œ ๋ฌธ์„œ ๋…ธ๋“œ์ธ document๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

getElementById ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <body>
    <ul>
      <li id="apple">Apple</li>
      <li id="banana">Banana</li>
      <li id="banana">Orange</li>
      <li id="orange">Orange</li>
    </ul>
    <script>
      // getElementById ๋ฉ”์„œ๋“œ๋Š” ์–ธ์ œ๋‚˜ ๋‹จ ํ•˜๋‚˜์˜ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      // id ๊ฐ’์ด 'banana'์ธ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      // ๋‘ ๋ฒˆ์งธ li ์š”์†Œ๊ฐ€ ํŒŒ์‹ฑ๋˜์–ด ์ƒ์„ฑ๋œ ์š”์†Œ ๋…ธ๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.
      const $elem1 = document.getElementById('banana');
      
      // id ๊ฐ’์ด 'grape'์ธ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค. null์ด ๋ฐ˜ํ™˜๋œ๋‹ค.
      const $elem2 = document.getElementById('grape');

      // ์ทจ๋“ํ•œ ์š”์†Œ ๋…ธ๋“œ์˜ style.color ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
      $elem1.style.color = 'red';
      
      // null๊ฐ’์˜ stype์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ
      $elem2.style.color = 'red'; // -> TypeError: Cannot read property 'stype' of null
    </script>
  </body>
</html>
  • id ๊ฐ’์€ HTML ๋ฌธ์„œ ๋‚ด์—์„œ ์œ ์ผํ•œ ๊ฐ’์ด์–ด์•ผ ํ•˜๋ฉฐ, class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€๋Š” ๋‹ฌ๋ฆฌ ๊ณต๋ฐฑ ๋ฌธ์ž๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ(์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•˜๋”๋ผ๋„ ์—๋Ÿฌ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ)
  • HTML ๋ฌธ์„œ ๋‚ด์— ์ค‘๋œ๋œ id ๊ฐ’์„ ๊ฐ–๋Š” HTML ์š”์†Œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•˜๋ฉด getElementById ๋ฉ”์„œ๋“œ๋Š” id ๊ฐ’์„ ๊ฐ–๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ๋…ธ๋“œ๋งŒ ๋ฐ˜ํ™˜
  • ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ id ๊ฐ’์„ ๊ฐ–๋Š” HTML ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ getElementById ๋ฉ”์„œ๋“œ๋Š” null์„ ๋ฐ˜ํ™˜
// ์•”๋ฌต์  ์„ ์–ธ๊ณผ ๋…ธ๋“œ ๊ฐ์ฒด ํ• ๋‹น
<!DOCTYPE html>
<html>
  <body>
    <div id="foo"></div>
    <script>
      // id ๊ฐ’๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์˜ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ์„ ์–ธ๋˜๊ณ  ํ•ด๋‹น ๋…ธ๋“œ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋œ๋‹ค.
      console.log(foo === document.getElementById('foo')); // true

      // ์•”๋ฌต์  ์ „์—ญ์œผ๋กœ ์ƒ์„ฑ๋œ ์ „์—ญ ํ”„๋กœํผํ‹ฐ๋Š” ์‚ญ์ œ๋˜์ง€๋งŒ ์ „์—ญ ๋ณ€์ˆ˜๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š๋Š”๋‹ค.
      delete foo;
      console.log(foo); // <div id="foo"></div>
    </script>
  </body>
</html>

// ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์žฌํ• ๋‹น๋˜์ง€ ์•Š์Œ
<!DOCTYPE html>
<html>
  <body>
    <div id="foo"></div>
    <script>
      let foo = 1;

      // id ๊ฐ’๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์˜ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์ด๋ฏธ ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฉด ๋…ธ๋“œ ๊ฐ์ฒด๊ฐ€ ์žฌํ• ๋‹น๋˜์ง€ ์•Š๋Š”๋‹ค.
      console.log(foo); // 1
    </script>
  </body>
</html>
  • HTML ์š”์†Œ์— id ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๋ถ€์—ฌํ•˜๋ฉด id ๊ฐ’๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์˜ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ์„ ์–ธ๋˜๊ณ  ํ•ด๋‹น ๋…ธ๋“œ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜๋Š” ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์žˆ์Œ
  • ๋งŒ์•ฝ, id ๊ฐ’๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์˜ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์ด๋ฏธ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ด ์ „์—ญ ๋ณ€์ˆ˜์— ๋…ธ๋“œ ๊ฐ์ฒด๊ฐ€ ์žฌํ• ๋‹น๋˜์ง€ ์•Š์Œ

 

ํƒœ๊ทธ ์ด๋ฆ„์„ ์ด์šฉํ•œ ์š”์†Œ ๋…ธ๋“œ ์ทจ๋“

Document.prototype/Element.prototype.getElementsByTagName ๋ฉ”์„œ๋“œ๋Š” ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ํƒœ๊ทธ ์ด๋ฆ„์„ ๊ฐ–๋Š” ๋ชจ๋“  ์š”์†Œ ๋…ธ๋“œ๋“ค์„ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ์ด๋ฆ„์— ํฌํ•จ๋œ Elements๊ฐ€ ๋ณต์ˆ˜ํ˜•์ธ ๊ฒƒ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์†Œ ๋…ธ๋“œ ๊ฐ์ฒด๋ฅผ ๊ฐ–๋Š” DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์ธ HTMLCollection ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

getElementsByTagName์€ Document.prototype์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ, Element.prototye์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Document.prototype.getElementsByTagName : DOM์˜ ๋ฃจํŠธ ๋…ธ๋“œ(๋ฌธ์„œ ๋…ธ๋“œ, document)๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•ด ์ „์ฒด ํƒ์ƒ‰
  • Element.prototype.getElementsByTagName : ํŠน์ • ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•ด ์ž์‹ ๋…ธ๋“œ ํƒ์ƒ‰
<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
      <li>Apple</li>
      <li>Banana</li>
      <li>Orange</li>
    </ul>
    <ul>
      <li>HTML</li>
    </ul>
    <script>
      // DOM ์ „์ฒด์—์„œ ํƒœ๊ทธ ์ด๋ฆ„์ด li์ธ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      const $lisFromDocument = document.getElementsByTagName('li');
      console.log($lisFromDocument); // HTMLCollection(4) [li, li, li, li]
      
      // ๋ชจ๋“  ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      const $all = document.getElementsByTagName('*');
      // -> HTMLCollection(8) [html, head, body, ul, li#apple, li#banana, li#orange, script, apple: li#apple, banana: li#banana, orange: li#orange]

      // #fruits ์š”์†Œ์˜ ์ž์† ๋…ธ๋“œ ์ค‘์—์„œ ํƒœ๊ทธ ์ด๋ฆ„์ด li์ธ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘
      // ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      const $fruits = document.getElementById('fruits');
      const $lisFromFruits = $fruits.getElementsByTagName('li');
      console.log($lisFromFruits); // HTMLCollection(3) [li, li, li]
    </script>
  </body>
</html>
  • getElementsByTagName ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” DOM ์ปฌ๋ ฅ์„ผ ๊ฐ์ฒด์ธ HTMLCollection ๊ฐ์ฒด๋Š” ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ด๋ฉด์„œ ์ดํ„ฐ๋Ÿฌ๋ธ”
  • HTML ๋ฌธ์„œ์˜ ๋ชจ๋“  ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•˜๋ ค๋ฉด getElementsByTagName์˜ ์ธ์ˆ˜๋กœ *๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•จ
  • ๋งŒ์•ฝ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ํƒœ๊ทธ ์ด๋ฆ„์„ ๊ฐ–๋Š” ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋นˆ HTMLCollection ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜

 

class๋ฅผ ์ด์šฉํ•œ ์š”์†Œ ๋…ธ๋“œ ์ทจ๋“

Document.prototype/Element.prototype.getElementsByClassName ๋ฉ”์„œ๋“œ๋Š” ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ๊ฐ–๋Š” ๋ชจ๋“  ์š”์†Œ ๋…ธ๋“œ๋“ค์„ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. getElementsByClassName ๋ฉ”์„œ๋“œ ๋˜ํ•œ Document.prototype์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ, Element.prototye์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Document.prototype.getElementsByClassName : DOM์˜ document๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•ด ์ „์ฒด ํƒ์ƒ‰
  • Element.prototype.getElementsByClassName : ํŠน์ • ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•ด ์ž์‹ ๋…ธ๋“œ ํƒ์ƒ‰
<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
      <li class="apple">Apple</li>
      <li class="banana">Banana</li>
      <li class="orange">Orange</li>
    </ul>
    <div class="banana">Banana</div>
    <script>
      // DOM ์ „์ฒด์—์„œ class ๊ฐ’์ด 'banana'์ธ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      const $bananasFromDocument = document.getElementsByClassName('banana');
      console.log($bananasFromDocument); // HTMLCollection(2) [li.banana, div.banana]

      // #fruits ์š”์†Œ์˜ ์ž์† ๋…ธ๋“œ ์ค‘์—์„œ class ๊ฐ’์ด 'banana'์ธ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      const $fruits = document.getElementById('fruits');
      const $bananasFromFruits = $fruits.getElementsByClassName('banana');

      console.log($bananasFromFruits); // HTMLCollection [li.banana]
      
      // class ๊ฐ’์ด 'fruit apple'์ธ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜์—ฌ HTMLCollection ๊ฐ์ฒด์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      const $apples = document.getElementsByClassName('fruit apple');

      // ์ทจ๋“ํ•œ ๋ชจ๋“  ์š”์†Œ ๋…ธ๋“œ์˜ style.color ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
      [...$apples].forEach(elem => { elem.style.color = 'blue'; });
    </script>
  </body>
</html>
  • ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  class ๊ฐ’์€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ class๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • getElementsByClassName๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์†Œ ๋…ธ๋“œ ๊ฐ์ฒด๋ฅผ ๊ฐ–๋Š” DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์ธ HTMLCollection๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • ๋งŒ์•ฝ, ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ class ๊ฐ’์„ ๊ฐ–๋Š” ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋นˆ HTMLCollection๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜

 

CSS ์„ ํƒ์ž๋ฅผ ์ด์šฉํ•œ ์š”์†Œ ๋…ธ๋“œ ์ทจ๋“

CSS ์„ ํƒ์ž(selector)๋Š” ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” HTML ์š”์†Œ๋ฅผ ํŠน์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

/* ์ „์ฒด ์„ ํƒ์ž: ๋ชจ๋“  ์š”์†Œ๋ฅผ ์„ ํƒ */
* { ... }
/* ํƒœ๊ทธ ์„ ํƒ์ž: ๋ชจ๋“  p ํƒœ๊ทธ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ์„ ํƒ */
p { ... }
/* id ์„ ํƒ์ž: id ๊ฐ’์ด 'foo'์ธ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ์„ ํƒ */
#foo { ... }
/* class ์„ ํƒ์ž: class ๊ฐ’์ด 'foo'์ธ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ์„ ํƒ */
.foo { ... }
/* ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์„ ํƒ์ž: input ์š”์†Œ ์ค‘์— type ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์ด 'text'์ธ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ์„ ํƒ */
input[type=text] { ... }
/* ํ›„์† ์„ ํƒ์ž: div ์š”์†Œ์˜ ํ›„์† ์š”์†Œ ์ค‘ p ์š”์†Œ๋ฅผ ๋ชจ๋‘ ์„ ํƒ */
div p { ... }
/* ์ž์‹ ์„ ํƒ์ž: div ์š”์†Œ์˜ ์ž์‹ ์š”์†Œ ์ค‘ p ์š”์†Œ๋ฅผ ๋ชจ๋‘ ์„ ํƒ */
div > p { ... }
/* ์ธ์ ‘ ํ˜•์ œ ์„ ํƒ์ž: p ์š”์†Œ์˜ ํ˜•์ œ ์š”์†Œ ์ค‘์— p ์š”์†Œ ๋ฐ”๋กœ ๋’ค์— ์œ„์น˜ํ•˜๋Š” ul ์š”์†Œ๋ฅผ ์„ ํƒ */
p + ul { ... }
/* ์ผ๋ฐ˜ ํ˜•์ œ ์„ ํƒ์ž: p ์š”์†Œ์˜ ํ˜•์ œ ์š”์†Œ ์ค‘์— p ์š”์†Œ ๋’ค์— ์œ„์น˜ํ•˜๋Š” ul ์š”์†Œ๋ฅผ ๋ชจ๋‘ ์„ ํƒ */
p ~ ul { ... }
/* ๊ฐ€์ƒ ํด๋ž˜์Šค ์„ ํƒ์ž: hover ์ƒํƒœ์ธ a ์š”์†Œ๋ฅผ ๋ชจ๋‘ ์„ ํƒ */
a:hover { ... }
/* ๊ฐ€์ƒ ์š”์†Œ ์„ ํƒ์ž: p ์š”์†Œ์˜ ์ฝ˜ํ…์ธ ์˜ ์•ž์— ์œ„์น˜ํ•˜๋Š” ๊ณต๊ฐ„์„ ์„ ํƒ
   ์ผ๋ฐ˜์ ์œผ๋กœ content ํ”„๋กœํผํ‹ฐ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค. */
p::before { ... }

 

Document.prototype/Element.prototype.querySelector ๋ฉ”์„œ๋“œ

์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ CSS ์„ ํƒ์ž๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” ํ•˜๋‚˜์˜ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์ธ์ˆ˜๋กœ ์„ ํƒํ•œ CSS ์„ ํƒ์ž๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” ์š”์†Œ ๋…ธ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ๋…ธ๋“œ๋งŒ ๋ฐ˜ํ™˜
  • ์ธ์ˆ˜๋กœ ์„ ํƒํ•œ CSS ์„ ํƒ์ž๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” ์š”์†Œ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ null ๋ฐ˜ํ™˜
  • ์ธ์ˆ˜๋กœ ์„ ํƒํ•œ CSS ์„ ํƒ์ž๊ฐ€ ๋ฌธ๋ฒ•์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ DOMException ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ
<!DOCTYPE html>
<html>
  <body>
    <ul>
      <li class="apple">Apple</li>
      <li class="banana">Banana</li>
      <li class="orange">Orange</li>
    </ul>
    <script>
      // class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์ด 'banana'์ธ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      const $elem = document.querySelector('.banana');

      // ์ทจ๋“ํ•œ ์š”์†Œ ๋…ธ๋“œ์˜ style.color ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
      $elem.style.color = 'red';
    </script>
  </body>
</html>

 

Document.prototype/Element.prototype.querySelectorAll ๋ฉ”์„œ๋“œ

์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ CSS ์„ ํƒ์ž๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” ๋ชจ๋“  ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์†Œ ๋…ธ๋“œ ๊ฐ์ฒด๋ฅผ ๊ฐ–๋Š” DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์ธ NodeList(์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด and ์ดํ„ฐ๋Ÿฌ๋ธ”)๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • ์ธ์ˆ˜๋กœ ์„ ํƒํ•œ CSS ์„ ํƒ์ž๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” ์š”์†Œ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋นˆ NodeList ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • ์ธ์ˆ˜๋กœ ์„ ํƒํ•œ CSS ์„ ํƒ์ž๊ฐ€ ๋ฌธ๋ฒ•์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ DOMException ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ
  • HTML์˜ ๋ฌธ์„œ์˜ ๋ชจ๋“  ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•˜๋ ค๋ฉด ์ธ์ˆ˜๋กœ ์ „์ฒด ์„ ํƒ์ž *๋ฅผ ์ „๋‹ฌ
<!DOCTYPE html>
<html>
  <body>
    <ul>
      <li class="apple">Apple</li>
      <li class="banana">Banana</li>
      <li class="orange">Orange</li>
    </ul>
    <script>
      // ul ์š”์†Œ์˜ ์ž์‹ ์š”์†Œ์ธ li ์š”์†Œ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      const $elems = document.querySelectorAll('ul > li');
      // ์ทจ๋“ํ•œ ์š”์†Œ ๋…ธ๋“œ๋“ค์€ NodeList ๊ฐ์ฒด์— ๋‹ด๊ฒจ ๋ฐ˜ํ™˜๋œ๋‹ค.
      console.log($elems); // NodeList(3) [li.apple, li.banana, li.orange]

      // ์ทจ๋“ํ•œ ๋ชจ๋“  ์š”์†Œ ๋…ธ๋“œ์˜ style.color ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
      // NodeList๋Š” forEach ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
      $elems.forEach(elem => { elem.style.color = 'red'; });
      
      // ๋ชจ๋“  ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      const $all = document.querySelectorAll('*');
      // -> NodeList(8) [html, head, body, ul, li#apple, li#banana, li#orange, script]
    </script>
  </body>
</html>

 

querySelector ์™€ querySelectorAll ๋ฉ”์„œ๋“œ ๋˜ํ•œ document๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•ด DOM ์ „์ฒด๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ์™€ ํŠน์ • ์š”์†Œ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ Document.prototype๊ณผ Element.prototype์— ๊ฐ๊ฐ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ CSS ์„ ํƒ์ž ๋ฌธ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  • querySelector ์™€ querySelectorAll ๋ฉ”์„œ๋“œ๋Š” ๋‹ค๋ฅธ ์š”์†Œ ์ทจ๋“ ๋ฉ”์„œ๋“œ๋“ค์— ๋น„ํ•ด ๋‹ค์†Œ ๋Š๋ฆฐ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Œ(๋‹จ์ )
  • CSS ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข€ ๋” ๊ตฌ์ฒด์ ์ธ ์กฐ๊ฑด์œผ๋กœ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•  ์ˆ˜ ์žˆ์Œ(์žฅ์ )

๋”ฐ๋ผ์„œ id ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์žˆ๋Š” ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•˜๋Š” ๊ฒฝ์šฐ getElementById ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ ์ด์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” querySelector ์™€ querySelectorAll ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

 

ํŠน์ • ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ

Element.prototype.matches ๋ฉ”์„œ๋“œ๋Š” ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ CSS ์„ ํƒ์ž๋ฅผ ํ†ตํ•ด ํŠน์ • ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
      <li class="apple">Apple</li>
      <li class="banana">Banana</li>
      <li class="orange">Orange</li>
    </ul>
  </body>
  <script>
    const $apple = document.querySelector('.apple');

    // $apple ๋…ธ๋“œ๋Š” '#fruits > li.apple'๋กœ ์ทจ๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.
    console.log($apple.matches('#fruits > li.apple'));  // true

    // $apple ๋…ธ๋“œ๋Š” '#fruits > li.banana'๋กœ ์ทจ๋“ํ•  ์ˆ˜ ์—†๋‹ค.
    console.log($apple.matches('#fruits > li.banana')); // false
  </script>
</html>

 

HTMLCollection๊ณผ NodeList

DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์ธ HTMLCollection๊ณผ NodeList๋Š” DOM API๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. HTMLCollection๊ณผ NodeList๋Š” ๋ชจ๋‘ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ด๋ฉด์„œ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋ฏ€๋กœ for ... of ๋ฌธ์œผ๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • HTMLCollection : ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ํ•˜๋Š” ์‚ด์•„ ์žˆ๋Š”(live) ๊ฐ์ฒด
  • NodeList : ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ํ•˜์ง€ ์•Š๊ณ  ๊ณผ๊ฑฐ์˜ ์ •์  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” non-live ๊ฐ์ฒด๋กœ ๋™์ž‘ (๊ฒฝ์šฐ์— ๋”ฐ๋ผ live ๊ฐ์ฒด๋กœ ๋™์ž‘)

HTMLCollection

getElementsByTagName๊ณผ getElementsByClassName ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด๋กœ live ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ HTMLCollection ๊ฐ์ฒด๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋ฐ˜์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— for ๋ฌธ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

HTMLCollection ๊ฐ์ฒด๋Š” for๋ฌธ ๋Œ€์‹  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœํšŒ ๋ฐฉ๋ฒ•์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

  • for๋ฌธ์„ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ˆœํšŒ
  • while ๋ฌธ์œผ๋กœ HTMLCollection์— ์š”์†Œ๊ฐ€ ๋‚จ์•„ ์žˆ์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋ฌดํ•œ ๋ฐ˜๋ณต
  • ๊ฐ์ฒด์˜ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐฐ์—ด์˜ ๊ณ ์ฐจ ํ•จ์ˆ˜(forEach, map, filter, reduce ๋“ฑ)๋ฅผ ์‚ฌ์šฉ

 

NodeList

querySelectorAll ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด๋กœ non-live ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๋‹จ, childNodes ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” NodeList ๊ฐ์ฒด๋Š” HTMLCollection ๊ฐ์ฒด์™€ ๊ฐ™์ด live ๊ฐ์ฒด๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

 

๋”ฐ๋ผ์„œ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€๊ฒฝ๊ณผ ์ƒ๊ด€์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ DOM ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด HTMLCollection์ด๋‚˜ NodeList ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
      <li>Apple</li>
      <li>Banana</li>
    </ul>
  </body>
  <script>
    const $fruits = document.getElementById('fruits');

    // childNodes ํ”„๋กœํผํ‹ฐ๋Š” NodeList ๊ฐ์ฒด(live)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    const { childNodes } = $fruits;

    // ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ NodeList ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
    [...childNodes].forEach(childNode => {
      $fruits.removeChild(childNode);
    });

    // $fruits ์š”์†Œ์˜ ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋ชจ๋‘ ์‚ญ์ œ๋˜์—ˆ๋‹ค.
    console.log(childNodes); // NodeList []
  </script>
</html>

๋…ธ๋“œ ํƒ์ƒ‰

์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•œ ๋‹ค์Œ, ์ทจ๋“ํ•œ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ ์œผ๋กœ DOM ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๋ฅผ ์˜ฎ๊ฒจ ๋‹ค๋‹ˆ๋ฉฐ ๋ถ€๋ชจ, ํ˜•์ œ, ์ž์‹ ๋…ธ๋“œ ๋“ฑ์„ ํƒ์ƒ‰ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ์œ„ํ•ด DOM ํŠธ๋ฆฌ ์ƒ์˜ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก Node, Element ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํŠธ๋ฆฌ ํƒ์ƒ‰ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • Node.prototype : parentNode, previousSibling, firstChild, childNodes ํ”„๋กœํผํ‹ฐ ์ œ๊ณต
  • Element.prototype : previousElemnetSibling, nextElemnetSibling, children ํ”„๋กœํผํ‹ฐ ์ œ๊ณต

 

์ด๋Ÿฌํ•œ ๋…ธ๋“œ ํƒ์ƒ‰ ํ”„๋กœํผํ‹ฐ๋Š” ๋ชจ๋‘ setter์—†์ด getter๋งŒ ์กด์žฌํ•˜์—ฌ ์ฐธ์กฐ๋งŒ ๊ฐ€๋Šฅํ•œ ์ฝ๊ธฐ ์ „์šฉ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ์ž…๋‹ˆ๋‹ค.

 

๊ณต๋ฐฑ ํ…์ŠคํŠธ ๋…ธ๋“œ

HTML ์š”์†Œ ์‚ฌ์ด์˜ ์ŠคํŽ˜์ด์Šค, ํƒญ, ์ค„๋ฐ”๊ฟˆ(๊ฐœํ–‰) ๋“ฑ์˜ ๊ณต๋ฐฑ ๋ฌธ์ž๋Š” ํ…์ŠคํŠธ ๋…ธ๋“œ์ธ "๊ณต๋ฐฑ ํ…์ŠคํŠธ ๋…ธ๋“œ"๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
      <li class="apple">Apple</li>
      <li class="banana">Banana</li>
      <li class="orange">Orange</li>
    </ul>
  </body>
</html>

 

๋”ฐ๋ผ์„œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ๋Š” ๊ณต๋ฐฑ ๋ฌธ์ž๊ฐ€ ์ƒ์„ฑํ•œ ๊ณต๋ฐฑ ํ…์ŠคํŠธ ๋…ธ๋“œ์— ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ž์‹ ๋…ธ๋“œ ํƒ์ƒ‰

์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋…ธ๋“œ ํƒ์ƒ‰ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœํผํ‹ฐ ์„ค๋ช…
Node.prototype.childNodes ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜์—ฌ DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์ธ NodeList์— ๋‹ด์•„ ๋ฐ˜ํ™˜
Element.prototype.children ์ž์‹ ๋…ธ๋“œ ์ค‘์—์„œ ์š”์†Œ ๋…ธ๋“œ๋งŒ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜์—ฌ DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์ธ HTMLCollection์— ๋‹ด์•„ ๋ฐ˜ํ™˜
Node.prototype.fistChild ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜
Node.prototype.lastChild ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜
Element.prototype.firstElemntChild ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜
Element.prototype.lastElementChild ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜
  • Node.prototpye ํ”„๋กœํผํ‹ฐ : ์š”์†Œ ๋…ธ๋“œ์™€ ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜
  • Element.prototype ํ”„๋กœํผํ‹ฐ : ์š”์†Œ ๋…ธ๋“œ๋งŒ ๋ฐ˜ํ™˜ (ํ…์ŠคํŠธ ๋…ธ๋“œ ํฌํ•จ X)
<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
      <li class="apple">Apple</li>
      <li class="banana">Banana</li>
      <li class="orange">Orange</li>
    </ul>
  </body>
  <script>
    // ๋…ธ๋“œ ํƒ์ƒ‰์˜ ๊ธฐ์ ์ด ๋˜๋Š” #fruits ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•œ๋‹ค.
    const $fruits = document.getElementById('fruits');

    // #fruits ์š”์†Œ์˜ ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    // childNodes ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ NodeList์—๋Š” ์š”์†Œ ๋…ธ๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ…์ŠคํŠธ ๋…ธ๋“œ๋„ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.
    console.log($fruits.childNodes);
    // NodeList(7) [text, li.apple, text, li.banana, text, li.orange, text]

    // #fruits ์š”์†Œ์˜ ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    // children ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ HTMLCollection์—๋Š” ์š”์†Œ ๋…ธ๋“œ๋งŒ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.
    console.log($fruits.children);
    // HTMLCollection(3) [li.apple, li.banana, li.orange]

    // #fruits ์š”์†Œ์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    // firstChild ํ”„๋กœํผํ‹ฐ๋Š” ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    console.log($fruits.firstChild); // #text

    // #fruits ์š”์†Œ์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    // lastChild ํ”„๋กœํผํ‹ฐ๋Š” ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    console.log($fruits.lastChild); // #text

    // #fruits ์š”์†Œ์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    // firstElementChild ํ”„๋กœํผํ‹ฐ๋Š” ์š”์†Œ ๋…ธ๋“œ๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    console.log($fruits.firstElementChild); // li.apple

    // #fruits ์š”์†Œ์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    // lastElementChild ํ”„๋กœํผํ‹ฐ๋Š” ์š”์†Œ ๋…ธ๋“œ๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    console.log($fruits.lastElementChild); // li.orange
  </script>
</html>

 

์ž์‹ ๋…ธ๋“œ ์กด์žฌ ํ™•์ธ

Node.prototype.hasChildNodes ๋ฉ”์„œ๋“œ

  • ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด true๋ฅผ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด false๋ฅผ ๋ฐ˜ํ™˜
  • ์ž์‹ ๋…ธ๋“œ์˜ ์กด์žฌ๋ฅผ ํ…์ŠคํŠธ ๋…ธ๋“œ์™€ ์š”์†Œ ๋…ธ๋“œ์—์„œ ํ™•์ธ

Element.prototype.childElementCount / Node.prototype.children.length ํ”„๋กœํผํ‹ฐ

  • ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด true๋ฅผ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด false๋ฅผ ๋ฐ˜ํ™˜
  • ์ž์‹ ๋…ธ๋“œ์˜ ์กด์žฌ๋ฅผ ์š”์†Œ ๋…ธ๋“œ์—์„œ ํ™•์ธ
<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
    </ul>
  </body>
  <script>
    // ๋…ธ๋“œ ํƒ์ƒ‰์˜ ๊ธฐ์ ์ด ๋˜๋Š” #fruits ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•œ๋‹ค.
    const $fruits = document.getElementById('fruits');

    // #fruits ์š”์†Œ์— ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    // hasChildNodes ๋ฉ”์„œ๋“œ๋Š” ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ž์‹ ๋…ธ๋“œ์˜ ์กด์žฌ๋ฅผ ํ™•์ธํ•œ๋‹ค.
    console.log($fruits.hasChildNodes()); // true

    // hasChildNodes ๋ฉ”์„œ๋“œ๋Š” ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ž์‹ ๋…ธ๋“œ์˜ ์กด์žฌ๋ฅผ ํ™•์ธํ•œ๋‹ค.
    console.log($fruits.hasChildNodes()); // true

    // ์ž์‹ ๋…ธ๋“œ ์ค‘์— ํ…์ŠคํŠธ ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ์š”์†Œ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€๋Š” ํ™•์ธํ•œ๋‹ค.
    console.log(!!$fruits.children.length); // 0 -> false
    // ์ž์‹ ๋…ธ๋“œ ์ค‘์— ํ…์ŠคํŠธ ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ์š”์†Œ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€๋Š” ํ™•์ธํ•œ๋‹ค.
    console.log(!!$fruits.childElementCount); // 0 -> false
  </script>
</html>

 

์š”์†Œ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ ๋…ธ๋“œ ํƒ์ƒ‰

์š”์†Œ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ firstChild ํ”„๋กœํผํ‹ฐ๋กœ ์š”์†Œ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ ๋…ธ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ, firstChild ํ”„๋กœํผํ‹ฐ๋Š” ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ํ…์ŠคํŠธ ๋…ธ๋“œ์ด๊ฑฐ๋‚˜ ์š”์†Œ ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
<body>
  <div id="foo">Hello</div>
  <script>
    // ์š”์†Œ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” firstChild ํ”„๋กœํผํ‹ฐ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
    console.log(document.getElementById('foo').firstChild); // #text
  </script>
</body>
</html>

 

๋ถ€๋ชจ ๋…ธ๋“œ ํƒ์ƒ‰

๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ ค๋ฉด Node.prototype.parentNode ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” DOM ํŠธ๋ฆฌ์˜ ์ตœ์ข…๋‹จ ๋…ธ๋“œ์ธ ๋ฆฌํ”„ ๋…ธ๋“œ์ด๋ฏ€๋กœ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ํ…์ŠคํŠธ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
      <li class="apple">Apple</li>
      <li class="banana">Banana</li>
      <li class="orange">Orange</li>
    </ul>
  </body>
  <script>
    // ๋…ธ๋“œ ํƒ์ƒ‰์˜ ๊ธฐ์ ์ด ๋˜๋Š” .banana ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•œ๋‹ค.
    const $banana = document.querySelector('.banana');

    // .banana ์š”์†Œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    console.log($banana.parentNode); // ul#fruits
  </script>
</html>

 

ํ˜•์ œ ๋…ธ๋“œ ํƒ์ƒ‰

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

 

ํ”„๋กœํผํ‹ฐ ์„ค๋ช…
Node.prototype.previousSibling ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ํ˜•์ œ ๋…ธ๋“œ ์ค‘์—์„œ ์ž์‹ ์˜ ์ด์ „ ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜
Node.prototype.nextSibling ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ํ˜•์ œ ๋…ธ๋“œ ์ค‘์—์„œ ์ž์‹ ์˜ ๋‹ค์Œ ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜
Element.prototype.previousElementSibling ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ํ˜•์ œ ๋…ธ๋“œ ์ค‘์—์„œ ์ž์‹ ์˜ ์ด์ „ ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜
Element.prototype.nextElementSibling ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ํ˜•์ œ ๋…ธ๋“œ ์ค‘์—์„œ ์ž์‹ ์˜ ๋‹ค์Œ ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜
  • Node.prototpye ํ”„๋กœํผํ‹ฐ : ์š”์†Œ ๋…ธ๋“œ์™€ ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜
  • Element.prototype ํ”„๋กœํผํ‹ฐ : ์š”์†Œ ๋…ธ๋“œ๋งŒ ๋ฐ˜ํ™˜ (ํ…์ŠคํŠธ ๋…ธ๋“œ ํฌํ•จ X)
<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
      <li class="apple">Apple</li>
      <li class="banana">Banana</li>
      <li class="orange">Orange</li>
    </ul>
  </body>
  <script>
    // ๋…ธ๋“œ ํƒ์ƒ‰์˜ ๊ธฐ์ ์ด ๋˜๋Š” #fruits ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•œ๋‹ค.
    const $fruits = document.getElementById('fruits');

    // #fruits ์š”์†Œ์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    // firstChild ํ”„๋กœํผํ‹ฐ๋Š” ์š”์†Œ ๋…ธ๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    const { firstChild } = $fruits;
    console.log(firstChild); // #text

    // #fruits ์š”์†Œ์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ(ํ…์ŠคํŠธ ๋…ธ๋“œ)์˜ ๋‹ค์Œ ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    // nextSibling ํ”„๋กœํผํ‹ฐ๋Š” ์š”์†Œ ๋…ธ๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    const { nextSibling } = firstChild;
    console.log(nextSibling); // li.apple

    // li.apple ์š”์†Œ์˜ ์ด์ „ ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    // previousSibling ํ”„๋กœํผํ‹ฐ๋Š” ์š”์†Œ ๋…ธ๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    const { previousSibling } = nextSibling;
    console.log(previousSibling); // #text

    // #fruits ์š”์†Œ์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    // firstElementChild ํ”„๋กœํผํ‹ฐ๋Š” ์š”์†Œ ๋…ธ๋“œ๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    const { firstElementChild } = $fruits;
    console.log(firstElementChild); // li.apple

    // #fruits ์š”์†Œ์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ์š”์†Œ ๋…ธ๋“œ(li.apple)์˜ ๋‹ค์Œ ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    // nextElementSibling ํ”„๋กœํผํ‹ฐ๋Š” ์š”์†Œ ๋…ธ๋“œ๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    const { nextElementSibling } = firstElementChild;
    console.log(nextElementSibling); // li.banana

    // li.banana ์š”์†Œ์˜ ์ด์ „ ํ˜•์ œ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    // previousElementSibling ํ”„๋กœํผํ‹ฐ๋Š” ์š”์†Œ ๋…ธ๋“œ๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    const { previousElementSibling } = nextElementSibling;
    console.log(previousElementSibling); // li.apple
  </script>
</html>

๋…ธ๋“œ ์ •๋ณด ์ทจ๋“

๋…ธ๋“œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ทจ๋“ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋…ธ๋“œ ์ •๋ณด ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

ํ”„๋กœํผํ‹ฐ ์„ค๋ช…
Node.prototype.nodeType ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ข…๋ฅ˜(ํƒ€์ž…)์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ (์ƒ์ˆ˜๋Š” Node์— ์ •์˜๋˜์–ด ์žˆ์Œ)
- Node.ELEMENT_NODE : ์š”์†Œ ๋…ธ๋“œ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒ์ˆ˜ 1 ๋ฐ˜ํ™˜
- Node.TEXT_NODE : ํ…์ŠคํŠธ ๋…ธ๋“œ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒ์ˆ˜ 3 ๋ฐ˜ํ™˜
- Node.DOCUMENT_NODE : ๋ฌธ์„œ ๋…ธ๋“œ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒ์ˆ˜ 9 ๋ฐ˜ํ™˜
Node.prototype.nodeName ๋…ธ๋“œ ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜
- ์š”์†Œ ๋…ธ๋“œ : ๋Œ€๋ฌธ์ž ๋ฌธ์ž์—ด๋กœ ํƒœ๊ทธ ์ด๋ฆ„("UL, "LI" ๋“ฑ)์„ ๋ฐ˜ํ™˜
- ํ…์ŠคํŠธ ๋…ธ๋“œ : ๋ฌธ์ž์—ด "#text"๋ฅผ ๋ฐ˜ํ™˜
- ๋ฌธ์„œ ๋…ธ๋“œ : ๋ฌธ์ž์—ด "#document"๋ฅผ ๋ฐ˜ํ™˜
<!DOCTYPE html>
<html>
  <body>
    <div id="foo">Hello</div>
  </body>
  <script>
    // ๋ฌธ์„œ ๋…ธ๋“œ์˜ ๋…ธ๋“œ ์ •๋ณด๋ฅผ ์ทจ๋“ํ•œ๋‹ค.
    console.log(document.nodeType); // 9
    console.log(document.nodeName); // #document

    // ์š”์†Œ ๋…ธ๋“œ์˜ ๋…ธ๋“œ ์ •๋ณด๋ฅผ ์ทจ๋“ํ•œ๋‹ค.
    const $foo = document.getElementById('foo');
    console.log($foo.nodeType); // 1
    console.log($foo.nodeName); // DIV

    // ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ ๋…ธ๋“œ ์ •๋ณด๋ฅผ ์ทจ๋“ํ•œ๋‹ค.
    const $textNode = $foo.firstChild;
    console.log($textNode.nodeType); // 3
    console.log($textNode.nodeName); // #text
</script>
</html>

์š”์†Œ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ ์กฐ์ž‘

nodeValue

Node.prototype.nodeValue ํ”„๋กœํผํ‹ฐ๋Š” setter์™€ getter ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋กœ์„œ nodeValue ํ”„๋กœํผํ‹ฐ๋Š” ์ฐธ์กฐ์™€ ํ• ๋‹น ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

๋…ธ๋“œ ๊ฐ์ฒด์˜ nodeValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ๋…ธ๋“œ ๊ฐ์ฒด์˜ ๊ฐ’์ธ ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. (๋ฌธ์„œ ๋…ธ๋“œ๋‚˜ ์š”์†Œ ๋…ธ๋“œ์˜ nodeValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด null์„ ๋ฐ˜ํ™˜)

 

nodeValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•œ ์š”์†Œ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ ์กฐ์ž‘ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•  ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•œ ๋‹ค์Œ, ์ทจ๋“ํ•œ ์š”์†Œ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ firstChild ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด ํƒ์ƒ‰
  2. ํƒ์ƒ‰ํ•œ ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ nodeValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ
<!DOCTYPE html>
<html>
  <body>
    <div id="foo">Hello</div>
  </body>
  <script>
    // 1. #foo ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ์ธ ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•œ๋‹ค.
    const $textNode = document.getElementById('foo').firstChild;

    // 2. nodeValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
    $textNode.nodeValue = 'World';

    console.log($textNode.nodeValue); // World
  </script>
</html>

 

textContent

Node.prototype.textContent ํ”„๋กœํผํ‹ฐ๋Š” setter์™€ getter ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋กœ์„œ ์š”์†Œ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ์™€ ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ์ทจ๋“ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

 

์š”์†Œ ๋…ธ๋“œ์˜ textContent ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์š”์†Œ ๋…ธ๋“œ์˜ ์ฝ˜ํ…์ธ  ์˜์—ญ(์‹œ์ž‘ ํƒœ๊ทธ์™€ ์ข…๋ฃŒ ํƒœ๊ทธ ์‚ฌ์ด) ๋‚ด์˜ ํ…์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์š”์†Œ ๋…ธ๋“œ์˜ childNodes ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์˜ ํ…์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ HTML ๋งˆํฌ์—…์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <body>
    <div id="foo">Hello <span>world!</span></div>
  </body>
  <script>
    // #foo ์š”์†Œ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ์ทจ๋“ํ•œ๋‹ค. ์ด๋•Œ HTML ๋งˆํฌ์—…์€ ๋ฌด์‹œ๋œ๋‹ค.
    console.log(document.getElementById('foo').textContent); // Hello world!
  </script>
</html>

 

์š”์†Œ ๋…ธ๋“œ์˜ textContent ํ”„๋กœํผํ‹ฐ์— ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•˜๋ฉด ์š”์†Œ ๋…ธ๋“œ์˜ ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ํ• ๋‹นํ•œ ๋ฌธ์ž์—ด์ด ํ…์ŠคํŠธ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํ• ๋‹นํ•œ ๋ฌธ์ž์—ด์— HTML ๋งˆํฌ์—…์ด ํฌํ•จ๋˜์–ด ์žˆ๋”๋ผ๋„ ๋ฌธ์ž์—ด ๊ทธ๋Œ€๋กœ ์ธ์‹๋˜์–ด ํ…์ŠคํŠธ๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค.

 

์•ž์„œ ์‚ดํŽด๋ณธ nodeValue ํ”„๋กœํผํ‹ฐ์— ๋น„ํ•ด textContent ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋กœ ํ…์ŠคํŠธ๋ฅผ ์ทจ๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


DOM ์กฐ์ž‘

DOM ์กฐ์ž‘์€ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ DOM์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ ๋˜๋Š” ๊ต์ฒดํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ๋ฆฌํ”Œ๋กœ์šฐ์™€ ๋ฆฌํŽ˜์ธํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ฃผ์˜ํ•ด์„œ ๋‹ค๋ฃจ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

innerHTML

Element.prototype.innerHTML ํ”„๋กœํผํ‹ฐ๋Š” setter์™€ getter ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋กœ์„œ ์š”์†Œ ๋…ธ๋“œ์˜ HTML ๋งˆํฌ์—…์„ ์ทจ๋“ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์š”์†Œ ๋…ธ๋“œ์˜ innerHTML ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์š”์†Œ ๋…ธ๋“œ์˜ ์ฝ˜ํ…์ธ  ์˜์—ญ ๋‚ด์— ํฌํ•จ๋œ ๋ชจ๋“  HTML ๋งˆํฌ์—…์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <body>
    <div id="foo">Hello <span>world!</span></div>
  </body>
  <script>
    // #foo ์š”์†Œ์˜ ์ฝ˜ํ…์ธ  ์˜์—ญ ๋‚ด์˜ HTML ๋งˆํฌ์—…์„ ๋ฌธ์ž์—ด๋กœ ์ทจ๋“ํ•œ๋‹ค.
    console.log(document.getElementById('foo').innerHTML);
    // "Hello <span>world!</span>"
  </script>
</html>

 

์š”์†Œ ๋…ธ๋“œ์˜ innerHTML ํ”„๋กœํผํ‹ฐ์— ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•˜๋ฉด ์š”์†Œ ๋…ธ๋“œ์˜ ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ํ• ๋‹นํ•œ ๋ฌธ์ž์—ด์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” HTML ๋งˆํฌ์—…์ด ํŒŒ์‹ฑ๋˜์–ด ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋กœ DOM์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <body>
    <div id="foo">Hello <span>world!</span></div>
  </body>
  <script>
    // HTML ๋งˆํฌ์—…์ด ํŒŒ์‹ฑ๋˜์–ด ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋กœ DOM์— ๋ฐ˜์˜๋œ๋‹ค.
    document.getElementById('foo').innerHTML = 'Hi <span>there!</span>';
  </script>
</html>

 

์ด์ฒ˜๋Ÿผ innerHTML ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HTML ๋งˆํฌ์—… ๋ฌธ์ž์—ด๋กœ ๊ฐ„๋‹จํžˆ DOM ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ์•„๋ž˜์™€ ๊ฐ™์€ ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ innerHTML ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ XSS(ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŠธ ๊ณต๊ฒฉ)์— ์ทจ์•ฝํ•˜๋ฏ€๋กœ ์œ„ํ—˜ํ•จ
  • innerHTML ํ”„๋กœํผํ‹ฐ์— HTML ๋งˆํฌ์—… ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•˜๋ฉด ๊ธฐ์กด์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กญ๊ฒŒ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ DOM์— ๋ฐ˜์˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์ด์ง€ ๋ชปํ•จ
  • innerHTML ํ”„๋กœํผํ‹ฐ๋Š” ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ ์‚ฝ์ž…๋  ์œ„์น˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์—†์Œ

 

insertAdjacentHTML ๋ฉ”์„œ๋“œ

Element.prototype.insertAdjacentHTML(position, DOMString) ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ์กด ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ด

์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, insertAdjacentHTML ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ HTML ๋งˆํฌ์—… ๋ฌธ์ž์—ด(DOMStirng)์„ ํŒŒ์‹ฑํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋กœ ์ƒ์„ฑ๋œ ๋…ธ๋“œ๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ์œ„์น˜(position)์— ์‚ฝ์ž…ํ•˜์—ฌ DOM์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

 

์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด์€ 'beforebegin', 'afterbegin', beforeend', 'afterend'์˜ 4๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <body>
    <!-- beforebegin -->
    <div id="foo">
      <!-- afterbegin -->
      text
      <!-- beforeend -->
    </div>
    <!-- afterend -->
  </body>
  <script>
    const $foo = document.getElementById('foo');

    $foo.insertAdjacentHTML('beforebegin', '<p>beforebegin</p>');
    $foo.insertAdjacentHTML('afterbegin', '<p>afterbegin</p>');
    $foo.insertAdjacentHTML('beforeend', '<p>beforeend</p>');
    $foo.insertAdjacentHTML('afterend', '<p>afterend</p>');
  </script>
</html>

 

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

 

๋…ธ๋“œ ์ƒ์„ฑ๊ณผ ์ถ”๊ฐ€

DOM์€ ๋…ธ๋“œ๋ฅผ ์ง์ ‘ ์ƒ์„ฑ/์‚ฝ์ž…/์‚ญ์ œ/์น˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

๋ฉ”์„œ๋“œ ์„ค๋ช…
Document.prototype.createElement(tagName) ํƒœ๊ทธ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•ด ์š”์†Œ ๋…ธ๋“œ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜
Document.prototype.createTextNode(text) ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ๋ฌธ์ž์—ด์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•ด ํ…์ŠคํŠธ ๋…ธ๋“œ ์ƒ์„ฑ
Node.prototype.appendChild(childNode) ๋งค๊ฐœ๋ณ€์ˆ˜ childNode์—๊ฒŒ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๋…ธ๋“œ๋ฅผ appendChild ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋…ธ๋“œ์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€

 

<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
      <li>Apple</li>
    </ul>
  </body>
  <script>
    const $fruits = document.getElementById('fruits');

    // 1. ์š”์†Œ ๋…ธ๋“œ ์ƒ์„ฑ
    const $li = document.createElement('li');

    // 2. ํ…์ŠคํŠธ ๋…ธ๋“œ ์ƒ์„ฑ
    const textNode = document.createTextNode('Banana');

    // 3. ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ $li ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
    $li.appendChild(textNode);

    // 4. $li ์š”์†Œ ๋…ธ๋“œ๋ฅผ #fruits ์š”์†Œ ๋…ธ๋“œ์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
    $fruits.appendChild($li);
  </script>
</html>

 

๋ณต์ˆ˜์˜ ๋…ธ๋“œ ์ƒ์„ฑ๊ณผ ์ถ”๊ฐ€

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ DOM์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ, DOM์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ๋ฆฌํ”Œ๋กœ์šฐ์™€ ๋ฆฌํŽ˜์ธํŠธ์˜ ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด DocumentFragment ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

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

 

Document.prototype.createDocumnetFragment ๋ฉ”์„œ๋“œ๋Š” ๋น„์–ด ์žˆ๋Š” Documentfragment ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits"></ul>
  </body>
  <script>
    const $fruits = document.getElementById('fruits');

    // DocumentFragment ๋…ธ๋“œ ์ƒ์„ฑ
    const $fragment = document.createDocumentFragment();

    ['Apple', 'Banana', 'Orange'].forEach(text => {
      // 1. ์š”์†Œ ๋…ธ๋“œ ์ƒ์„ฑ
      const $li = document.createElement('li');

      // 2. ํ…์ŠคํŠธ ๋…ธ๋“œ ์ƒ์„ฑ
      const textNode = document.createTextNode(text);

      // 3. ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ $li ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
      $li.appendChild(textNode);

      // 4. $li ์š”์†Œ ๋…ธ๋“œ๋ฅผ DocumentFragment ๋…ธ๋“œ์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
      $fragment.appendChild($li);
    });

    // 5. DocumentFragment ๋…ธ๋“œ๋ฅผ #fruits ์š”์†Œ ๋…ธ๋“œ์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
    $fruits.appendChild($fragment);
  </script>
</html>

 

๋…ธ๋“œ ์‚ฝ์ž…

๋ฉ”์„œ๋“œ ์„ค๋ช…
Node.prototype.appendChild - ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
- ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์œ„์น˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์—†์Œ
Node.prototype.insertBefore(newNode, childNode) - ์ง€์ •ํ•œ ์œ„์น˜์— ๋…ธ๋“œ ์‚ฝ์ž…
- newNode๋ฅผ childNode ์•ž์— ์‚ฝ์ž…
- childNode๋Š” ๋ฐ˜๋“œ์‹œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ

 

๋…ธ๋“œ ์ด๋™

DOM์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋…ธ๋“œ๋ฅผ appendChild ๋˜๋Š” insertBefore ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด DOM์— ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜๋ฉด ํ˜„์žฌ ์œ„์น˜์—์„œ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ์œ„์น˜์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋…ธ๋“œ๋ฅผ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
      <li>Apple</li>
      <li>Banana</li>
      <li>Orange</li>
    </ul>
  </body>
  <script>
    const $fruits = document.getElementById('fruits');

    // ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“
    const [$apple, $banana, ] = $fruits.children;

    // ์ด๋ฏธ ์กด์žฌํ•˜๋Š” $apple ์š”์†Œ ๋…ธ๋“œ๋ฅผ #fruits ์š”์†Œ ๋…ธ๋“œ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋กœ ์ด๋™
    $fruits.appendChild($apple); // Banana - Orange - Apple

    // ์ด๋ฏธ ์กด์žฌํ•˜๋Š” $banana ์š”์†Œ ๋…ธ๋“œ๋ฅผ #fruits ์š”์†Œ์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ ์•ž์œผ๋กœ ์ด๋™
    $fruits.insertBefore($banana, $fruits.lastElementChild);
    // Orange - Banana - Apple
  </script>
</html>

 

๋…ธ๋“œ ๋ณต์‚ฌ

Node.prototype.cloneNode([deep: true | false]) ๋ฉ”์„œ๋“œ๋Š” ๋…ธ๋“œ์˜ ์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ deep์— true๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด ๋…ธ๋“œ๋ฅผ ๊นŠ์€ ๋ณต์‚ฌํ•˜์—ฌ ๋ชจ๋“  ์ž์† ๋…ธ๋“œ๊ฐ€ ํฌํ•จ๋œ ์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•˜๊ณ , false๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด ์ƒ๋žตํ•˜๋ฉด์„œ ๋…ธ๋“œ๋ฅผ ์–‰์€ ๋ณต์‚ฌํ•˜์—ฌ ๋…ธ๋“œ ์ž์‹ ๋งŒ์˜ ์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
      <li>Apple</li>
    </ul>
  </body>
  <script>
    const $fruits = document.getElementById('fruits');
    const $apple = $fruits.firstElementChild;

    // $apple ์š”์†Œ๋ฅผ ์–•์€ ๋ณต์‚ฌํ•˜์—ฌ ์‚ฌ๋ณธ์„ ์ƒ์„ฑ. ํ…์ŠคํŠธ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ์‚ฌ๋ณธ์ด ์ƒ์„ฑ๋œ๋‹ค.
    const $shallowClone = $apple.cloneNode();
    // ์‚ฌ๋ณธ ์š”์†Œ ๋…ธ๋“œ์— ํ…์ŠคํŠธ ์ถ”๊ฐ€
    $shallowClone.textContent = 'Banana';
    // ์‚ฌ๋ณธ ์š”์†Œ ๋…ธ๋“œ๋ฅผ #fruits ์š”์†Œ ๋…ธ๋“œ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
    $fruits.appendChild($shallowClone);

    // #fruits ์š”์†Œ๋ฅผ ๊นŠ์€ ๋ณต์‚ฌํ•˜์—ฌ ๋ชจ๋“  ์ž์† ๋…ธ๋“œ๊ฐ€ ํฌํ•จ๋œ ์‚ฌ๋ณธ์„ ์ƒ์„ฑ
    const $deepClone = $fruits.cloneNode(true);
    // ์‚ฌ๋ณธ ์š”์†Œ ๋…ธ๋“œ๋ฅผ #fruits ์š”์†Œ ๋…ธ๋“œ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
    $fruits.appendChild($deepClone);
  </script>
</html>

 

๋…ธ๋“œ ๊ต์ฒด

Node.prototype.replaceChild(newChild, oldChild) ๋ฉ”์„œ๋“œ๋Š” ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ์ธ oldChild๋ฅผ ๋‹ค๋ฅธ ๋…ธ๋“œ์ธ newChild๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, oldChild ๋…ธ๋“œ๋Š” DOM์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
      <li>Apple</li>
    </ul>
  </body>
  <script>
    const $fruits = document.getElementById('fruits');

    // ๊ธฐ์กด ๋…ธ๋“œ์™€ ๊ต์ฒดํ•  ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑ
    const $newChild = document.createElement('li');
    $newChild.textContent = 'Banana';

    // #fruits ์š”์†Œ ๋…ธ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ์š”์†Œ ๋…ธ๋“œ๋ฅผ $newChild ์š”์†Œ ๋…ธ๋“œ๋กœ ๊ต์ฒด
    $fruits.replaceChild($newChild, $fruits.firstElementChild);
  </script>
</html>

 

๋…ธ๋“œ ์‚ญ์ œ

Node.prototype.removeChild(child) ๋ฉ”์„œ๋“œ๋Š” child ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๋…ธ๋“œ๋ฅผ DOM์—์„œ ์‚ญ์ œํ•˜๋ฉฐ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๋…ธ๋“œ๋Š” removeChild ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
      <li>Apple</li>
      <li>Banana</li>
    </ul>
  </body>
  <script>
    const $fruits = document.getElementById('fruits');

    // #fruits ์š”์†Œ ๋…ธ๋“œ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ DOM์—์„œ ์‚ญ์ œ
    $fruits.removeChild($fruits.lastElementChild);
  </script>
</html>

 


์–ดํŠธ๋ฆฌ๋ทฐํŠธ

์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ์™€ attributes ํ”„๋กœํผํ‹ฐ

HTML ๋ฌธ์„œ์˜ ๊ตฌ์„ฑ ์š”์†Œ์ธ HTML ์š”์†Œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ(์†์„ฑ)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HTML ์š”์†Œ ๋™์ž‘์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” HTML ์š”์†Œ์˜ ์‹œ์ž‘ ํƒœ๊ทธ์— ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ด๋ฆ„ = "์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’" ํ˜•์‹์œผ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

 

<input id="user" type="text" value="ungmo2">

 

HTML ๋ฌธ์„œ๊ฐ€ ํŒŒ์‹ฑ๋  ๋•Œ HTML ์š”์†Œ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜๋˜์–ด ์š”์†Œ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋‹น ํ•˜๋‚˜์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ ๋ชจ๋“  ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ์˜ ์ฐธ์กฐ๋Š” ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ด์ž ์ดํ„ฐ๋Ÿฌ๋ธ”์ธ NameNodeMap ๊ฐ์ฒด์— ๋‹ด๊ฒจ ์š”์†Œ ๋…ธ๋“œ์˜ attributes ํ”„๋กœํผํ‹ฐ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ NameNodeMap ๊ฐ์ฒด๋Š” ์š”์†Œ ๋…ธ๋“œ์˜ Element.prototype.attributes ํ”„๋กœํผํ‹ฐ์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜๋ฉฐ attributes ํ”„๋กœํผํ‹ฐ๋Š” getter๋งŒ ์กด์žฌํ•˜๋Š” ์ฝ๊ธฐ ์ „์šฉ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ์ž…๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
<body>
  <input id="user" type="text" value="ungmo2">
  <script>
    // ์š”์†Œ ๋…ธ๋“œ์˜ attribute ํ”„๋กœํผํ‹ฐ๋Š” ์š”์†Œ ๋…ธ๋“œ์˜ ๋ชจ๋“  ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ์˜ ์ฐธ์กฐ๊ฐ€ ๋‹ด๊ธด NamedNodeMap ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    const { attributes } = document.getElementById('user');
    console.log(attributes);
    // NamedNodeMap {0: id, 1: type, 2: value, id: id, type: type, value: value, length: 3}

    // ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’ ์ทจ๋“
    console.log(attributes.id.value); // user
    console.log(attributes.type.value); // text
    console.log(attributes.value.value); // ungmo2
  </script>
</body>
</html>

 

HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์กฐ์ž‘

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋“ค์„ ํ†ตํ•ด attributes ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•˜์ง€ ์•Š๊ณ  ์š”์†Œ ๋…ธ๋“œ์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ง์ ‘ HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฉ”์„œ๋“œ ์„ค๋ช…
Element.prototype.getAttrubute(attributeName) attributes ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•˜์ง€ ์•Š๊ณ  ์š”์†Œ ๋…ธ๋“œ์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ง์ ‘ HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ์ทจ๋“
Element.prototype.setAttribute(attributeName, atrributeVale) attributes ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•˜์ง€ ์•Š๊ณ  ์š”์†Œ ๋…ธ๋“œ์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ง์ ‘ HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ๋ณ€๊ฒฝ
Element.prototype.hasAttrubute(attributeName) ํŠน์ • HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
Element.prototype.removeAttrubute(attributeName) ํŠน์ • HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ญ์ œ

 

<!DOCTYPE html>
<html>
<body>
  <input id="user" type="text" value="ungmo2">
  <script>
    const $input = document.getElementById('user');

    // value ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ์ทจ๋“
    const inputValue = $input.getAttribute('value');
    console.log(inputValue); // ungmo2

    // value ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ๋ณ€๊ฒฝ
    $input.setAttribute('value', 'foo');
    console.log($input.getAttribute('value')); // foo
    
    // foo ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ์กด์žฌ ํ™•์ธ
    if ($input.hasAttribute('foo')) {
      // foo ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์‚ญ์ œ
      $input.removeAttribute('foo');
    }
    
    // foo ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์‚ญ์ œ๋˜์—ˆ๋‹ค.
    console.log($input.hasAttribute('foo')); // false
  </script>
</body>
</html>

 

HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ vs. DOM ํ”„๋กœํผํ‹ฐ

์š”์†Œ ๋…ธ๋“œ ๊ฐ์ฒด์—๋Š” HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ DOM ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” HTML ์š”์†Œ์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , DOM ํ”„๋กœํผํ‹ฐ๋“ค์€ HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์š”์†Œ ๋…ธ๋“œ์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋•Œ, ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ์˜ํ•œ ์ƒํƒœ ๋ณ€ํ™”์™€ ๊ด€๊ณ„์žˆ๋Š” DOM ํ”„๋กœํผํ‹ฐ๋งŒ ์ตœ์‹  ์ƒํƒœ ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๊ณ  ๊ทธ ์™ธ์˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ์˜ํ•œ ์ƒํƒœ ๋ณ€ํ™”์™€ ๊ด€๊ณ„์—†๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ DOM ํ”„๋กœํผํ‹ฐ๋Š” ํ•ญ์ƒ ๋™์ผํ•œ ๊ฐ’์œผ๋กœ ์—ฐ๋™๋ฉ๋‹ˆ๋‹ค.

  • id ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ id ํ”„๋กœํผํ‹ฐ๋Š” 1:1 ๋Œ€์‘, ๋™์ผํ•œ ๊ฐ’์œผ๋กœ ์—ฐ๋™
  • input ์š”์†Œ์˜ value ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” value ํ”„๋กœํผํ‹ฐ์™€ 1:1 ๋Œ€์‘, value ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ดˆ๊ธฐ๊ฐ’์„ ๊ฐ€์ง€๊ณ  value ํ”„๋กœํผํ‹ฐ๋Š” ์ตœ์‹  ์ƒํƒœ๋ฅผ ๊ฐ€์ง
  • class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” className, classList ํ”„๋กœํผํ‹ฐ์™€ ๋Œ€์‘ํ•จ
  • for ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” htmlFor ํ”„๋กœํผํ‹ฐ์™€ 1:1 ๋Œ€์‘ํ•จ
  • td ์š”์†Œ์˜ colspan ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ textContent ํ”„๋กœํผํ‹ฐ๋Š” ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌX
  • ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜์ง€ ์•Š์ง€๋งŒ ํ”„๋กœํผํ‹ฐ ํ‚ค๋Š” ์นด๋ฉœ ์ผ€์ด์Šค๋ฅผ ๋”ฐ๋ฆ„

 

data ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ dataset ํ”„๋กœํผํ‹ฐ

data ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ dataset ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HTML ์š”์†Œ์— ์ •์˜ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. data ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” data-user-id, data-role๊ณผ ๊ฐ™์ด data- ์ ‘๋‘์‚ฌ ๋‹ค์Œ์— ์ž„์˜์˜ ์ด๋ฆ„์„ ๋ถ™์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

data ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™์ด HTMLElement.dataset ํ”„๋กœํผํ‹ฐ๋กœ ์ทจ๋“ํ•ฉ๋‹ˆ๋‹ค.

  • dataset ํ”„๋กœํผํ‹ฐ๋Š” HTML ์š”์†Œ์˜ ๋ชจ๋“  data ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” DOMStringMap ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • DomStringMap ๊ฐ์ฒด๋Š” data ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ data- ์ ‘๋‘์‚ฌ ๋‹ค์Œ์— ๋ถ™์ธ ์ž„์˜์˜ ์ด๋ฆ„์„ ์นด๋ฉœ์ผ€์ด์Šค๋กœ ๋ณ€ํ™˜ํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด data ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐ’์„ ์ทจ๋“/๋ณ€๊ฒฝ
  • ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ด๋ฆ„์„ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜์—ฌ dataset ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด HTML ์š”์†Œ์— data ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์ถ”๊ฐ€๋จ
<!DOCTYPE html>
<html>
<body>
  <ul class="users">
    <li id="1" data-user-id="7621" data-role="admin">Lee</li>
    <li id="2" data-user-id="9524">Kim</li>
  </ul>
  <script>
    const users = [...document.querySelector('.users').children];

    // user-id๊ฐ€ '7621'์ธ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•œ๋‹ค.
    let user = users.find(user => user.dataset.userId === '7621');
    // user-id๊ฐ€ '7621'์ธ ์š”์†Œ ๋…ธ๋“œ์—์„œ data-role์˜ ๊ฐ’์„ ์ทจ๋“ํ•œ๋‹ค.
    console.log(user.dataset.role); // "admin"

    // user-id๊ฐ€ '7621'์ธ ์š”์†Œ ๋…ธ๋“œ์˜ data-role ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
    user.dataset.role = 'subscriber';
    // dataset ํ”„๋กœํผํ‹ฐ๋Š” DOMStringMap ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    console.log(user.dataset); // DOMStringMap {userId: "7621", role: "subscriber"}
    
    // user-id๊ฐ€ '9524'์ธ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ํ•œ๋‹ค.
    user = users.find(user => user.dataset.userId === '9524');
    
    // user-id๊ฐ€ '9524'์ธ ์š”์†Œ ๋…ธ๋“œ์— ์ƒˆ๋กœ์šด data ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
    user.dataset.role = 'admin';
    console.log(user.dataset);
    /*
    DOMStringMap {userId: "9524", role: "admin"}
    -> <li id="2" data-user-id="9524" data-role="admin">Kim</li>
    */
  </script>
</body>
</html>

์Šคํƒ€์ผ

์ธ๋ผ์ธ ์Šคํƒ€์ผ ์กฐ์ž‘

HTMLElement.prototype.style ํ”„๋กœํผํ‹ฐ๋Š” setter์™€ getter ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋กœ์„œ ์š”์†Œ ๋…ธ๋“œ์˜ ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์ทจ๋“/์ถ”๊ฐ€/๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
<body>
  <div style="color: red">Hello World</div>
  <script>
    const $div = document.querySelector('div');

    // ์ธ๋ผ์ธ ์Šคํƒ€์ผ ์ทจ๋“
    console.log($div.style); // CSSStyleDeclaration { 0: "color", ... }

    // ์ธ๋ผ์ธ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ
    $div.style.color = 'blue';

    // ์ธ๋ผ์ธ ์Šคํƒ€์ผ ์ถ”๊ฐ€
    $div.style.width = '100px';
    $div.style.height = '100px';
    $div.style.backgroundColor = 'yellow';
  </script>
</body>
</html>

 

style ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด CSSStyleDeclaration ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋Š” ๋‹ค์–‘ํ•œ CSS ํ”„๋กœํผํ‹ฐ์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ด ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ํ•ด๋‹น CSS ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ธ๋ผ์ธ ์Šคํƒ€์ผ๋กœ HTML ์š”์†Œ์— ์ถ”๊ฐ€/๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. 

 

CSS ํ”„๋กœํผํ‹ฐ๋Š” ์ผ€๋ฐฅ ์ผ€์ด์Šค๋ฅผ ๋”ฐ๋ฅด๋Š” ๋ฐ˜๋ฉด, CSSStyleDeclaration ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋Š” ์นด๋ฉœ ์ผ€์ด์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

 

// CSS ํ”„๋กœํผํ‹ฐ
$div.style['background-color'] = 'yellow';

// CSSStypeDeclaration
$div.style.backgroundColor = 'yellow';

 

ํด๋ž˜์Šค ์กฐ์ž‘

.์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํด๋ž˜์Šค ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CSS class๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜ํ•œ ๋‹ค์Œ, HTML ์š”์†Œ์˜ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ HTML ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ, HTML ์š”์†Œ์˜ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์กฐ์ž‘ํ•˜๋ ค๋ฉด class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ๋Œ€์‘ํ•˜๋Š” ์š”์†Œ ๋…ธ๋“œ์˜ DOM ํ”„๋กœํผํ‹ฐ(className๊ณผ classList)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

className

Element.prototype.className ํ”„๋กœํผํ‹ฐ๋Š” setter์™€ getter ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋กœ์„œ HTML ์š”์†Œ์˜ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ์ทจ๋“/๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  • ์š”์†Œ ๋…ธ๋“œ์˜ className ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜
  • ์š”์†Œ ๋…ธ๋“œ์˜ className ํ”„๋กœํผํ‹ฐ์— ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•˜๋ฉด class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ํ• ๋‹นํ•œ ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝ
<!DOCTYPE html>
<html>
<head>
  <style>
    .box {
      width: 100px; height: 100px;
      background-color: antiquewhite;
    }
    .red { color: red; }
    .blue { color: blue; }
  </style>
</head>
<body>
  <div class="box red">Hello World</div>
  <script>
    const $box = document.querySelector('.box');

    // .box ์š”์†Œ์˜ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ์ทจ๋“
    console.log($box.className); // 'box red'

    // .box ์š”์†Œ์˜ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’ ์ค‘์—์„œ 'red'๋งŒ 'blue'๋กœ ๋ณ€๊ฒฝ
    $box.className = $box.className.replace('red', 'blue');
  </script>
</body>
</html>

 

์ด๋Ÿฌํ•œ className ํ”„๋กœํผํ‹ฐ๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฃจ๊ธฐ ๋ถˆํŽธํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

classList

Element.prototype.classList ํ”„๋กœํผํ‹ฐ๋Š” class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ DOMTokenList ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
<head>
  <style>
    .box {
      width: 100px; height: 100px;
      background-color: antiquewhite;
    }
    .red { color: red; }
    .blue { color: blue; }
  </style>
</head>
<body>
  <div class="box red">Hello World</div>
  <script>
    const $box = document.querySelector('.box');

    // .box ์š”์†Œ์˜ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ •๋ณด๋ฅผ ๋‹ด์€ DOMTokenList ๊ฐ์ฒด๋ฅผ ์ทจ๋“
    // classList๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” DOMTokenList ๊ฐ์ฒด๋Š” HTMLCollection๊ณผ NodeList์™€ ๊ฐ™์ด
    // ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ํ•˜๋Š” ์‚ด์•„ ์žˆ๋Š”(live) ๊ฐ์ฒด๋‹ค.
    console.log($box.classList);
    // DOMTokenList(2) [length: 2, value: "box blue", 0: "box", 1: "blue"]

    // .box ์š”์†Œ์˜ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’ ์ค‘์—์„œ 'red'๋งŒ 'blue'๋กœ ๋ณ€๊ฒฝ
    $box.classList.replace('red', 'blue');
  </script>
</body>
</html>

 

DOMTokenList ๊ฐ์ฒด๋Š” class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด๋กœ์„œ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ด๋ฉด์„œ ์ดํ„ฐ๋Ÿฌ๋ธ”์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, DOMTokenList ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์œ ์šฉํ•œ ๋ฉ”์„œ๋“œ๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

๋ฉ”์„œ๋“œ ์„ค๋ช…
add(...className) - ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ 1๊ฐœ ์ด์ƒ์˜ ๋ฌธ์ž์—ด์„ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์œผ๋กœ ์ถ”๊ฐ€
remove(...className) - ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ 1๊ฐœ ์ด์ƒ์˜ ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์—์„œ ์‚ญ์ œ
- ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ์—†๋‹ค๋ฉด ์—๋Ÿฌ ์—†์ด ๋ฌด์‹œ
item(index) - ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ index์— ํ•ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์—์„œ ๋ฐ˜ํ™˜
contain(...className) - ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ
replace(oldClassName, newClassName) - class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์—์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๋ฌธ์ž์—ด์„ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝ
toggle(className[,force] - class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์—์„œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ œ๊ฑฐ, ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ถ”๊ฐ€
- ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋˜๋Š” ์กฐ๊ฑด์‹์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ true๋ฉด class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ๊ฐ•์ œ๋กœ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•˜๊ณ , flase๋ฉด ๊ฐ•์ œ๋กœ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฌธ์ž์—ด์„ ์ œ๊ฑฐ

 

์š”์†Œ์— ์ ์šฉ๋˜์–ด ์žˆ๋Š” CSS ์Šคํƒ€์ผ ์ฐธ์กฐ

HTML ์š”์†Œ์— ์ ์šฉ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  CSS ์Šคํƒ€์ผ(์ธ๋ผ์ธ ์Šคํƒ€์ผ ํฌํ•จ)์„ ์ฐธ์กฐํ•ด์•ผ ํ•  ๊ฒฝ์šฐ getComputedStyle ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

window.getComputedStyle(element[,pseudo]) ๋ฉ”์„œ๋“œ

  • ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ์š”์†Œ ๋…ธ๋“œ์— ์ ์šฉ๋˜์–ด ์žˆ๋Š” ํ‰๊ฐ€๋œ ์Šคํƒ€์ผ์„ CSSStyleDeclaration ๊ฐ์ฒด์— ๋‹ด์•„ ๋ฐ˜ํ™˜
  • ํ‰๊ฐ€๋œ ์Šคํƒ€์ผ์ด๋ž€ ์š”์†Œ ๋…ธ๋“œ์— ์ ์šฉ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ์Šคํƒ€์ผ (๋งํฌ ์Šคํƒ€์ผ, ์ž„๋ฒ ๋”ฉ ์Šคํƒ€์ผ, ์ธ๋ผ์ธ ์Šคํƒ€์ผ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ ์šฉํ•œ ์Šคํƒ€์ผ, ์ƒ์†๋œ ์Šคํƒ€์ผ, ๊ธฐ๋ณธ ์Šคํƒ€์ผ ๋“ฑ)์ด ์กฐํ•ฉ๋˜์–ด ์ตœ์ข…์ ์œผ๋กœ ์ ์šฉ๋œ ์Šคํƒ€์ผ
  • ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ :after, :before ์™€ ๊ฐ™์€ ์˜์‚ฌ ์š”์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ (์˜ต์…˜)
<!DOCTYPE html>
<html>
<head>
  <style>
    body {
      color: red;
    }
    .box {
      width: 100px;
      height: 50px;
      background-color: cornsilk;
      border: 1px solid black;
    }
  </style>
</head>
<body>
  <div class="box">Box</div>
  <script>
    const $box = document.querySelector('.box');

    // .box ์š”์†Œ์— ์ ์šฉ๋œ ๋ชจ๋“  CSS ์Šคํƒ€์ผ์„ ๋‹ด๊ณ  ์žˆ๋Š” CSSStyleDeclaration ๊ฐ์ฒด๋ฅผ ์ทจ๋“
    const computedStyle = window.getComputedStyle($box);
    console.log(computedStyle); // CSSStyleDeclaration

    // ์ž„๋ฒ ๋”ฉ ์Šคํƒ€์ผ
    console.log(computedStyle.width); // 100px
    console.log(computedStyle.height); // 50px
    console.log(computedStyle.backgroundColor); // rgb(255, 248, 220)
    console.log(computedStyle.border); // 1px solid rgb(0, 0, 0)

    // ์ƒ์† ์Šคํƒ€์ผ(body -> .box)
    console.log(computedStyle.color); // rgb(255, 0, 0)

    // ๊ธฐ๋ณธ ์Šคํƒ€์ผ
    console.log(computedStyle.display); // block
    
    // ์˜์‚ฌ ์š”์†Œ :before์˜ ์Šคํƒ€์ผ์„ ์ทจ๋“ํ•œ๋‹ค.
    const computedStyleBefore = window.getComputedStyle($box, ':before');
    console.log(computedStyleBefore.content); // "Hello"
  </script>
</body>
</html>

[์ถœ์ฒ˜] ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive

https://wikibook.co.kr/mjs/

 

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ

269๊ฐœ์˜ ๊ทธ๋ฆผ๊ณผ ์›๋ฆฌ๋ฅผ ํŒŒํ—ค์น˜๋Š” ์„ค๋ช…์œผ๋กœ ‘์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ’๋ฅผ ์ดํ•ดํ•˜์ž! ์›นํŽ˜์ด์ง€์˜ ๋‹จ์ˆœํ•œ ๋ณด์กฐ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ œํ•œ์ ์ธ ์šฉ๋„๋กœ ํƒœ์–ด๋‚œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ณผ๋„

wikibook.co.kr