39์žฅ DOM

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

39.5.1 nodeValue

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

  • ๋…ธ๋“œ ๊ฐ์ฒด์˜ nodeValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ๋…ธ๋“œ ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. element์ผ ๊ฒฝ์šฐ Null, Text๋…ธ๋“œ์ผ ๊ฒฝ์šฐ text ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

<html>
  <body>
    <div id="foo">Hello</div>
  </body>
  <script>
    // ๋ฌธ์„œ ๋…ธ๋“œ์˜ nodeValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
    console.log(document.nodeValue); // null

    // ์š”์†Œ ๋…ธ๋“œ์˜ nodeValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
    const $foo = document.getElementById("foo");
    console.log($foo.nodeValue); // null

    // ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ nodeValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
    const $textNode = $foo.firstChild;
    console.log($textNode.nodeValue); // Hello
  </script>
</html>

39.5.2 textContent

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

  • ์š”์†Œ ๋…ธ๋“œ์˜ textContent ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์š”์†Œ ๋…ธ๋“œ์˜ ์ฝ˜ํ…์ธ  ์˜์—ญ ๋‚ด์˜ ํ…์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

image

39.6 DOM ์กฐ์ž‘

  • DOM ์กฐ์ž‘์€ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ DOM์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ ๋˜๋Š” ๊ต์ฒดํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

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

39.6.1 innerHTML

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

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

  • innerHTML ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•œ DOM ์กฐ์ž‘์€ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด๋ผ๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ XSS(Cross Site Script) ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

39.6.2 insertAdjacentHTML ๋ฉ”์„œ๋“œ

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

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

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

    • ์•„๋ž˜์˜ ๊ณผ์ •์„ ํ†ตํ•ด์„œ ๋…ธ๋“œ์˜ ์ƒ์„ฑ๊ณผ ์ถ”๊ฐ€๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค. (์ถ”ํ›„ ์„ค๋ช… ์ถ”๊ฐ€ ์˜ˆ์ •)

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

  • DOM์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๊ฐ๊ฐ ๋ฆฌํ”Œ๋กœ์šฐ์™€ ๋ฆฌํŽ˜์ธํŒ…์„ ์•ผ๊ธฐ์‹œํ‚จ๋‹ค. ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋จผ์ € DocumentFragment ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  DOM์— ์ถ”๊ฐ€ํ•  ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ DocumentFragment ๋…ธ๋“œ์— ์ž์‹ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ, DocumentFragment ๋…ธ๋“œ๋ฅผ ๊ธฐ์กด DOM์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    • ์ด๋•Œ, ์‹ค์ œ๋กœ DOM ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์€ ํ•œ ๋ฒˆ๋ฟ์ด๋ฉฐ ๋ฆฌํ”Œ๋กœ์šฐ์™€ ๋ฆฌํŽ˜์ธํŠธ๋„ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•œ๋‹ค.

    • ๋”ฐ๋ผ์„œ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์†Œ ๋…ธ๋“œ๋ฅผ DOM์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ DocumentFragment ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๋‹ค.

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

๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€

  • Node.prototype.appendChild ๋ฉ”์„œ๋“œ๋Š” ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋…ธ๋“œ๋ฅผ ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ๋…ธ๋“œ์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ๋กœ DOM์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    • ๋‹จ, ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์œ„์น˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์—†๊ณ  ์–ธ์ œ๋‚˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ง€์ •ํ•œ ์œ„์น˜์— ๋…ธ๋“œ ์‚ฝ์ž…

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

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

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

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

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

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

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

39.6.9 ๋…ธ๋“œ ์‚ญ์ œ

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

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

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

  • HTML ๋ฌธ์„œ์˜ ๊ตฌ์„ฑ ์š”์†Œ์ธ HTML ์š”์†Œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

  • HTML ์š”์†Œ์˜ ๋™์ž‘์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • ๋Œ€๋ถ€๋ถ„์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ๋ชจ๋“  HTML ์š”์†Œ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, type, value, checked ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” input ์š”์†Œ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

  • HTML ๋ฌธ์„œ๊ฐ€ ํŒŒ์‹ฑ๋  ๋•Œ HTML ์š”์†Œ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜๋˜์–ด ์š”์†Œ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ๋‹ค.

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

  • HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋ ค๋ฉด Element.prototype.getAttribute(attributeName) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , HTML ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด Element.prototype.setAttribute(attributeName, attributeValue) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Last updated