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

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

39.6 DOM ์กฐ์ž‘

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

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

39.6.1 innerHTML

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

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

    <html>
      <body>
        <ul id="fruits">
          <li class="apple">Apple</li>
        </ul>
      </body>
      <script>
        const $fruits = document.getElementById("fruits");
    
        // ๋…ธ๋“œ ์ถ”๊ฐ€
        $fruits.innerHTML += '<li class="banana">Banana</li>';
    
        // ๋…ธ๋“œ ๊ต์ฒด
        $fruits.innerHTML = '<li class="orange">Orange</li>';
    
        // ๋…ธ๋“œ ์‚ญ์ œ
        $fruits.innerHTML = "";
      </script>
    </html>
  • innerHTML ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•œ DOM ์กฐ์ž‘์€ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด๋ผ๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ XSS(Cross Site Script) ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

39.6.2 insertAdjacentHTML ๋ฉ”์„œ๋“œ

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

  • <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>

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

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

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

       - ์š”์†Œ ๋…ธ๋“œ ์ƒ์„ฑ
       - ํ…์ŠคํŠธ ๋…ธ๋“œ ์ƒ์„ฑ
       - ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
       - ์š”์†Œ ๋…ธ๋“œ๋ฅผ DOM์— ์ถ”๊ฐ€
      <html>
        <body>
          <ul id="fruits">
            <li>Apple</li>
            <!-- <li>Banana</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>

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

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

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

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

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

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

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

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

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

<html>
  <body>
    <ul id="fruits">
      <li>Apple</li>
      <li>Banana</li>
    </ul>
  </body>
  <script>
    // ์š”์†Œ ๋…ธ๋“œ ์ƒ์„ฑ
    const $li = document.createElement("li");

    // ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ $li ์š”์†Œ ๋…ธ๋“œ์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
    $li.appendChild(document.createTextNode("Orange"));

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

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

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

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

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

    // ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ $li ์š”์†Œ ๋…ธ๋“œ์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
    $li.appendChild(document.createTextNode("Orange"));

    // $li ์š”์†Œ ๋…ธ๋“œ๋ฅผ #fruits ์š”์†Œ ๋…ธ๋“œ์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ์š”์†Œ ์•ž์— ์‚ฝ์ž…
    $fruits.insertBefore($li, $fruits.lastElementChild);
    // Apple - Orange - Banana
  </script>
</html>

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

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

    <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>

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

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

<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>

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

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

<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>

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

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

<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>

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) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

<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
    </script>
  </body>
</html>

Last updated