TIL - HTMLCollection vs NodeList

Naakiteยท2022๋…„ 2์›” 21์ผ

๐Ÿ“JavaScript

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

๐Ÿ“— ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

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

const $class= document.getElementsByClassName("A");
$class.forEach((ele) => {
   console.log(ele.textContent);
});

๊ทธ ๋‹น์‹œ์— ํ•œ์ฐธ์„ ๊ตฌ๊ธ€๋งํ•˜๋‹ค๊ฐ€, ์œ ์‚ฌ๋ฐฐ์—ด์ด๋ผ์„œ forEach๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ ๊นŒ์ง€๋งŒ, ์•Œ์•„๋‚ด๊ณ  ๋‹ค์Œ์„ ๊ธฐ์•ฝํ•˜๋ฉฐ ๋…ธ์…˜์— ์ ์–ด๋†“์•˜์—ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์˜ค๋Š˜ getElementById, getElementsClassName, querySelector, querySelectorAll ์„ ๊นŠ๊ฒŒ ์ดํ•ดํ•˜์ง€ ์•Š๊ณ , ์“ฐ๊ณ  ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฝ๋‹ค๊ฐ€, ์ € ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ผ๋‹จ ๋จผ์ € HTMLCollection ๊ณผ NodeList ์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!


โœ… HTMLCollection , NodeList ๊ณตํ†ต์ 

HTMLCollection, NodeLists ๋Š” ๋‘˜๋‹ค ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด์ด๋‹ค. ์œ ์‚ฌ ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐ์—ด์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

โœ… HTMLCollection , NodeList ํŠน์ง•

HTMLCollection

getElementsByTagName, getElementsByClassName ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

๐Ÿ“Œ ์ฒซ๋ฒˆ์งธ ํŠน์ง•์€ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, class ๊ฐ’์ด fruit์ธ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•ด์„œ class ์ด๋ฆ„์„ red๋กœ ๋ณ€๊ฒฝํ•ด๋ณด์ž.

    <li class="fruit">Apple</li>
    <li class="fruit">Banana</li>
    <li class="fruit">Orange</li>
   const $elems = document.getElementsByClassName('fruit');
   for (let i=0; i< $elems.length; i++) 
   {
     $elems[i].className = 'red'; 
   }

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด class ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋  ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๋‘๋ฒˆ์งธ li ์š”์†Œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ li์š”์†Œ๋“ค์˜ class ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋œ๋‹ค.
๊ทธ ์ด์œ ๋Š” ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ณ€ํ™”๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ฒœ์ฒœํžˆ ์‚ดํŽด๋ณด๋ฉด ๋จผ์ €,
(i == 0 ) ์ฒซ๋ฒˆ์งธ li์š”์†Œ์˜ ๊ฐ’์€ 'red'๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.
(i == 1 ) ๊ทธ๋Ÿผ ์ฒซ๋ฒˆ์งธ ์š”์†Œ์˜ class ์ด๋ฆ„์ด red๋กœ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์—,
์ฒซ๋ฒˆ์งธ ์š”์†Œ๋Š” ๊ฐ์ฒด์—์„œ ์ œ๊ฑฐ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ธ๋ฑ์Šค ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ฒŒ ๋˜๊ณ , ์›๋ž˜๋Š”
๋‘๋ฒˆ์งธ ์š”์†Œ์ธ Banana์˜ class ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ, ์ฒซ๋ฒˆ์งธ ์š”์†Œ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด์„œ, ๋‘๋ฒˆ์งธ ์š”์†Œ๊ฐ€ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋กœ ๋ณ€๊ฒฝ๋˜๊ณ , ์„ธ๋ฒˆ์งธ ์š”์†Œ๊ฐ€ ๋‘๋ฒˆ์งธ ์š”์†Œ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด์„œ, ์„ธ๋ฒˆ์งธ ์š”์†Œ์ธ Orange์˜ class ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋œ๋‹ค.
(i == 2) Apple, Orange์˜ class ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๋ฉด์„œ, $elems ์•ˆ์—๋Š” Banana ์š”์†Œ๋งŒ ๋“ค์–ด์žˆ๋‹ค. $elems.length < i ๊ฐ€ ๋˜๋ฉด์„œ, for๋ฌธ์€ ์ข…๋ฃŒ๋œ๋‹ค.

๐Ÿ“Œ ๋‘๋ฒˆ์งธ ํŠน์ง•์€ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‚ด๊ฐ€ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ด์œ ๋ฅผ ์ฐพ์ง€๋ชปํ•œ ์—๋Ÿฌ์˜ ์›์ธ์ด๊ธฐ๋„ ํ•˜๋‹ค.

const $class= document.getElementsByClassName("A");
$class.forEach((ele) => {
   console.log(ele.textContent);
});

๋‚˜๋Š” $class ๋ฅผ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ forEach๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ• ๋ ค๊ณ  ํ–ˆ์ง€๋งŒ, $class ๋Š” ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ด๊ณ , ์ผ๋ถ€ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, HTMLCollection ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ์—๋Š” forEach ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๋˜ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ?

  1. Array Destructuring ์‚ฌ์šฉ
const $class= document.getElementsByClassName("A");
[...$class].forEach((ele) => {
   console.log(ele.textContent);
});
  1. Array.from ์‚ฌ์šฉ
const $class= document.getElementsByClassName("A");
Array.from($class).forEach((ele) => {
   console.log(ele.textContent);
});

NodeList

querySelectorAll ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

๐Ÿ“Œ ์ฒซ๋ฒˆ์งธ ํŠน์ง•์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋ฐ˜์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ“Œ ๋‘๋ฒˆ์งธ ํŠน์ง•์€ HTMLCollection ์ฒ˜๋Ÿผ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

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


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

profile
๐Ÿ‘ฉโ€๐Ÿ’ป๐Ÿƒโ€โ™€๏ธ

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