[javascript] DOM


DOM(Document Object Model)

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

client-server

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

DOM์€ HTML, ECMAScript์—์„œ ์ •์˜ํ•œ ํ‘œ์ค€์ด ์•„๋‹Œ ๋ณ„๊ฐœ์˜ W3C์˜ ๊ณต์‹ ํ‘œ์ค€์ด๋ฉฐ ํ”Œ๋žซํผ/ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ค‘๋ฆฝ์ ์ด๋‹ค. DOM์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•œ๋‹ค.

HTML ๋ฌธ์„œ์— ๋Œ€ํ•œ ๋ชจ๋ธ ๊ตฌ์„ฑ

๋ธŒ๋ผ์šฐ์ €๋Š” HTML ๋ฌธ์„œ๋ฅผ ๋กœ๋“œํ•œ ํ›„ ํ•ด๋‹น ๋ฌธ์„œ์— ๋Œ€ํ•œ ๋ชจ๋ธ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑํ•œ๋‹ค. ์ด๋•Œ ๋ชจ๋ธ์€ ๊ฐ์ฒด์˜ ํŠธ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋˜๋Š”๋ฐ ์ด๊ฒƒ์„ DOM tree๋ผ ํ•œ๋‹ค.

HTML ๋ฌธ์„œ ๋‚ด์˜ ๊ฐ ์š”์†Œ์— ์ ‘๊ทผ / ์ˆ˜์ •

DOM์€ ๋ชจ๋ธ ๋‚ด์˜ ๊ฐ ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. DOM์ด ์ˆ˜์ •๋˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ฒŒ ๋  ๋‚ด์šฉ ๋˜ํ•œ ๋ณ€๊ฒฝ๋œ๋‹ค.

DOM Tree

DOM tree๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ๋ฌธ์„œ๋ฅผ ๋กœ๋“œํ•œ ํ›„ ํŒŒ์‹ฑํ•˜์—ฌ ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋ธ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ์ฒด์˜ ํŠธ๋ฆฌ๋กœ ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— DOM tree๋ผ ๋ถ€๋ฅธ๋‹ค.

<!DOCTYPE html>
<html>
  <head>
    <style>
      .red  { color: #ff0000; }
      .blue { color: #0000ff; }
    </style>
  </head>
  <body>
    <div>
      <h1>Cities</h1>
      <ul>
        <li id="one" class="red">Seoul</li>
        <li id="two" class="red">London</li>
        <li id="three" class="red">Newyork</li>
        <li id="four">Tokyo</li>
      </ul>
    </div>
  </body>
</html>

dom-tree

DOM์—์„œ ๋ชจ๋“  ์š”์†Œ, ์–ดํŠธ๋ฆฌ๋ทฐํŠธ, ํ…์ŠคํŠธ๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด์ด๋ฉฐ Document ๊ฐ์ฒด์˜ ์ž์‹์ด๋‹ค. ์š”์†Œ์˜ ์ค‘์ฒฉ๊ด€๊ณ„๋Š” ๊ฐ์ฒด์˜ ํŠธ๋ฆฌ๋กœ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ๋ถ€์ž๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. DOM tree์˜ ์ง„์ž…์ (Entry point)๋Š” document ๊ฐ์ฒด์ด๋ฉฐ ์ตœ์ข…์ ์€ ์š”์†Œ์˜ ํ…์ŠคํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ด๋‹ค.

DOM tree๋Š” ๋„ค ์ข…๋ฅ˜์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

๋ฌธ์„œ ๋…ธ๋“œ(Document Node)
ํŠธ๋ฆฌ์˜ ์ตœ์ƒ์œ„์— ์กด์žฌํ•˜๋ฉฐ ๊ฐ๊ฐ ์š”์†Œ, ์–ดํŠธ๋ฆฌ๋ทฐํŠธ, ํ…์ŠคํŠธ ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋ฌธ์„œ ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, DOM tree์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์ž‘์ (entry point)์ด๋‹ค.
์š”์†Œ ๋…ธ๋“œ(Element Node)
์š”์†Œ ๋…ธ๋“œ๋Š” HTML ์š”์†Œ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. HTML ์š”์†Œ๋Š” ์ค‘์ฒฉ์— ์˜ํ•ด ๋ถ€์ž ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋ฉฐ ์ด ๋ถ€์ž ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๊ตฌ์กฐํ™”ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์š”์†Œ ๋…ธ๋“œ๋Š” ๋ฌธ์„œ์˜ ๊ตฌ์กฐ๋ฅผ ์„œ์ˆ ํ•œ๋‹ค๊ณ  ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค. ์–ดํŠธ๋ฆฌ๋ทฐํŠธ, ํ…์ŠคํŠธ ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋จผ์ € ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค. ๋ชจ๋“  ์š”์†Œ ๋…ธ๋“œ๋Š” ์š”์†Œ๋ณ„ ํŠน์„ฑ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด HTMLElement ๊ฐ์ฒด๋ฅผ ์ƒ์†ํ•œ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. (๊ทธ๋ฆผ: DOM tree์˜ ๊ฐ์ฒด ๊ตฌ์„ฑ ์ฐธ๊ณ )
์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ(Attribute Node)
์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ๋Š” HTML ์š”์†Œ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ๋Š” ํ•ด๋‹น ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์ง€์ •๋œ ์š”์†Œ์˜ ์ž์‹์ด ์•„๋‹ˆ๋ผ ํ•ด๋‹น ์š”์†Œ์˜ ์ผ๋ถ€๋กœ ํ‘œํ˜„๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ์ ‘๊ทผํ•˜๋ฉด ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ฐธ์กฐ, ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ…์ŠคํŠธ ๋…ธ๋“œ(Text Node)
ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” HTML ์š”์†Œ์˜ ํ…์ŠคํŠธ๋ฅผ 1ํ‘œํ˜„ํ•œ๋‹ค. ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹์ด๋ฉฐ ์ž์‹ ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” DOM tree์˜ ์ตœ์ข…๋‹จ์ด๋‹ค.

HTMLElement

DOM์„ ํ†ตํ•ด ์›นํŽ˜์ด์ง€๋ฅผ ์กฐ์ž‘(manipulate)ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆ˜์ˆœ์ด ํ•„์š”ํ•˜๋‹ค.

  • ์กฐ์ž‘ํ•˜๊ณ ์žํ•˜๋Š” ์š”์†Œ๋ฅผ ์„ ํƒ ๋˜๋Š” ํƒ์ƒ‰ํ•œ๋‹ค.
  • ์„ ํƒ๋œ ์š”์†Œ์˜ ์ฝ˜ํ…์ธ  ๋˜๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์กฐ์ž‘ํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ด๊ฒƒ์— ํ•„์š”ํ•œ ์ˆ˜๋‹จ(API)์„ ์ œ๊ณตํ•œ๋‹ค.

DOM Query / Traversing (์š”์†Œ์—์˜ ์ ‘๊ทผ)

ํ•˜๋‚˜์˜ ์š”์†Œ ๋…ธ๋“œ ์„ ํƒ(DOM Query)

select-an-individual-element-node

document.getElementById(id)

  • id ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์œผ๋กœ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํ•œ ๊ฐœ ์„ ํƒํ•œ๋‹ค. ๋ณต์ˆ˜๊ฐœ๊ฐ€ ์„ ํƒ๋œ ๊ฒฝ์šฐ, ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • Return: HTMLElement๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด
  • ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘
// id๋กœ ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
const elem = document.getElementById('one');
// ํด๋ž˜์Šค ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
elem.className = 'blue';

// ๊ทธ๋ฆผ: DOM tree์˜ ๊ฐ์ฒด ๊ตฌ์„ฑ ์ฐธ๊ณ 
console.log(elem); // <li id="one" class="blue">Seoul</li>
console.log(elem.__proto__);           // HTMLLIElement
console.log(elem.__proto__.__proto__); // HTMLElement
console.log(elem.__proto__.__proto__.__proto__);           // Element
console.log(elem.__proto__.__proto__.__proto__.__proto__); // Node

document.querySelector(cssSelector)

  • CSS ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํ•œ ๊ฐœ ์„ ํƒํ•œ๋‹ค. ๋ณต์ˆ˜๊ฐœ๊ฐ€ ์„ ํƒ๋œ ๊ฒฝ์šฐ, ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • Return: HTMLElement๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด
  • IE8 ์ด์ƒ์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘
// HTMLCollection์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. HTMLCollection์€ liveํ•˜๋‹ค.
const elems = document.getElementsByClassName('red');

for (let i = 0; i < elems.length; i++) {
  // ํด๋ž˜์Šค ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
  elems[i].className = 'blue';
}

์œ„ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๋ฉด ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. (๋‘๋ฒˆ์งธ ์š”์†Œ๋งŒ ํด๋ž˜์Šค ๋ณ€๊ฒฝ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.)

getElementsByClassName ๋ฉ”์†Œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์€ HTMLCollection์ด๋‹ค. ์ด๊ฒƒ์€ ๋ฐ˜ํ™˜๊ฐ’์ด ๋ณต์ˆ˜์ธ ๊ฒฝ์šฐ, HTMLElement์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด๋กœ ๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•œ ์‚ฌ์šฉ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋ฐฐ์—ด์€ ์•„๋‹Œ ์œ ์‚ฌ๋ฐฐ์—ด(array-like object)์ด๋‹ค. ๋˜ํ•œ HTMLCollection์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ Node์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋ฐ˜์˜ํ•œ๋‹ค. (live HTMLCollection)

์œ„ ์˜ˆ์ œ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์€ ์ด์œ ๋ฅผ ์•Œ์•„๋ณด์ž.

elems.length๋Š” 3์ด๋ฏ€๋กœ 3๋ฒˆ์˜ loop๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

  1. i๊ฐ€ 0์ผ๋•Œ, elems์˜ ์ฒซ ์š”์†Œ(li#one.red)์˜ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐ’์ด className ํ”„๋กœํผํ‹ฐ์— ์˜ํ•ด red์—์„œ blue๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค. ์ด๋•Œ elems๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ Node์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋ฐ˜์˜ํ•˜๋Š” HTMLCollection ๊ฐ์ฒด์ด๋‹ค. elems์˜ ์ฒซ ์š”์†Œ๋Š” li#one.red์—์„œ li#one.blue๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฏ€๋กœ getElementsByClassName ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋กœ ์ง€์ •ํ•œ ์„ ํƒ ์กฐ๊ฑด(โ€˜redโ€™)๊ณผ ๋”์ด์ƒ ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๊ฒŒ ๋˜์–ด ๋ฐ˜ํ™˜๊ฐ’์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ œ๊ฑฐ๋œ๋‹ค.
  2. i๊ฐ€ 1์ผ๋•Œ, elems์—์„œ ์ฒซ์งธ ์š”์†Œ๋Š” ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฏ€๋กœ elems[1]์€ 3๋ฒˆ์งธ ์š”์†Œ(li#three.red)๊ฐ€ ๋œ๋‹ค. li#three.red์˜ class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์ด blue๋กœ ๋ณ€๊ฒฝ๋˜๊ณ  ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ HTMLCollection์—์„œ ์ œ์™ธ๋œ๋‹ค.
  3. i๊ฐ€ 2์ผ๋•Œ, HTMLCollection์˜ 1,3๋ฒˆ์งธ ์š”์†Œ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฏ€๋กœ 2๋ฒˆ์งธ ์š”์†Œ(li#two.red)๋งŒ ๋‚จ์•˜๋‹ค. ์ด๋•Œ elems.length๋Š” 1์ด๋ฏ€๋กœ for ๋ฌธ์˜ ์กฐ๊ฑด์‹ i < elems.length๊ฐ€ false๋กœ ํ‰๊ฐ€๋˜์–ด ๋ฐ˜๋ณต์„ ์ข…๋ฃŒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ elems์— ๋‚จ์•„ ์žˆ๋Š” 2๋ฒˆ์งธ li ์š”์†Œ(li#two.red)์˜ class ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ด์ฒ˜๋Ÿผ HTMLCollection๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ Node์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋ฐ˜์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— loop๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํšŒํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฐ˜๋ณต๋ฌธ์„ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๋ฆฐ๋‹ค.
const elems = document.getElementsByClassName('red');

for (let i = elems.length - 1; i >= 0; i--) {
  elems[i].className = 'blue';
}
  • while ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋•Œ elems์— ์š”์†Œ๊ฐ€ ๋‚จ์•„ ์žˆ์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋ฌดํ•œ๋ฐ˜๋ณตํ•˜๊ธฐ ์œ„ํ•ด index๋Š” 0์œผ๋กœ ๊ณ ์ •์‹œํ‚จ๋‹ค.
const elems = document.getElementsByClassName('red');

let i = 0;
while (elems.length > i) { // elems์— ์š”์†Œ๊ฐ€ ๋‚จ์•„ ์žˆ์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋ฌดํ•œ๋ฐ˜๋ณต
  elems[i].className = 'blue';
  // i++;
}
  • HTMLCollection์„ ๋ฐฐ์—ด๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ๊ถŒ์žฅํ•œ๋‹ค.
const elems = document.getElementsByClassName('red');

// ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ธ HTMLCollection์„ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
// ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜๋œ HTMLCollection์€ ๋” ์ด์ƒ liveํ•˜์ง€ ์•Š๋‹ค.
console.log([...elems]); // [li#one.red, li#two.red, li#three.red]

[...elems].forEach(elem => elem.className = 'blue');
  • querySelectorAll ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTMLCollection(live)์ด ์•„๋‹Œ NodeList(non-live)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•œ๋‹ค.
// querySelectorAll๋Š” Nodelist(non-live)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. IE8+
const elems = document.querySelectorAll('.red');

[...elems].forEach(elem => elem.className = 'blue');

document.getElementsByTagName(tagName)

  • ํƒœ๊ทธ๋ช…์œผ๋กœ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์„ ํƒํ•œ๋‹ค.

  • Return: HTMLCollection (live)

  • ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘

// HTMLCollection์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
const elems = document.getElementsByTagName('li');

[...elems].forEach(elem => elem.className = 'blue');

document.querySelectorAll(selector)

  • ์ง€์ •๋œ CSS ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์„ ํƒํ•œ๋‹ค.
  • Return: NodeList (non-live)
  • IE8 ์ด์ƒ์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘
// Nodelist๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
const elems = document.querySelectorAll('li.red');

[...elems].forEach(elem => elem.className = 'blue');

DOM Traversing

traversing

parentNode

  • ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
  • Return: HTMLElement๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด
  • ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘
const elem = document.querySelector('#two');

elem.parentNode.className = 'blue';

firstChild, lastChild

  • ์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
  • Return: HTMLElement๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด
  • IE9 ์ด์ƒ์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘
const elem = document.querySelector('ul');

// first Child
elem.firstChild.className = 'blue';
// last Child
elem.lastChild.className = 'blue';

์œ„ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๋ฉด ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ์ด์œ ๋Š” IE๋ฅผ ์ œ์™ธํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €๋“ค์€ ์š”์†Œ ์‚ฌ์ด์˜ ๊ณต๋ฐฑ ๋˜๋Š” ์ค„๋ฐ”๊ฟˆ ๋ฌธ์ž๋ฅผ ํ…์ŠคํŠธ ๋…ธ๋“œ๋กœ ์ทจ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๊ฒƒ์„ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด HTML์˜ ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ jQuery: .prev()์™€ jQuery: .next()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

<ul><li
  id='one' class='red'>Seoul</li><li
  id='two' class='red'>London</li><li
  id='three' class='red'>Newyork</li><li
  id='four'>Tokyo</li></ul>

๋˜๋Š” firstElementChild, lastElementChild๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ๋‘๊ฐ€์ง€ ํ”„๋กœํผํ‹ฐ๋Š” ๋ชจ๋“  IE9 ์ด์ƒ์—์„œ ์ •์ƒ ๋™์ž‘ํ•œ๋‹ค.

const elem = document.querySelector('ul');

// first Child
elem.firstElementChild.className = 'blue';
// last Child
elem.lastElementChild.className = 'blue';
hasChildNodes()
์ž์‹ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  Boolean ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
Return: Boolean ๊ฐ’
๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘
childNodes
์ž์‹ ๋…ธ๋“œ์˜ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ…์ŠคํŠธ ์š”์†Œ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
Return: NodeList (non-live)
๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘
children
์ž์‹ ๋…ธ๋“œ์˜ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ž์‹ ์š”์†Œ ์ค‘์—์„œ Element type ์š”์†Œ๋งŒ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
Return: HTMLCollection (live)
IE9 ์ด์ƒ์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘
const elem = document.querySelector('ul');

if (elem.hasChildNodes()) {
  console.log(elem.childNodes);
  // ํ…์ŠคํŠธ ์š”์†Œ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  // NodeList(9) [text, li#one.red, text, li#two.red, text, li#three.red, text, li#four, text]

  console.log(elem.children);
  // ์ž์‹ ์š”์†Œ ์ค‘์—์„œ Element type ์š”์†Œ๋งŒ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  // HTMLCollection(4) [li#one.red, li#two.red, li#three.red, li#four, one: li#one.red, two: li#two.red, three: li#three.red, four: li#four]
  [...elem.children].forEach(el => console.log(el.nodeType)); // 1 (=> Element node)
}
previousSibling, nextSibling
ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค. text node๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
Return: HTMLElement๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด
๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘
previousElementSibling, nextElementSibling
ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค. ํ˜•์ œ ๋…ธ๋“œ ์ค‘์—์„œ Element type ์š”์†Œ๋งŒ์„ ํƒ์ƒ‰ํ•œ๋‹ค.
Return: HTMLElement๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด
IE9 ์ด์ƒ์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘

DOM Manipulation(์กฐ์ž‘)

ํ…์ŠคํŠธ ๋…ธ๋“œ์—์˜ ์ ‘๊ทผ/์ˆ˜์ •

nodeValue

์š”์†Œ์˜ ํ…์ŠคํŠธ๋Š” ํ…์ŠคํŠธ ๋…ธ๋“œ์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ํ…์ŠคํŠธ ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆ˜์ˆœ์ด ํ•„์š”ํ•˜๋‹ค.

  1. ํ•ด๋‹น ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค. ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹์ด๋‹ค.
  2. firstChild ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
  3. ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ ์œ ์ผํ•œ ํ”„๋กœํผํ‹ฐ(nodeValue)๋ฅผ ์ด์šฉํ•˜์—ฌ ํ…์ŠคํŠธ๋ฅผ ์ทจ๋“ํ•œ๋‹ค.
  4. nodeValue๋ฅผ ์ด์šฉํ•˜์—ฌ ํ…์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.
nodeValue
๋…ธ๋“œ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
Return: ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ ๊ฒฝ์šฐ๋Š” ๋ฌธ์ž์—ด, ์š”์†Œ ๋…ธ๋“œ์˜ ๊ฒฝ์šฐ null ๋ฐ˜ํ™˜
IE6 ์ด์ƒ์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•œ๋‹ค.

nodeName, nodeType์„ ํ†ตํ•ด ๋…ธ๋“œ์˜ ์ •๋ณด๋ฅผ ์ทจ๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.

// ํ•ด๋‹น ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
const one = document.getElementById('one');
console.dir(one); // HTMLLIElement: li#one.red

// nodeName, nodeType์„ ํ†ตํ•ด ๋…ธ๋“œ์˜ ์ •๋ณด๋ฅผ ์ทจ๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.
console.log(one.nodeName); // LI
console.log(one.nodeType); // 1: Element node

// firstChild ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
const textNode = one.firstChild;

// nodeName, nodeType์„ ํ†ตํ•ด ๋…ธ๋“œ์˜ ์ •๋ณด๋ฅผ ์ทจ๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.
console.log(textNode.nodeName); // #text
console.log(textNode.nodeType); // 3: Text node

// nodeValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์˜ ๊ฐ’์„ ์ทจ๋“ํ•œ๋‹ค.
console.log(textNode.nodeValue); // Seoul

// nodeValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ…์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.
textNode.nodeValue = 'Pusan';

์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ์˜ ์ ‘๊ทผ/์ˆ˜์ •

nodeValue

์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ์„ ์กฐ์ž‘ํ•  ๋•Œ ๋‹ค์Œ ํ”„๋กœํผํ‹ฐ ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

className
class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐ’์„ ์ทจ๋“ ๋˜๋Š” ๋ณ€๊ฒฝํ•œ๋‹ค. className ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ, class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ง€์ •๋œ ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค. class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐ’์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ, ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋ฌธ์ž์—ด์ด ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ String ๋ฉ”์†Œ๋“œ split(' ')๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•œ๋‹ค.
classList
add, remove, item, toggle, contains, replace ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. IE10 ์ด์ƒ์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•œ๋‹ค.
const elems = document.querySelectorAll('li');

// className
[...elems].forEach(elem => {
  // class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ์ทจ๋“ํ•˜์—ฌ ํ™•์ธ
  if (elem.className === 'red') {
    // class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
    elem.className = 'blue';
  }
});

// classList
[...elems].forEach(elem => {
  // class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’ ํ™•์ธ
  if (elem.classList.contains('blue')) {
    // class ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’ ๋ณ€๊ฒฝํ•œ๋‹ค.
    elem.classList.replace('blue', 'red');
  }
});
id
id ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐ’์„ ์ทจ๋“ ๋˜๋Š” ๋ณ€๊ฒฝํ•œ๋‹ค. id ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ, id ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด id ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ง€์ •๋œ ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค.
๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•œ๋‹ค.
// h1 ํƒœ๊ทธ ์š”์†Œ ์ค‘ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์ทจ๋“
const heading = document.querySelector('h1');

console.dir(heading); // HTMLHeadingElement: h1
console.log(heading.firstChild.nodeValue); // Cities

// id ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ.
// id ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด id ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ง€์ •๋œ ๊ฐ’์„ ์„ค์ •
heading.id = 'heading';
console.log(heading.id); // heading
hasAttribute(attribute)
์ง€์ •ํ•œ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.
Return : Boolean
IE8 ์ด์ƒ์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•œ๋‹ค.
getAttribute(attribute)
์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐ’์„ ์ทจ๋“ํ•œ๋‹ค.
Return : ๋ฌธ์ž์—ด
๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•œ๋‹ค.
setAttribute(attribute, value)
์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค.
Return : undefined
๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•œ๋‹ค.
removeAttribute(attribute)
์ง€์ •ํ•œ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
Return : undefined
๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•œ๋‹ค.
<!DOCTYPE html>
<html>
  <body>
  <input type="text">
  <script>
  const input = document.querySelector('input[type=text]');
  console.log(input);

  // value ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด
  if (!input.hasAttribute('value')) {
    // value ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐ’์œผ๋กœ 'hello!'๋ฅผ ์„ค์ •
    input.setAttribute('value', 'hello!');
  }

  // value ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์„ ์ทจ๋“
  console.log(input.getAttribute('value')); // hello!

  // value ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ œ๊ฑฐ
  input.removeAttribute('value');

  // value ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ์กด์žฌ๋ฅผ ํ™•์ธ
  console.log(input.hasAttribute('value')); // false
  </script>
  </body>
</html>
<!DOCTYPE html>
<html>
<body>
  <input class="password" type="password" value="123">
  <button class="show">show</button>
  <script>
    const $password = document.querySelector('.password');
    const $show = document.querySelector('.show');

    function makeClickHandler() {
      let isShow = false;
      return function () {
        $password.setAttribute('type', isShow ? 'password' : 'text');
        isShow = !isShow;
        $show.innerHTML = isShow ? 'hide' : 'show';
      };
    }

    $show.onclick = makeClickHandler();
  </script>
</body>
</html>

HTML ์ปจํ…์ธ  ์กฐ์ž‘(Manipulation)

innerHTML

HTML ์ฝ˜ํ…์ธ ๋ฅผ ์กฐ์ž‘(Manipulation)ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์˜ ํ”„๋กœํผํ‹ฐ ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งˆํฌ์—…์ด ํฌํ•จ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ–‰์œ„๋Š” ํฌ๋กœ์Šค ์Šคํฌ๋ฆฝํŒ… ๊ณต๊ฒฉ(XSS: Cross-Site Scripting Attacks)์— ์ทจ์•ฝํ•˜๋ฏ€๋กœ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

textContent
์š”์†Œ์˜ ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ๋ฅผ ์ทจ๋“ ๋˜๋Š” ๋ณ€๊ฒฝํ•œ๋‹ค. ์ด๋•Œ ๋งˆํฌ์—…์€ ๋ฌด์‹œ๋œ๋‹ค. textContent๋ฅผ ํ†ตํ•ด ์š”์†Œ์— ์ƒˆ๋กœ์šด ํ…์ŠคํŠธ๋ฅผ ํ• ๋‹นํ•˜๋ฉด ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ์ˆœ์ˆ˜ํ•œ ํ…์ŠคํŠธ๋งŒ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ ๋งˆํฌ์—…์„ ํฌํ•จ์‹œํ‚ค๋ฉด ๋ฌธ์ž์—ด๋กœ ์ธ์‹๋˜์–ด ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋œ๋‹ค.
IE9 ์ด์ƒ์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•œ๋‹ค.
<!DOCTYPE html>
<html>
  <head>
    <style>
      .red  { color: #ff0000; }
      .blue { color: #0000ff; }
    </style>
  </head>
  <body>
    <div>
      <h1>Cities</h1>
      <ul>
        <li id="one" class="red">Seoul</li>
        <li id="two" class="red">London</li>
        <li id="three" class="red">Newyork</li>
        <li id="four">Tokyo</li>
      </ul>
    </div>
    <script>
    const ul = document.querySelector('ul');

    // ์š”์†Œ์˜ ํ…์ŠคํŠธ ์ทจ๋“
    console.log(ul.textContent);
    /*
            Seoul
            London
            Newyork
            Tokyo
    */

    const one = document.getElementById('one');

    // ์š”์†Œ์˜ ํ…์ŠคํŠธ ์ทจ๋“
    console.log(one.textContent); // Seoul

    // ์š”์†Œ์˜ ํ…์ŠคํŠธ ๋ณ€๊ฒฝ
    one.textContent += ', Korea';

    console.log(one.textContent); // Seoul, Korea

    // ์š”์†Œ์˜ ๋งˆํฌ์—…์ด ํฌํ•จ๋œ ์ฝ˜ํ…์ธ  ๋ณ€๊ฒฝ.
    one.textContent = '<h1>Heading</h1>';

    // ๋งˆํฌ์—…์ด ๋ฌธ์ž์—ด๋กœ ํ‘œ์‹œ๋œ๋‹ค.
    console.log(one.textContent); // <h1>Heading</h1>
    </script>
  </body>
</html>
innerText
innerText ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ๋„ ์š”์†Œ์˜ ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜์˜ ์ด์œ ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค

๋น„ํ‘œ์ค€์ด๋‹ค.
CSS์— ์ˆœ์ข…์ ์ด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด CSS์— ์˜ํ•ด ๋น„ํ‘œ์‹œ(visibility: hidden;)๋กœ ์ง€์ •๋˜์–ด ์žˆ๋‹ค๋ฉด ํ…์ŠคํŠธ๊ฐ€ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค. CSS๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋ฏ€๋กœ textContent ํ”„๋กœํผํ‹ฐ๋ณด๋‹ค ๋А๋ฆฌ๋‹ค.
innerHTML
ํ•ด๋‹น ์š”์†Œ์˜ ๋ชจ๋“  ์ž์‹ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ์ฝ˜ํ…์ธ ๋ฅผ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ์ทจ๋“ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฌธ์ž์—ด์€ ๋งˆํฌ์—…์„ ํฌํ•จํ•œ๋‹ค.
const ul = document.querySelector('ul');

// innerHTML ํ”„๋กœํผํ‹ฐ๋Š” ๋ชจ๋“  ์ž์‹ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ์ฝ˜ํ…์ธ ๋ฅผ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ์ทจ๋“ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฌธ์ž์—ด์€ ๋งˆํฌ์—…์„ ํฌํ•จํ•œ๋‹ค.
console.log(ul.innerHTML);
// IE๋ฅผ ์ œ์™ธํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €๋“ค์€ ์š”์†Œ ์‚ฌ์ด์˜ ๊ณต๋ฐฑ ๋˜๋Š” ์ค„๋ฐ”๊ฟˆ ๋ฌธ์ž๋ฅผ ํ…์ŠคํŠธ ๋…ธ๋“œ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค
/*
        <li id="one" class="red">Seoul</li>
        <li id="two" class="red">London</li>
        <li id="three" class="red">Newyork</li>
        <li id="four">Tokyo</li>
*/

innerHTML ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งˆํฌ์—…์ด ํฌํ•จ๋œ ์ƒˆ๋กœ์šด ์ฝ˜ํ…์ธ ๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ DOM์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

const one = document.getElementById('one');

// ๋งˆํฌ์—…์ด ํฌํ•จ๋œ ์ฝ˜ํ…์ธ  ์ทจ๋“
console.log(one.innerHTML); // Seoul

// ๋งˆํฌ์—…์ด ํฌํ•จ๋œ ์ฝ˜ํ…์ธ  ๋ณ€๊ฒฝ
one.innerHTML += '<em class="blue">, Korea</em>';

// ๋งˆํฌ์—…์ด ํฌํ•จ๋œ ์ฝ˜ํ…์ธ  ์ทจ๋“
console.log(one.innerHTML); // Seoul <em class="blue">, Korea</em>

์œ„์™€ ๊ฐ™์ด ๋งˆํฌ์—…์ด ํฌํ•จ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ํฌ๋กœ์Šค ์Šคํฌ๋ฆฝํŒ… ๊ณต๊ฒฉ(XSS: Cross-Site Scripting Attacks)์— ์ทจ์•ฝํ•˜๋‹ค.

// ํฌ๋กœ์Šค ์Šคํฌ๋ฆฝํŒ… ๊ณต๊ฒฉ ์‚ฌ๋ก€

// ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•œ๋‹ค.
// HTML5์—์„œ innerHTML๋กœ ์‚ฝ์ž…๋œ <script> ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
// ํฌ๋กฌ, ํŒŒ์ด์–ดํญ์Šค ๋“ฑ์˜ ๋ธŒ๋ผ์šฐ์ €๋‚˜ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.
elem.innerHTML = '<script>alert("XSS!")</script>';

// ์—๋Ÿฌ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•œ๋‹ค.
// ํฌ๋กฌ์—์„œ๋„ ์‹คํ–‰๋œ๋‹ค!
elem.innerHTML = '<img src="#" onerror="alert(\'XSS\')">';

DOM ์กฐ์ž‘ ๋ฐฉ์‹

innerHTML ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•œ ๊ฐœ์˜ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์˜ ์ˆ˜์ˆœ์— ๋”ฐ๋ผ ์ง„ํ–‰ํ•œ๋‹ค.

  1. ์š”์†Œ ๋…ธ๋“œ ์ƒ์„ฑ createElement() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. createElement() ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋กœ ํƒœ๊ทธ ์ด๋ฆ„์„ ์ „๋‹ฌํ•œ๋‹ค.
  2. ํ…์ŠคํŠธ ๋…ธ๋“œ ์ƒ์„ฑ createTextNode() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ƒ๋žต๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒ๋žตํ•˜๋Š” ๊ฒฝ์šฐ, ์ฝ˜ํ…์ธ ๊ฐ€ ๋น„์–ด ์žˆ๋Š” ์š”์†Œ๊ฐ€ ๋œ๋‹ค.
  3. ์ƒ์„ฑ๋œ ์š”์†Œ๋ฅผ DOM์— ์ถ”๊ฐ€ appendChild() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ๋…ธ๋“œ๋ฅผ DOM tree์— ์ถ”๊ฐ€ํ•œ๋‹ค. ๋˜๋Š” removeChild() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DOM tree์—์„œ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
createElement(tagName)
ํƒœ๊ทธ์ด๋ฆ„์„ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
Return: HTMLElement๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด
๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•œ๋‹ค.
createTextNode(text)
ํ…์ŠคํŠธ๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
Return: Text ๊ฐ์ฒด
๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•œ๋‹ค.
appendChild(Node)
์ธ์ž๋กœ ์ „๋‹ฌํ•œ ๋…ธ๋“œ๋ฅผ ๋งˆ์ง€๋ง‰ ์ž์‹ ์š”์†Œ๋กœ DOM ํŠธ๋ฆฌ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
Return: ์ถ”๊ฐ€ํ•œ ๋…ธ๋“œ
๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•œ๋‹ค.
removeChild(Node)
์ธ์ž๋กœ ์ „๋‹ฌํ•œ ๋…ธ๋“œ๋ฅผ DOM ํŠธ๋ฆฌ์— ์ œ๊ฑฐํ•œ๋‹ค.
Return: ์ถ”๊ฐ€ํ•œ ๋…ธ๋“œ
๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•œ๋‹ค.
// ํƒœ๊ทธ์ด๋ฆ„์„ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ƒ์„ฑ
const newElem = document.createElement('li');
// const newElem = document.createElement('<li>test</li>');
// Uncaught DOMException: Failed to execute 'createElement' on 'Document': The tag name provided ('<li>test</li>') is not a valid name.

// ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑ
const newText = document.createTextNode('Beijing');

// ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ newElem ์ž์‹์œผ๋กœ DOM ํŠธ๋ฆฌ์— ์ถ”๊ฐ€
newElem.appendChild(newText);

const container = document.querySelector('ul');

// newElem์„ container์˜ ์ž์‹์œผ๋กœ DOM ํŠธ๋ฆฌ์— ์ถ”๊ฐ€. ๋งˆ์ง€๋ง‰ ์š”์†Œ๋กœ ์ถ”๊ฐ€๋œ๋‹ค.
container.appendChild(newElem);

const removeElem = document.getElementById('one');

// container์˜ ์ž์‹์ธ removeElem ์š”์†Œ๋ฅผ DOM ํŠธ๋ฆฌ์— ์ œ๊ฑฐํ•œ๋‹ค.
container.removeChild(removeElem);

insertAdjacentHTML()

insertAdjacentHTML(position, string)
์ธ์ž๋กœ ์ „๋‹ฌํ•œ ํ…์ŠคํŠธ๋ฅผ HTML๋กœ ํŒŒ์‹ฑํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋กœ ์ƒ์„ฑ๋œ ๋…ธ๋“œ๋ฅผ DOM ํŠธ๋ฆฌ์˜ ์ง€์ •๋œ ์œ„์น˜์— ์‚ฝ์ž…ํ•œ๋‹ค. ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” ์‚ฝ์ž… ์œ„์น˜, ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” ์‚ฝ์ž…ํ•  ์š”์†Œ๋ฅผ ํ‘œํ˜„ํ•œ ๋ฌธ์ž์—ด์ด๋‹ค. ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
โ€˜beforebeginโ€™
โ€˜afterbeginโ€™
โ€˜beforeendโ€™
โ€˜afterendโ€™

๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•œ๋‹ค.

insertAdjacentHTML-position

โ€‹ insertAdjacentHTML ๋ฉ”์†Œ๋“œ์˜ position parameter

const one = document.getElementById('one');

// ๋งˆํฌ์—…์ด ํฌํ•จ๋œ ์š”์†Œ ์ถ”๊ฐ€
one.insertAdjacentHTML('beforeend', '<em class="blue">, Korea</em>');

innerHTML vs DOM์กฐ์ž‘๋ฐฉ์‹ vs insertAdjacentHTML

innerHTML

์žฅ์ ๋‹จ์ 
DOM ์กฐ์ž‘ ๋ฐฉ์‹์— ๋น„ํ•ด ๋น ๋ฅด๊ณ  ๊ฐ„ํŽธํ•˜๋‹ค.XSS๊ณต๊ฒฉ์— ์ทจ์•ฝ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๋กœ ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ์ฝ˜ํ…์ธ (untrusted data: ๋Œ“๊ธ€, ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋“ฑ)๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์ฃผ์˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
๊ฐ„ํŽธํ•˜๊ฒŒ ๋ฌธ์ž์—ด๋กœ ์ •์˜ํ•œ ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ DOM์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.ํ•ด๋‹น ์š”์†Œ์˜ ๋‚ด์šฉ์„ ๋ฎ์–ด ์“ด๋‹ค. ์ฆ‰, HTML์„ ๋‹ค์‹œ ํŒŒ์‹ฑํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋‹ค.
์ฝ˜ํ…์ธ ๋ฅผ ์ทจ๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.ย 

DOM ์กฐ์ž‘ ๋ฐฉ์‹

์žฅ์ ๋‹จ์ 
ํŠน์ • ๋…ธ๋“œ ํ•œ ๊ฐœ(๋…ธ๋“œ, ํ…์ŠคํŠธ, ๋ฐ์ดํ„ฐ ๋“ฑ)๋ฅผ DOM์— ์ถ”๊ฐ€ํ•  ๋•Œ ์ ํ•ฉํ•˜๋‹ค.innerHTML๋ณด๋‹ค ๋А๋ฆฌ๊ณ  ๋” ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

insertAdjacentHTML()

์žฅ์ ๋‹จ์ 
๊ฐ„ํŽธํ•˜๊ฒŒ ๋ฌธ์ž์—ด๋กœ ์ •์˜๋œ ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ DOM์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.XSS๊ณต๊ฒฉ์— ์ทจ์•ฝ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๋กœ ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ์ฝ˜ํ…์ธ (untrusted data: ๋Œ“๊ธ€, ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋“ฑ)๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์ฃผ์˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
์‚ฝ์ž…๋˜๋Š” ์œ„์น˜๋ฅผ ์„ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.ย 

๊ฒฐ๋ก 

innerHTML๊ณผ insertAdjacentHTML()์€ ํฌ๋กœ์Šค ์Šคํฌ๋ฆฝํŒ… ๊ณต๊ฒฉ(XSS: Cross-Site Scripting Attacks)์— ์ทจ์•ฝํ•˜๋‹ค. ๋”ฐ๋ผ์„œ untrusted data์˜ ๊ฒฝ์šฐ, ์ฃผ์˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ ๋˜๋Š” ๋ณ€๊ฒฝ์‹œ์—๋Š” textContent, ์ƒˆ๋กœ์šด ์š”์†Œ์˜ ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œ์‹œ์—๋Š” DOM ์กฐ์ž‘ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค.

style

style ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด inline ์Šคํƒ€์ผ ์„ ์–ธ์„ ์ƒ์„ฑํ•œ๋‹ค. ํŠน์ • ์š”์†Œ์— inline ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.

const four = document.getElementById('four');

// inline ์Šคํƒ€์ผ ์„ ์–ธ์„ ์ƒ์„ฑ
four.style.color = 'blue';

// font-size์™€ ๊ฐ™์ด '-'์œผ๋กœ ๊ตฌ๋ถ„๋˜๋Š” ํ”„๋กœํผํ‹ฐ๋Š” ์นด๋ฉœ์ผ€์ด์Šค๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
four.style.fontSize = '2em';

style ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ทจ๋“ํ•˜๋ ค๋ฉด window.getComputedStyle์„ ์‚ฌ์šฉํ•œ๋‹ค. window.getComputedStyle ๋ฉ”์†Œ๋“œ๋Š” ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ์š”์†Œ์˜ ๋ชจ๋“  CSS ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>style ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์ทจ๋“</title>
  <style>
    .box {
      width: 100px;
      height: 50px;
      background-color: red;
      border: 1px solid black;
    }
  </style>
</head>
<body>
  <div class="box"></div>
  <script>
    const box = document.querySelector('.box');

    const width = getStyle(box, 'width');
    const height = getStyle(box, 'height');
    const backgroundColor = getStyle(box, 'background-color');
    const border = getStyle(box, 'border');

    console.log('width: ' + width);
    console.log('height: ' + height);
    console.log('backgroundColor: ' + backgroundColor);
    console.log('border: ' + border);

    /**
     * ์š”์†Œ์— ์ ์šฉ๋œ CSS ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
     * @param {HTTPElement} elem - ๋Œ€์ƒ ์š”์†Œ ๋…ธ๋“œ.
     * @param {string} prop - ๋Œ€์ƒ CSS ํ”„๋กœํผํ‹ฐ.
     * @returns {string} CSS ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’.
     */
    function getStyle(elem, prop) {
      return window.getComputedStyle(elem, null).getPropertyValue(prop);
    }
  </script>
</body>
</html>



[์ฐธ๊ณ ]

W3C :Document Object Model
๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ(DOM)
DOM Core: DOM methods and properties
W3C DOM Compatibility: DOM methods and properties specific to HTML elements