DOM(Document Object Model)

JOY๐ŸŒฑยท2023๋…„ 2์›” 10์ผ
0

๐ŸŒย JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
7/12
post-thumbnail

๐Ÿ’โ€โ™€๏ธ DOM(Document Object Model)์ด๋ž€,
HTML ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ DOM API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ ์ƒ์„ฑ ๋œ DOM์„ ๋™์ ์œผ๋กœ ์กฐ์ž‘ ๊ฐ€๋Šฅ

๐Ÿ’โ€โ™€๏ธ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง(browser rendering)์ด๋ž€,
๋ธŒ๋ผ์šฐ์ €๋Š” HTML, CSS, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑ ๋œ ํ…์ŠคํŠธ ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง


๐Ÿ’โ€โ™€๏ธ ํŒŒ์‹ฑ(parsing)์ด๋ž€,
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๋ฌธ๋ฒ•์— ๋งž๊ฒŒ ์ž‘์„ฑ ๋œ ํ…์ŠคํŠธ ๋ฌธ์„œ๋ฅผ ์ฝ์–ด ๋“ค์—ฌ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ…์ŠคํŠธ ๋ฌธ์„œ์˜ ๋ฌธ์ž์—ด์„ ํ† ํฐ์œผ๋กœ ๋ถ„ํ•ดํ•˜๊ณ , ํ† ํฐ์— ๋ฌธ๋ฒ•์  ์˜๋ฏธ์™€ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ์ž๋ฃŒ ๊ตฌ์กฐ์ธ ํŒŒ์Šค ํŠธ๋ฆฌ(parse tree)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •


๐Ÿ’โ€โ™€๏ธ ๋ Œ๋”๋ง(rendering)์ด๋ž€,
HTML, CSS, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑ ๋œ ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ์‹œ๊ฐ์ ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๋ฌธ๋ฒ•์— ๋งž๊ฒŒ ์ž‘์„ฑ ๋œ ํ…์ŠคํŠธ ๋ฌธ์„œ๋ฅผ ์ฝ์–ด ๋“ค์—ฌ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ…์ŠคํŠธ ๋ฌธ์„œ์˜ ๋ฌธ์ž์—ด์„ ํ† ํฐ์œผ๋กœ ๋ถ„ํ•ดํ•˜๊ณ , ํ† ํฐ์— ๋ฌธ๋ฒ•์  ์˜๋ฏธ์™€ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ์ž๋ฃŒ ๊ตฌ์กฐ์ธ ํŒŒ์Šค ํŠธ๋ฆฌ(parse tree)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •


๐Ÿ‘€ ๋…ธ๋“œ ์ทจ๋“

Github

๐Ÿ’โ€โ™€๏ธ ๋…ธ๋“œ(node)๋ž€,
HTML ์š”์†Œ๋Š” ๋ Œ๋”๋ง ์—”์ง„์— ์˜ํ•ด ํŒŒ์‹ฑ๋˜์–ด DOM์„ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ ๋…ธ๋“œ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜. ์ด๋•Œ HTML ์š”์†Œ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ๋กœ, HTML ์š”์†Œ์˜ ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ๋Š” ํ…์ŠคํŠธ ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜.

1) ๋…ธ๋“œ ์ทจ๋“

[1] id๋ฅผ ์ด์šฉ

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

[2] ํƒœ๊ทธ ์ด๋ฆ„์„ ์ด์šฉ

Document.prototype.getElementsByTagName
Element.prototype.getElementsByTagName
์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ํƒœ๊ทธ ์ด๋ฆ„์„ ๊ฐ–๋Š” ๋ชจ๋“  ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜

๐Ÿ“Œ Ref.
Array.from()

HTMLCollection์€ ๋ฐฐ์—ด์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉ X. 
'Array.from()'๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋ฐฐ์—ด ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

[3] class๋ฅผ ์ด์šฉ

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

  • ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  class ๊ฐ’์€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ class์ง€์ • ๊ฐ€๋Šฅ
  • ํ•ด๋‹น class๋ฅผ ๊ฐ–๋Š” ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋นˆ HTMLCollection ๊ฐ์ฒด ๋ฐ˜ํ™˜

[4] CSS ์„ ํƒ์ž๋ฅผ ์ด์šฉ

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

  • CSS ์„ ํƒ์ž๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” ์š”์†Œ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ null ๋ฐ˜ํ™˜

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

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์†Œ ๋…ธ๋“œ ๊ฐ์ฒด๋ฅผ ๊ฐ–๋Š” DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์ธ NodeList ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • NodeList - ์œ ์‚ฌ ๋ฐฐ์—ด, ์ดํ„ฐ๋Ÿฌ๋ธ”(์ˆœํšŒ ๊ฐ€๋Šฅ) ๐Ÿ‘‰ forEach ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • CSS ์„ ํƒ์ž๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋นˆ NodeList ๊ฐ์ฒด ๋ฐ˜ํ™˜

1) HTMLCollection๊ณผ NodeList

๐Ÿ’โ€โ™€๏ธ HTMLCollection๊ณผ NodeList๋ž€,
DOM API๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด

  • ๋‘˜ ๋‹ค ์œ ์‚ฌ ๊ฐ์ฒด ๋ฐฐ์—ด ๋ฐ ์ดํ„ฐ๋Ÿฌ๋ธ”(์ˆœํšŒ ๊ฐ€๋Šฅ)

[1] HTMLCollection

  • getElementsByClassName, getElementsByTagName ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด
  • ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ํ•˜๋Š” ์‚ด์•„์žˆ๋Š”(live) DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด
  • Live DOM์˜ ๊ฒฝ์šฐ for๋ฌธ ์ˆœํšŒ๋กœ ๋…ธ๋“œ ๊ฐ์ฒด ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ์ฃผ์˜ ํ•„์š” (์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ X) ๐Ÿ‘‰ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํšŒํ”ผ ๋ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ์—ญ์ˆœ์œผ๋กœ ์ˆœํšŒ
    • while๋ฌธ ์‚ฌ์šฉ
    • HTMLCollection ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ (๊ฐ€์žฅ ๊ถŒ์žฅ)

[2] NodeList

  • querySelectorAll ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด
  • ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ธฐ(non-live) ๋•Œ๋ฌธ์— HTMLCollection์˜ ๋ถ€์ž‘์šฉ์„ ํ•ด๊ฒฐ
  • NodeList.prototype.forEach ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๐Ÿ˜ˆ Warning
๋Œ€๋ถ€๋ถ„์˜ NoeList๋Š” non-live๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ childNodes ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” NodeList ๊ฐ์ฒด๋Š” live๊ฐ์ฒด๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ ์ฃผ์˜ ํ•„์š”


๐Ÿ‘€ ๋…ธ๋“œ ํƒ์ƒ‰

Github

๐Ÿ“Œ Ref.
๊ณต๋ฐฑ ํ…์ŠคํŠธ ๋…ธ๋“œ

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

1) ์ž์‹ ๋…ธ๋“œ

[1] ํƒ์ƒ‰

Node.prototype.childNodes ์ž์‹ ๋…ธ๋“œ(์š”์†Œ๋…ธ๋“œ, ํ…์ŠคํŠธ๋…ธ๋“œ)๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ NodeList์— ๋‹ด์•„ ๋ฐ˜ํ™˜
Node.prototype.firstChild ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ(์š”์†Œ๋…ธ๋“œ, ํ…์ŠคํŠธ๋…ธ๋“œ) ๋ฐ˜ํ™˜
Node.prototype.lastChild ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ(์š”์†Œ๋…ธ๋“œ, ํ…์ŠคํŠธ๋…ธ๋“œ) ๋ฐ˜ํ™˜
Element.prototype.children ์ž์‹ ๋…ธ๋“œ ์ค‘ ์š”์†Œ ๋…ธ๋“œ๋งŒ ํƒ์ƒ‰ํ•˜์—ฌ HTMLCollection์— ๋‹ด์•„ ๋ฐ˜ํ™˜
Element.prototype.firstElementChild ์ฒซ ๋ฒˆ์งธ ์ž์‹ ์š”์†Œ ๋…ธ๋“œ ๋ฐ˜ํ™˜
Element.prototype.lastElementChild ๋‘ ๋ฒˆ์งธ ์ž์‹ ์š”์†Œ ๋…ธ๋“œ ๋ฐ˜ํ™˜

[1] ์กด์žฌ ํ™•์ธ

Node.prototype.hasChildNodes
ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ž์‹ ๋…ธ๋“œ์˜ ์กด์žฌ๋ฅผ ํ™•์ธ

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

Node.prototype.parentNode

  • ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” DOM ํŠธ๋ฆฌ์˜ ์ตœ์ข…๋‹จ ๋…ธ๋“œ์ธ ๋ฆฌํ”„ ๋…ธํŠธ(leaf node)์ด๋ฏ€๋กœ ๋ถ€๋ชจ๊ฐ€ ํ…์ŠคํŠธ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ๋Š” X

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

Node.prototype.previousSibling ํ˜•์ œ ๋…ธ๋“œ ์ค‘ ์ž์‹ ์˜ ์ด์ „ ํ˜•์ œ ๋…ธ๋“œ(์š”์†Œ๋…ธ๋“œ, ํ…์ŠคํŠธ๋…ธ๋“œ) ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜
Node.prototype.nextSibling ํ˜•์ œ ๋…ธ๋“œ ์ค‘ ์ž์‹ ์˜ ๋‹ค์Œ ํ˜•์ œ ๋…ธ๋“œ(์š”์†Œ๋…ธ๋“œ, ํ…์ŠคํŠธ๋…ธ๋“œ) ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜
Element.prototype.previousElementSibling ํ˜•์ œ ์š”์†Œ ๋…ธ๋“œ ์ค‘ ์ž์‹ ์˜ ์ด์ „ ํ˜•์ œ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜
Element.prototype.nextElementSibling ํ˜•์ œ ์š”์†Œ ๋…ธ๋“œ ์ค‘ ์ž์‹ ์˜ ๋‹ค์Œ ํ˜•์ œ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜


๐Ÿ‘€ ๋…ธ๋“œ ํ”„๋กœํผํ‹ฐ

Github

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

Node.prototype.nodeType : ๋…ธ๋“œ ๊ฐ์ฒด ์ข…๋ฅ˜, ์ฆ‰ ๋…ธ๋“œ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒ์ˆ˜ ๋ฐ˜ํ™˜
Node.prototype.nodeName : ๋…ธ๋“œ์˜ ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜

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

๐Ÿ’โ€โ™€๏ธ nodeValue๋ž€,
setter์™€ getter๊ฐ€ ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ
Node.prototype.nodeValue

  • nodeValue ํ”„๋กœํผํ‹ฐ ์ฐธ์กฐ ์‹œ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ๊ฐ’(ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ)์„ ๋ฐ˜ํ™˜
  • ํ…์ŠคํŠธ ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ(๋ฌธ์„œ๋…ธ๋“œ, ์š”์†Œ๋…ธ๋“œ)์˜ ๊ฒฝ์šฐ null์„ ๋ฐ˜ํ™˜
  • ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ nodeValue ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ ๊ฐ’ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

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

  • ์š”์†Œ ๋…ธ๋“œ์˜ textContent ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์š”์†Œ ๋…ธ๋“œ์˜ ์ฝ˜ํ…์ธ  ์˜์—ญ ๋‚ด์˜ ํ…์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ๋ฐ˜ํ™˜ (์ด ๋•Œ HTML ๋งˆํฌ์—…์€ ๋ฌด์‹œ)
  • ์š”์†Œ ๋…ธ๋“œ์˜ textContent ํ”„๋กœํผํ‹ฐ์— ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•˜๋ฉด ์š”์†Œ ๋…ธ๋“œ์˜ ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ํ• ๋‹นํ•œ ๋ฌธ์ž์—ด์ด ํ…์ŠคํŠธ๋กœ ์ถ”๊ฐ€ (์ด ๋•Œ๋„ HTML ๋งˆํฌ์—…์€ ๋ฌด์‹œ๋˜๊ณ  ๋ฌธ์ž์—ด ํ…์ŠคํŠธ๋กœ ์ทจ๊ธ‰)
  • NodeValue๋ณด๋‹ค ๋” ๊ฐ„ํŽธ

๐Ÿ‘€ ๋…ธ๋“œ ์ˆ˜์ •

Github

1) innerHTML

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

  • ํƒœ๊ทธ ์—˜๋ฆฌ๋จผํŠธ์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜, ๋ณ€๊ฒฝํ•  ๋•Œ innerHTML์†์„ฑ์„ ์‚ฌ์šฉ
  • ๊ธฐ์กด์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กญ๊ฒŒ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ DOM์—
    ๋ฐ˜์˜ํ•˜๋Š” ๋น„ํšจ์œจ์  ๋™์ž‘. (insertAdjacentHTML ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ )
  • ์žฅ์ 
    • ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ 
  • ๋‹จ์ 
    • ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ innerHTML ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ XSS(Cross-site Scripting Attacks)์— ์ทจ์•ฝํ•˜๋ฏ€๋กœ ์œ„ํ—˜

2) insertAdjacentHTML

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

  • ์ฒซ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด์€ beforebegin, afterbegin, beforeend, afterend์˜ 4๊ฐ€์ง€
  • insertAdjacentHTML ๋ฉ”์†Œ๋“œ๋Š” ๊ธฐ์กด ์š”์†Œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ƒˆ๋กญ๊ฒŒ ์‚ฝ์ž…๋  ์š”์†Œ๋งŒ์„ ํŒŒ์‹ฑํ•˜์—ฌ ์ž์‹ ์š”์†Œ๋กœ ์ถ”๊ฐ€

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

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

4) ๋…ธ๋“œ ์‚ฝ์ž…๊ณผ ์ด๋™

Node.prototype.appendChild(childNode)
: ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์€ ๋…ธ๋“œ๋ฅผ appendChild ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋…ธ๋“œ์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
Node.prototype.insertBefore(newNode, childNode)
: ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์€ ๋…ธ๋“œ๋ฅผ ๋‘ ๋ฒˆ์žฌ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋…ธ๋“œ ์•ž์— ์‚ฝ์ž…. ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์€ ๋…ธ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ insertBefore๋ฅผ ํ˜ธ์ถœํ•œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ์—ฌ์•ผํ•จ.

5) ๋…ธ๋“œ ๋ณต์‚ฌ, ๊ต์ฒด ๋ฐ ์‚ญ์ œ

[1] ๋…ธ๋“œ ๋ณต์‚ฌ

Node.prototype.cloneNode([deep: true | false]) ๋ฉ”์†Œ๋“œ๋Š” ๋…ธ๋“œ์˜ ์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜

  • ๋งค๊ฐœ๋ณ€์ˆ˜ deep์— true๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด ๋…ธ๋“œ๋ฅผ ๊นŠ์€ ๋ณต์‚ฌํ•˜์—ฌ ๋ชจ๋“  ์ž์† ๋…ธ๋“œ๊ฐ€ ํฌํ•จ๋œ ์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•˜๊ณ , false๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ƒ๋žตํ•˜๋ฉด ๋…ธ๋“œ๋ฅผ ์–•์€ ๋ณต์‚ฌํ•˜์—ฌ ๋…ธ๋“œ ์ž์‹ ๋งŒ์˜ ์‚ฌ๋ณธ์„ ์ƒ์„ฑ

[2] ๋…ธ๋“œ ๊ต์ฒด

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

[3] ๋…ธ๋“œ ์‚ญ์ œ

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


๐Ÿ‘€ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

Github

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

Element.prototype.attribute ํ”„๋กœํผํ‹ฐ๋กœ ๋ชจ๋“  ์–ดํ”„ํ‹ฐ๋ทฐํŠธ ๋…ธ๋“œ๋ฅผ ์ทจ๋“ ๊ฐ€๋Šฅ

  • attributes ํ”„๋กœํผํ‹ฐ๋Š” getter๋งŒ ์กด์žฌํ•˜๋Š” ์ฝ๊ธฐ ์ „์šฉ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋กœ NamedNodeMap ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • Element.prototype.getAttribute/setAttribute ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด attributesํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•˜์ง€ ์•Š๊ณ  ์š”์†Œ ๋…ธ๋“œ์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ง์ ‘ HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ์ทจ๋“ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด ํŽธ๋ฆฌ
  • Element.prototype.hasAttribute(attributeName) ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅ
  • Element.prototype.removeAttribute(attributeName) ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์‚ญ์ œ ๊ฐ€๋Šฅ

2) HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ DOM ํ”„๋กœํผํ‹ฐ

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

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

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

  • data ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” data- ์ ‘๋‘์‚ฌ ๋‹ค์Œ์— ์ž„์˜์˜ ์ด๋ฆ„์„ ๋ถ™์—ฌ ์‚ฌ์šฉ
  • HTMLElement.dataset ํ”„๋กœํผํ‹ฐ๋กœ DOMStringMap ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์œผ๋ฉด ์ž„์˜์˜ ์ด๋ฆ„์„ ์นด๋ฉœ ์ผ€์ด์Šค๋กœ ๋ณ€ํ™˜ํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

๐Ÿ‘€ ์Šคํƒ€์ผ

Github

1) inline style

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

2) className๊ณผ classList

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


profile
Tiny little habits make me

0๊ฐœ์˜ ๋Œ“๊ธ€