์น ์ ํ๋ฆฌ์ผ์ด์ ์์ DOM์ ์กฐ์ํ๋ ์์ ์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ค. ์ต๊ทผ์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ DOM ์กฐ์์ ์ํ ์ฌ๋ฌ ๊ฐ์ง ํจํด์ ์๊ฐํ๋ ๊ธ์ ์ฝ์๋๋ฐ, ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด ๋ณด์๋ค.
1. ์์ ์จ๊ธฐ๊ธฐ/๋ณด์ด๊ธฐ ๋์ ์์ฑ/์ญ์ ํผํ๊ธฐ
DOM์์ ๋์ ์ผ๋ก ์์๋ฅผ ์์ฑํ๊ณ ์ญ์ ํ๋ ์์ ์ ์ฑ๋ฅ์ ๋ถ๋ด์ ์ค ์ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ฆฌ์คํธ ํญ๋ชฉ์ ๋์ ์ผ๋ก ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฒฝ์ฐ, ๋งค๋ฒ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ ๋ค์ ํ ๋น๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๋๋ฐ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด, ์์๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ถ๊ฐํ๋ ๋์ , ์ด๋ฏธ ์กด์ฌํ๋ ์์๋ฅผ ์จ๊ธฐ๊ฑฐ๋ ๋ณด์ด๊ฒ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ ํจ์ฌ ํจ์จ์ ์ด๋ค.
const el = document.querySelector('#element');
el.classList.add('show'); // ์์๋ฅผ ๋ณด์ด๊ฒ ํจ
el.style.display = 'none'; // ์์๋ฅผ ์จ๊น
์ด ๋ฐฉ๋ฒ์ DOM์ ๊ณ์ํด์ ์์ ํ์ง ์๊ณ , ๊ธฐ์กด์ ์์๋ฅผ ๋ณด์ฌ์ฃผ๊ฑฐ๋ ์จ๊ธฐ๋ ๋ฐฉ์์ผ๋ก ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์๋ค. ํนํ ๋ฆฌ์คํธ ํญ๋ชฉ์ฒ๋ผ ์์ฃผ ์ถ๊ฐ๋๊ณ ์ ๊ฑฐ๋๋ ์์๊ฐ ์์ ๋ ์ ์ฉํ๋ค.
2. textContent ์ฌ์ฉ
innerText์ textContent๋ ํ ์คํธ๋ฅผ ๋ค๋ฃฐ ๋ ์์ฃผ ์ฌ์ฉ๋๋๋ฐ, innerText๋ ์คํ์ผ ๊ณ์ฐ์ ํฌํจํ ๋ ๋๋ง์ ๊ณ ๋ คํ๋ฏ๋ก ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค. textContent๋ ์คํ์ผ์ ๊ณ ๋ คํ์ง ์๊ณ , ํ ์คํธ ๋ด์ฉ์ ๊ทธ๋๋ก ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ค.
const el = document.querySelector('#element');
el.textContent = '์๋ก์ด ํ
์คํธ';
3. insertAdjacentHTML ํ์ฉ
HTML์ ๋์ ์ผ๋ก ์ฝ์ ํ ๋, innerHTML๋ณด๋ค๋ insertAdjacentHTML์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ์ผ๋ก ํจ์ฌ ๋ ์ข๋ค. insertAdjacentHTML์ ๋ฌธ์์ด๋ก HTML์ ์ฝ์ ํ ์ ์๊ณ , ํด๋น ๋ฐฉ์์ DOM์ ๋ค์ ํ์ฑ ํ์ง ์์ผ๋ฏ๋ก ๋๋์ ์ฝํ ์ธ ๋ฅผ ์ฝ์ ํ ๋ ์ฑ๋ฅ์ ํฌ๊ฒ ๊ฐ์ ํ ์ ์๋ค.
const el = document.querySelector('#element');
el.insertAdjacentHTML('beforeend', '<div>์ถ๊ฐ๋ ๋ด์ฉ</div>');
4. ์ด๋ฒคํธ ์์ ์ฌ์ฉ
๋์ ์ผ๋ก ์์ฑ๋๋ ๋ง์ ์์์ ๋ํด ๊ฐ๋ณ์ ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๋์ , ์ด๋ฒคํธ ์์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ํจ์ฌ ์ ๋ฆฌํ๋ค. ์ด๋ฒคํธ ์์์ ๋ถ๋ชจ ์์์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ค์ ํ๊ณ , ์์ ์์์์ ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ๋ถ๋ชจ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ธ๋ฐ, ํด๋น ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๊ณ , ๊ฐ ์์๋ง๋ค ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ค์ ํ ํ์๊ฐ ์์ด์ ธ ์ฑ๋ฅ์ด ๊ฐ์ ๋๋ค.
const parent = document.querySelector('#parent');
parent.addEventListener('click', function(event) {
if (event.target && event.target.matches('button')) {
console.log('๋ฒํผ ํด๋ฆญ๋จ');
}
});
5. ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ ๋ฆฌ
์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ์์ฃผ ์ฌ์ฉ๋์ง๋ง, ์ด๋ฅผ ์ ๋๋ก ์ ๋ฆฌํ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๋ ์ฑ๋ฅ ์ ํ์ ์์ธ์ด ๋ ์ ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก removeEventListener๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ์ด๋ฒคํธ๋ฅผ ์ ๊ฑฐํ ์ ์๋ค.
function handleClick() {
console.log("Button was clicked!");
el.removeEventListener("click", handleClick); // ํด๋ฆญ ํ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ ๊ฑฐ
}
// ๋ฒํผ์ ํด๋ฆญ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ถ๊ฐ
const el = document.querySelector("#button");
el.addEventListener("click", handleClick);
๋ค๋ง, removeEventListener๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋, ํ ๋ฒ๋ง ํธ์ถ๋๋ ์ด๋ฒคํธ๋ฅผ ์ค์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ, once ์ต์ ์ ์ฌ์ฉํ๋ฉด, ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ํ ๋ฒ ํธ์ถ๋ ํ ์๋์ผ๋ก ์ ๊ฑฐ๋๋ค.
el.addEventListener('click', handleClick, {
once: true // ํด๋ฆญ์ด ๋ฐ์ํ๋ฉด ํ ๋ฒ๋ง ํธ์ถ๋๊ณ ์๋์ผ๋ก ์ ๊ฑฐ๋จ
});
ํด๋น ์ต์ ์ ์ฌ์ฉํ๋ฉด, ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ํ ๋ฒ๋ง ์คํ๋๊ณ ๊ทธ ํ ์๋์ผ๋ก ์ ๊ฑฐ๋๊ธฐ ๋๋ฌธ์, ์ด๋ฒคํธ๋ฅผ ํ ๋ฒ๋ง ์ฒ๋ฆฌํ๋ฉด ๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ฉด ๋งค์ฐ ์ ์ฉํ๋ค.
6. requestAnimationFrame๊ณผ setTimeout์ ์ ์ ํ ์ฌ์ฉ
์ ๋๋ฉ์ด์ ์ ๊ตฌํํ ๋๋ requestAnimationFrame๊ณผ setTimeout์ ์ฐจ์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํ๋ฐ, requestAnimationFrame์ ๋ธ๋ผ์ฐ์ ์ ํ๋ฉด ๊ฐฑ์ ์ฃผ๊ธฐ์ ๋ง์ถฐ ์ ๋๋ฉ์ด์ ์ ์คํํ๋๋ก ๋์์ค๋ค. ๋ฐ๋ฉด, setTimeout์ ์ ํํ ํ์ด๋ฐ์ ๋ณด์ฅํ์ง ์์์ ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ ๋๋ ์ ํฉํ์ง ์๋ค.
function animate() {
requestAnimationFrame(animate); // ๋ค์ ๋ฆฌํ์ธํธ ์ฃผ๊ธฐ์ ์ ๋๋ฉ์ด์
์คํ
}
requestAnimationFrame(animate);
++ ์ด์ ๊ด๋ จํด์, ์ด์ ์ requestAnimationFrame์ ์ ์ฉํ์ฌ ์ฑ๋ฅ์ ๋น๊ตํ๋ ๊ธ์ ์์ฑํ ์ ์ด ์์๋ค.
'๐ WIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React ๋ฒ๋ค ์ต์ ํ ์์ฝ (0) | 2025.05.25 |
---|---|
cloneElement๋ฅผ ์ฐ์ง ๋ชปํ ์ด์ (0) | 2025.05.04 |
requestAnimationFrame ์ผ๋ก ํ๋ ์ ํ์ด๋ฐ ๋ง์ถ๊ธฐ (0) | 2025.03.30 |
๐ ๋ฆฌ๋ ๋๋ง ์ด์ ํด๊ฒฐํ๊ธฐ (0) | 2025.03.23 |
๐ฆ Grit์ ํ์ฉํ Emotion โ Panda CSS ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ (0) | 2025.03.16 |