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 ์์๊ฐ ํ๋์์ผ๋ก ๋๋๋ง์ด ๋ ๊ฒ ๊ฐ์ง๋ง ๊ทธ๋ ์ง ์๋ค. ๊ฒฐ๊ณผ๋ ์๋์ ์ฌ์ง๊ณผ ๊ฐ๋ค.
์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋๋ ์ด์ ๋ฅผ ์์๋ณด์.
์ฒซ ๋ฒ์งธ ๋ฐ๋ณต๋ฌธ(i === 0) ์ฒซ ๋ฒ์งธ li ์์์ fruit ํด๋์ค๊ฐ blue ํด๋์ค๋ก ๋ณ๊ฒฝ๋๋ค. ์ด๋ ๋ ์ด์ $fruit์์ ํด๋น ๋
ธ๋ ์์๋ ์ค์๊ฐ์ผ๋ก ์ ๊ฑฐ๋๋ค. ์ด์ฒ๋ผ HTMLCollection ๊ฐ์ฒด๋ ์ค์๊ฐ์ผ๋ก ๋
ธ๋ ๊ฐ์ฒด์ ์ํ ๋ณ๊ฒฝ์ ๋ฐ์ํ๋ ์ด์ ์๋(live) DOM ์ปฌ๋ ์
๊ฐ์ฒด์ด๋ค.
๋ ๋ฒ์ฌ ๋ฐ๋ณต๋ฌธ(i === 1) ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต์์ ์ฒซ ๋ฒ์งธ li ์์๋ $fruit์์ ์ ๊ฑฐ๋์๋ค. ๋ฐ๋ผ์ $fruit[i]๋ ์ธ ๋ฒ์งธ li ์์์ด๋ค. ์ฆ orange๋ฅผ ํฌํจํ li ์์์ ํด๋์ค๊ฐ blue๋ก ๋ณ๊ฒฝ๋๋ค.
์ธ ๋ฒ์งธ ๋ฐ๋ณต๋ฌธ(i === 2) ํ์ฌ $fruit ๊ฐ์ฒด์ 2๊ฐ์ ์์๊ฐ ์๋ค. ์ฆ ์ธ๋ฑ์ค๊ฐ 2์ธ ์์๋ ์์ผ๋ฏ๋ก false๊ฐ ๋์ด ๋ฐ๋ณต์ด ์ข
๋ฃ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
์๋๋ ๊ฐ์ฅ ์ข์ ํด๊ฒฐ์ฑ
์ด๋ค. ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ด๋ฉด์ ์ดํฐ๋ฌ๋ธ์ธ HTMLCollection ๊ฐ์ฒด๋ฅผ ๋ฐฐ์ด๋ก ๋ณํํ์ฌ ํด๊ฒฐํ๋ค.
HTMLCollection ๊ฐ์ฒด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด querySelectorAll ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๋ค. querySelectorAll ๋ฉ์๋๋ DOM ์ปฌ๋ ์
๊ฐ์ฒด์ธ NodeList ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ์ด ๊ฐ์ฒด๋ ์ค์๊ฐ์ผ๋ก ๋
ธ๋ ๊ฐ์ฒด์ ์ํ ๋ณ๊ฒฝ์ ๋ฐ์ํ์ง ์๋(non-live) ๊ฐ์ฒด์ด๋ค.
NodeList ๊ฐ์ฒด๋ NodeList.prototype.forEach ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ ์ ์๋ ํธ๋ฆฌํจ์ด ์๋ค.
์ด๋ ๊ฒ NodeList ๊ฐ์ฒด๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋
ธ๋ ๊ฐ์ฒด์ ์ํ ๋ณ๊ฒฝ์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ํ๊ธฐ ์๊ณ ๊ณผ๊ฑฐ์ ์ ์ ์ํ๋ฅผ ์ ์งํ๋ non-live ๊ฐ์ฒด๋ก ๋์ํ๋ค.
ํ์ง๋ง, ๊ทธ๋๋ HTMLCollection ๊ฐ์ฒด๋ NodeList ๊ฐ์ฒด๋ ๋ฐฐ์ด๋ก ๋ณํํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
HTMLCollection ๊ฐ์ฒด์ NodeList ๊ฐ์ฒด๋ ๋ชจ๋ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ด๋ฉด์ ์ดํฐ๋ฌ๋ธํ๊ธฐ ๋๋ฌธ์ ์คํ๋ ๋ ๋ฌธ๋ฒ์ด๋ Array.from ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ๋ฐฐ์ด๋ก ๋ณํํ ์ ์๋ค.
๊ณผ๊ฑฐ ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์น ๊ฐ๋ฐ ๊ณต๋ถ๋ฅผ ํ ๋ ๋งํ๋ ๋ถ๋ถ ์ค ํ๋๊ฐ ๋ฐ๋ก HTMLCollection ๊ฐ์ฒด์ NodeList ๊ฐ์ฒด์๋ค. ๊ทธ ๋ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด, ์ดํฐ๋ฌ๋ธ์ด๋ผ๋ ๊ฐ๋
์ ์ ์์ง ๋ชปํ๊ณ ๋ํ ๋ฐฐ์ด, ๋ฐฐ์ด ๋ฉ์๋์ ๋ํด์๋ ๊น๊ฒ ์์ง ๋ชปํ์ฌ ์ด๋ป๊ฒ ํ์ฉ์ ํ ์ง ๊ฐ์ด ์กํ์ง ์์์์๋ค. ํ์ง๋ง ์ง๊ธ์ ์ฌ๋ฌ๊ฐ์ ์์ ๋
ธ๋๋ฅผ ๊ด๋ฆฌํด์ผ ํ ์ํฉ์ด ์จ๋ค๋ฉด ์ด๋ ค์, ๊ฑฑ์ ์์ด ์ ํด๊ฒฐํด ๋๊ฐ ์ ์๋ ์์ ๊ฐ์ด ๋ ๋ค.
๋์ - ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive: ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ณธ ๊ฐ๋
๊ณผ ๋์ ์๋ฆฌ
๐
2022-10-11