HTMLCollection๊ณผ NodeList

1. ๊ฐœ์š”

DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์ธ HTMLCollection๊ณผ NodeList๋Š” DOM API๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด๋‹ค. HTMLCollection๊ณผ NodeList ์–ด๋–ค ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์„๊นŒ?

๊ณต๋™์ ์œผ๋กœ ๋‘˜ ๋‹ค ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ด๋ฉด์„œ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— for...of ๋ฌธ์œผ๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


2. HTMLCollection

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

์‚ด์•„ ์žˆ๋Š”(live) ์ด๋ž€ ๋œป์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์˜ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

<!DOCTYPE html>
<html lang="en">
  <head>
    <style>
      .blue {
        color: blue;
      }
    </style>
  </head>
  <body>
    <ul>
      <li class="fruit">apple</li>
      <li class="fruit">banana</li>
      <li class="fruit">orange</li>
    </ul>
    <script>
      const $fruit = document.getElementsByClassName("fruit");
      for (let i = 0; i < $fruit.length; i++) {
        $fruit[i].className = "blue";
      }
    </script>
  </body>
</html>

์œ„์˜ ๊ฒฐ๊ณผ๋Š” ์–ด๋–ป๊ฒŒ ์˜ˆ์ƒ์ด ๋˜๋Š”๊ฐ€? ๋ชจ๋“  li ์š”์†Œ๊ฐ€ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ๋žœ๋”๋ง์ด ๋  ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์˜ ์‚ฌ์ง„๊ณผ ๊ฐ™๋‹ค.

HTMLCollection rendering

์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ์ด์œ ๋ฅผ ์•Œ์•„๋ณด์ž.

  1. ์ฒซ ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ(i === 0) ์ฒซ ๋ฒˆ์งธ li ์š”์†Œ์— fruit ํด๋ž˜์Šค๊ฐ€ blue ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค. ์ด๋•Œ ๋” ์ด์ƒ $fruit์—์„œ ํ•ด๋‹น ๋…ธ๋“œ ์š”์†Œ๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ œ๊ฑฐ๋œ๋‹ค. ์ด์ฒ˜๋Ÿผ HTMLCollection ๊ฐ์ฒด๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋ฐ˜์˜ํ•˜๋Š” ์‚ด์•„ ์žˆ๋Š”(live) DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์ด๋‹ค.

  2. ๋‘ ๋ฒˆ์žฌ ๋ฐ˜๋ณต๋ฌธ(i === 1) ์ฒซ ๋ฒˆ์งธ ๋ฐ˜๋ณต์—์„œ ์ฒซ ๋ฒˆ์งธ li ์š”์†Œ๋Š” $fruit์—์„œ ์ œ๊ฑฐ๋˜์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ $fruit[i]๋Š” ์„ธ ๋ฒˆ์งธ li ์š”์†Œ์ด๋‹ค. ์ฆ‰ orange๋ฅผ ํฌํ•จํ•œ li ์š”์†Œ์˜ ํด๋ž˜์Šค๊ฐ€ blue๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

  3. ์„ธ ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ(i === 2) ํ˜„์žฌ $fruit ๊ฐ์ฒด์—” 2๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค. ์ฆ‰ ์ธ๋ฑ์Šค๊ฐ€ 2์ธ ์š”์†Œ๋Š” ์—†์œผ๋ฏ€๋กœ false๊ฐ€ ๋˜์–ด ๋ฐ˜๋ณต์ด ์ข…๋ฃŒ๋œ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

<script>
  const $fruit = document.getElementsByClassName("fruit");
  for (let i = 0; i < $fruit.length; i++) {
    $fruit[i].className = "fruit blue";
  }
</script>
<script>
  const $fruit = document.getElementsByClassName("fruit");
  while ($fruit.length > 0) {
    $fruit[0].className = "blue";
  }
</script>

์•„๋ž˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด๋‹ค. ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ด๋ฉด์„œ ์ดํ„ฐ๋Ÿฌ๋ธ”์ธ HTMLCollection ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ•ด๊ฒฐํ•œ๋‹ค.

<script>
  const $fruit = document.getElementsByClassName("fruit");
  [...$fruit].forEach((item) => (item.className = "blue"));
</script>

3. NodeList

HTMLCollection ๊ฐ์ฒด์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด querySelectorAll ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. querySelectorAll ๋ฉ”์„œ๋“œ๋Š” DOM ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์ธ NodeList ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๊ฐ์ฒด๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋ฐ˜์˜ํ•˜์ง€ ์•Š๋Š”(non-live) ๊ฐ์ฒด์ด๋‹ค.

<!DOCTYPE html>
<html lang="en">
  <head>
    <style>
      .blue {
        color: blue;
      }
    </style>
  </head>
  <body>
    <ul>
      <li class="fruit">apple</li>
      <li class="fruit">banana</li>
      <li class="fruit">orange</li>
    </ul>
    <script>
      const $fruit = document.querySelectorAll(".fruit");
      $fruit.forEach((item) => (item.className = "blue"));
    </script>
  </body>
</html>

NodeList ๊ฐ์ฒด๋Š” NodeList.prototype.forEach ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ๋ฆฌํ•จ์ด ์žˆ๋‹ค.

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

ํ•˜์ง€๋งŒ, ๊ทธ๋ž˜๋„ HTMLCollection ๊ฐ์ฒด๋“  NodeList ๊ฐ์ฒด๋“  ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

HTMLCollection ๊ฐ์ฒด์™€ NodeList ๊ฐ์ฒด๋Š” ๋ชจ๋‘ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ด๋ฉด์„œ ์ดํ„ฐ๋Ÿฌ๋ธ”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์ด๋‚˜ Array.from ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


4. Conclusion

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


์ฐธ๊ณ 

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


๐Ÿ“… 2022-10-11

Last updated