๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Language/Javascript

[Javascript]์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ DOM ๋งˆ์Šคํ„ฐํ•˜๊ธฐ: ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

by YJ Dev 2024. 7. 11.
728x90
๋ฐ˜์‘ํ˜•
SMALL

์›น ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด "DOM"์ด๋ผ๋Š” ์šฉ์–ด๋ฅผ ์ž์ฃผ ์ ‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. DOM(Document Object Model)์€ ์›น ํŽ˜์ด์ง€์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•œ ๋ชจ๋ธ๋กœ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์ƒˆ๋กœ์šด ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

DOM์„ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์€ ์›น ๊ฐœ๋ฐœ์˜ ๊ธฐ๋ณธ์ด์ž ํ•„์ˆ˜ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ DOM์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค์Šต ์˜ˆ์ œ๊นŒ์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์—ฌ, ์—ฌ๋Ÿฌ๋ถ„์ด DOM์„ ์ž์œ ์ž์žฌ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ DOM


01. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ DOM์ด๋ž€?๐ŸŒ

DOM(Document Object Model)์€ ์›น ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ๊ฐ ์š”์†Œ๋ฅผ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด DOM์„ ๋™์ ์œผ๋กœ ์กฐ์ž‘ํ•˜์—ฌ ์›น ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ํ™”๋ฉด์— ์ƒˆ๋กœ์šด ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


02. ๊ธฐ๋ณธ ๊ฐœ๋…: DOM ๊ตฌ์กฐ์™€ ๋…ธ๋“œ๐ŸŒณ

DOM์€ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๊ฐ ์š”์†Œ๋ฅผ '๋…ธ๋“œ(Node)'๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ฃผ์š” ๋…ธ๋“œ ํƒ€์ž…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ์š”์†Œ ๋…ธ๋“œ(Element Node): HTML ํƒœ๊ทธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ํ…์ŠคํŠธ ๋…ธ๋“œ(Text Node): ํ…์ŠคํŠธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ์ฃผ์„ ๋…ธ๋“œ(Comment Node): ์ฃผ์„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

DOM ํŠธ๋ฆฌ์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

<!DOCTYPE html>
<html>
  <body>
    <h1>์•ˆ๋…•ํ•˜์„ธ์š”</h1>
    <p>์—ฌ๊ธฐ๋Š” DOM ํŠธ๋ฆฌ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.</p>
  </body>
</html>

์œ„์˜ HTML ๋ฌธ์„œ์˜ DOM ํŠธ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

html
 โ””โ”€โ”€ body
      โ”œโ”€โ”€ h1
      โ”‚    โ””โ”€โ”€ ํ…์ŠคํŠธ ๋…ธ๋“œ: "์•ˆ๋…•ํ•˜์„ธ์š”"
      โ””โ”€โ”€ p
           โ””โ”€โ”€ ํ…์ŠคํŠธ ๋…ธ๋“œ: "์—ฌ๊ธฐ๋Š” DOM ํŠธ๋ฆฌ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค."

03. DOM ์ ‘๊ทผํ•˜๊ธฐ๐Ÿ”

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ DOM์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•๋“ค์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • document.getElementById(): id ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
const header = document.getElementById('header');
  • document.querySelector()์™€ document.querySelectorAll(): CSS ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
const firstParagraph = document.querySelector('p');
const allDivs = document.querySelectorAll('div');
  • getElementsByClassName()์™€ getElementsByTagName(): ํด๋ž˜์Šค๋ช…์ด๋‚˜ ํƒœ๊ทธ๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
const items = document.getElementsByClassName('item');
const paragraphs = document.getElementsByTagName('p');

04. DOM ์กฐ์ž‘ํ•˜๊ธฐ๐Ÿ› ๏ธ

DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๊ธฐ์กด ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜, ์š”์†Œ์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋…ธ๋“œ ์ƒ์„ฑ๊ณผ ์ถ”๊ฐ€
const newDiv = document.createElement('div');
newDiv.textContent = '์ƒˆ๋กœ์šด ๋‚ด์šฉ';
document.body.appendChild(newDiv);
  • ๋…ธ๋“œ ์‚ญ์ œ
const oldElement = document.getElementById('oldElement');
oldElement.remove();
  • ์†์„ฑ ์กฐ์ž‘
const link = document.querySelector('a');
link.setAttribute('href', 'https://www.example.com');
const hrefValue = link.getAttribute('href');
link.removeAttribute('href');

05. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง๐ŸŽ‰

์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง์€ ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์— ๋ฐ˜์‘ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€
const button = document.querySelector('button');
button.addEventListener('click', function() {
  alert('๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!');
});
  • ์ด๋ฒคํŠธ ํƒ€์ž…
    • click: ํด๋ฆญ ์ด๋ฒคํŠธ
    • load: ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ๋ฐœ์ƒ
    • DOMContentLoaded: ์ดˆ๊ธฐ HTML ๋ฌธ์„œ๊ฐ€ ์™„์ „ํžˆ ๋กœ๋“œ๋˜๊ณ  ๋ถ„์„๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒ
  • ์ด๋ฒคํŠธ ๊ฐ์ฒด์™€ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง
document.body.addEventListener('click', function(event) {
  console.log('์ด๋ฒคํŠธ ํƒ€์ž…: ' + event.type);
  console.log('์ด๋ฒคํŠธ ํƒ€๊ฒŸ: ' + event.target);
});

06. DOM ์กฐ์ž‘ ์‹ค์Šต ์˜ˆ์ œ ๐Ÿ“

  • ๊ฐ„๋‹จํ•œ Todo ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ
<ul id="todo-list">
  <li>์˜ˆ์ œ ์•„์ดํ…œ 1</li>
</ul>
<input type="text" id="new-todo" placeholder="์ƒˆ๋กœ์šด ์•„์ดํ…œ">
<button id="add-todo">์ถ”๊ฐ€</button>

<script>
  const addButton = document.getElementById('add-todo');
  addButton.addEventListener('click', function() {
    const newTodo = document.getElementById('new-todo').value;
    const newLi = document.createElement('li');
    newLi.textContent = newTodo;
    document.getElementById('todo-list').appendChild(newLi);
  });
</script>
  • ์ด๋ฏธ์ง€ ๊ฐค๋Ÿฌ๋ฆฌ ๊ตฌํ˜„
<div id="gallery"></div>
<button id="load-images">์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ</button>

<script>
  document.getElementById('load-images').addEventListener('click', function() {
    const gallery = document.getElementById('gallery');
    for (let i = 1; i <= 5; i++) {
      const img = document.createElement('img');
      img.src = 'image' + i + '.jpg';
      gallery.appendChild(img);
    }
  });
</script>

07. ์ตœ์ ํ™” ๋ฐ ์„ฑ๋Šฅ ํŒ๐Ÿš€

DOM์„ ํšจ์œจ์ ์œผ๋กœ ์กฐ์ž‘ํ•˜๋ฉด ์›น ํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ์„น์…˜์—์„œ๋Š” DocumentFragment์™€ Reflow, Repaint์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

DocumentFragment๋ž€?

DocumentFragment๋Š” DOM์—์„œ ์ผ์ข…์˜ ๊ฐ€์ƒ ๋…ธ๋“œ ๊ฐ์ฒด๋กœ, ๋ถ€๋ชจ๊ฐ€ ์—†๋Š” ์ƒํƒœ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. DocumentFragment๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ DOM์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ํ•œ ๋ฒˆ์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

DocumentFragment์˜ ์žฅ์ 

  1. DOM ์—…๋ฐ์ดํŠธ ์ตœ์†Œํ™”: DocumentFragment์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋™์•ˆ DOM์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฏ€๋กœ, DOM ์—…๋ฐ์ดํŠธ ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์„ฑ๋Šฅ ํ–ฅ์ƒ: ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ DOM์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค, DocumentFragment์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ ํ•œ ๋ฒˆ์— DOM์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

DocumentFragment ์‚ฌ์šฉ ์˜ˆ์‹œ

const fragment = document.createDocumentFragment();

for (let i = 0; i < 1000; i++) {
  const newDiv = document.createElement('div');
  newDiv.textContent = '์•„์ดํ…œ ' + i;
  fragment.appendChild(newDiv);
}

document.body.appendChild(fragment);

์œ„ ์ฝ”๋“œ์—์„œ๋Š” 1000๊ฐœ์˜ div ์š”์†Œ๋ฅผ ๋จผ์ € DocumentFragment์— ์ถ”๊ฐ€ํ•œ ํ›„, ํ•œ ๋ฒˆ์— DOM์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ 1000๋ฒˆ์˜ DOM ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์‹ , ํ•œ ๋ฒˆ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๊ฒŒ ๋˜์–ด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.


Reflow์™€ Repaint๋ž€? 

Reflow์™€ Repaint๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ™”๋ฉด์— ์ฝ˜ํ…์ธ ๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ค‘์š”ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ด ๋‘ ์ž‘์—…์€ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ, ์ด๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

Reflow(์žฌ๋ฐฐ์น˜)

Reflow๋Š” ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์š”์†Œ์˜ ํฌ๊ธฐ, ์œ„์น˜, ๋˜๋Š” ๋‹ค๋ฅธ ์š”์†Œ์— ๋Œ€ํ•œ ์ƒ๋Œ€์  ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ Reflow๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Reflow๋Š” ๋งค์šฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์œผ๋กœ, ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์–ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Repaint(์žฌํŽ˜์ธํŠธ)

Repaint๋Š” ์š”์†Œ์˜ ์Šคํƒ€์ผ์ด ๋ณ€๊ฒฝ๋˜์–ด ํ™”๋ฉด์— ๋‹ค์‹œ ๊ทธ๋ ค์ ธ์•ผ ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์š”์†Œ์˜ ์ƒ‰์ƒ, ๋ฐฐ๊ฒฝ, ๋˜๋Š” ํ…Œ๋‘๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ Repaint๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Repaint๋Š” Reflow๋ณด๋‹ค ๋น„์šฉ์ด ๋œ ๋“ค์ง€๋งŒ, ์—ฌ์ „ํžˆ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Reflow์™€ Repaint ์ตœ์†Œํ™” ๋ฐฉ๋ฒ•:

  • ์Šคํƒ€์ผ ๋ณ€๊ฒฝ ์ตœ์†Œํ™”: ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ๋ณด๋‹ค, ํ•œ ๋ฒˆ์— ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
// ๋‚˜์œ ์˜ˆ
element.style.width = '100px';
element.style.height = '100px';
element.style.backgroundColor = 'red';

// ์ข‹์€ ์˜ˆ
element.style.cssText = 'width: 100px; height: 100px; background-color: red;';
  • ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ ์ ์šฉ: ๊ฐœ๋ณ„ ์Šคํƒ€์ผ์„ ์„ค์ •ํ•˜๋Š” ๋Œ€์‹  ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
// ๋‚˜์œ ์˜ˆ
element.style.display = 'none';
element.style.display = 'block';

// ์ข‹์€ ์˜ˆ
element.classList.add('hidden');
element.classList.remove('hidden');
  • ์˜คํ”„๋ผ์ธ DOM ์กฐ์ž‘: DocumentFragment๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์š”์†Œ๋ฅผ DOM์—์„œ ์ œ๊ฑฐํ•œ ํ›„ ๋ณ€๊ฒฝ์„ ์ ์šฉํ•˜๊ณ  ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
const fragment = document.createDocumentFragment();

for (let i = 0; i < 1000; i++) {
  const newDiv = document.createElement('div');
  newDiv.textContent = '์•„์ดํ…œ ' + i;
  fragment.appendChild(newDiv);
}

document.body.appendChild(fragment);
  • ๋ฆฌํ”Œ๋กœ์šฐ ํŠธ๋ฆฌ๊ฑฐ ์ตœ์†Œํ™”: ๊ฐ€๋Šฅํ•œ ํ•œ ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ๋ ˆ์ด์•„์›ƒ ์ •๋ณด๋ฅผ ์ฝ๊ธฐ ์ „์— ์“ฐ๊ธฐ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
// ๋‚˜์œ ์˜ˆ
element.style.width = '100px';
var width = element.offsetWidth;
element.style.height = '100px';

// ์ข‹์€ ์˜ˆ
element.style.width = '100px';
element.style.height = '100px';
var width = element.offsetWidth;

์ด๋Ÿฌํ•œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด, DOM ์กฐ์ž‘์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ค„์ด๊ณ , ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๋ฐ˜์‘์„ฑ์ด ์ข‹์€ ์›น ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•