๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Study/JavaScript

[๋ชจ๋˜์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ]05 DOM์˜ ๊ธฐ์ดˆ

05-1. DOM๊ณผ DOMํŠธ๋ฆฌ

DOM: Document Object Model, ๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ

 

DOM์ด๋ž€

  • DOM: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ™์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์›น ๋ฌธ์„œ์— ์ ‘๊ทผํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์›น ๋ฌธ์„œ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ •๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•
  • DOM์—์„œ๋Š” ์›น ๋ฌธ์„œ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ์ •์˜ํ•˜๊ณ , ์›น ๋ฌธ์„œ๋ฅผ ์ด๋ฃจ๋Š” ๋ชจ๋“  ์š”์†Œ(ํ…์ŠคํŠธ, ์ด๋ฏธ์ง€, ํ‘œ ๋“ฑ)๋„ ๊ฐ๊ฐ ๊ฐ์ฒด๋กœ ์ •์˜ํ•จ
    ex) ์›น ๋ฌธ์„œ ์ „์ฒด → document ๊ฐ์ฒด, ์›น ๋ฌธ์„œ์— ์‚ฝ์ž…๋œ ์ด๋ฏธ์ง€ → image ๊ฐ์ฒด (→ '๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ' ์ด๋ผ๊ณ  ํ•จ)
  • ์›น ๋ฌธ์„œ์˜ ๊ฐ์ฒด๋“ค๋„ ๊ฐ์ฒด์ด๋ฏ€๋กœ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

 

DOM ํŠธ๋ฆฌ

  • ์›น ๋ฌธ์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํƒœ๊ทธ๊ฐ€ ์„œ๋กœ ํฌํ•จ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ. ์ด๋Ÿฐ ๊ด€๊ณ„ ๋•Œ๋ฌธ์— ๊ฐ ํƒœ๊ทธ ๊ฐ„์—๋Š” '๋ถ€๋ชจ'์™€ '์ž์‹' ๊ด€๊ณ„๊ฐ€ ์ƒ๊น€
<!DOCTYPE html>
<html lang = "ko">
<head>
	<title>DOM Tree ์•Œ์•„๋ณด๊ธฐ</title>
</head>
<body>
	<h1>Do it!</h1>
    <img src="images/doit.jpg" alt="๊ณต๋ถ€ํ•˜๋Š” ์ด๋ฏธ์ง€">
</body>
</html>
  • html ์š”์†Œ → head ์š”์†Œ์™€ body ์š”์†Œ์˜ ๋ถ€๋ชจ ์š”์†Œ
  • body ์š”์†Œ → h1 ์š”์†Œ์™€ img ์š”์†Œ์˜ ๋ถ€๋ชจ ์š”์†Œ
  • ht ์š”์†Œ, img ์š”์†Œ → body ์š”์†Œ์˜ ์ž์‹ ์š”์†Œ

DOM์˜ ๊ณ„์ธต ๊ตฌ์กฐ(DOM ํŠธ๋ฆฌ)

  • ๋…ธ๋“œ(node): DOM ํŠธ๋ฆฌ์—์„œ ๊ฐ€์ง€๊ฐ€ ๊ฐˆ๋ผ์ ธ ๋‚˜์˜ค๋Š” ๋ถ€๋ถ„
  • ๋ฃจํŠธ(root) ๋…ธ๋“œ: DOM ํŠธ๋ฆฌ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์ธ html ๋…ธ๋“œ
  • ํ˜•์ œ ๋…ธ๋“œ: ๊ฐ™์€ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๋“ค

 

 

05-2. ์›น ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ

  • ์›น ์š”์†Œ์— ์ ‘๊ทผํ•œ๋‹ค: ์›น ๋ฌธ์„œ์— ์žˆ๋Š” ์ด๋ฏธ์ง€, ํ…์ŠคํŠธ, ํ‘œ ๋“ฑ ํŠน์ • ์š”์†Œ๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ฒƒ

 

ํ•˜๋‚˜๋งŒ ์ฝ• ์ง‘์–ด๋‚ด๋Š” querySelector() ํ•จ์ˆ˜

โ€ป CSS ์„ ํƒ์ž ์ข…๋ฅ˜

์„ ํƒ์ž ๊ธฐ๋Šฅ ์‚ฌ์šฉ ์˜ˆ
ํƒ€์ž… ์„ ํƒ์ž ํŠน์ • ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ ๋ชจ๋“  ์š”์†Œ p { ... }
class ์„ ํƒ์ž ํด๋ž˜์Šค๋ช…์„ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ๋ถ€๋ถ„ .accent { ... }
id ์„ ํƒ์ž id๋ช…์„ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ๋ถ€๋ถ„ #container { ... }
ํ•˜์œ„ ์„ ํƒ์ž A ์š”์†Œ์˜ ํ•˜์œ„์— ์žˆ๋Š” ๋ชจ๋“  B ์š”์†Œ form input { ... }
์ž์‹ ์„ ํƒ์ž A ์š”์†Œ์˜ ํ•˜์œ„์— ์žˆ๋Š” ์š”์†Œ ์ค‘ ์ž์‹ ๋ ˆ๋ฒจ์˜ B ์š”์†Œ ul > li { ... }
  • ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์›น ์š”์†Œ๋ฅผ ์ ‘๊ทผํ•  ๋•Œ querySelctor() ํ•จ์ˆ˜๋‚˜ querySelectorAll() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ
    → ์ด ํ•จ์ˆ˜๋“ค์€ doucment ๊ฐ์ฒด์— ํฌํ•จ๋˜์–ด ์žˆ์Œ
    (๊ฐ์ฒด์— ํฌํ•จ๋œ ํ•จ์ˆ˜๋ฅผ '๋ฉ”์„œ๋“œ'๋ผ๊ณ ๋„ ํ•จ)
  • querySelector() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ง€์ •ํ•œ ์„ ํƒ์ž๋ฅผ ์š”์†Œ ์ค‘ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ
document.querySelector(์„ ํƒ์ž)

// ex) id="container"๋ฅผ ์‚ฌ์šฉํ•œ ์š”์†Œ์— ์ ‘๊ทผ
document.querySelector("#container")

 

  • querySelector() ํ•จ์ˆ˜์—์„œ class ์„ ํƒ์ž๋‚˜ ํƒ€์ž… ์„ ํƒ์ž(ํƒœ๊ทธ ์„ ํƒ์ž)๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฆ„
    → querySelector() ํ•จ์ˆ˜์—์„œ class ์„ ํƒ์ž๋‚˜ ํƒ€์ž… ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ ์šฉ๋œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์†Œ ์ค‘ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋งŒ ๊ฐ€์ ธ์˜ด
    (querySelector() ํ•จ์ˆ˜๋Š” 1๊ฐœ์˜ ์š”์†Œ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ)

 

๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” querySelectorAll() ํ•จ์ˆ˜

  • querySelectorAll() : ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉ
document.querySelectorAll(์„ ํƒ์ž)

 

// ex) .html ๋ฌธ์„œ - user ํด๋ž˜์Šค ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•œ ์š”์†Œ 3๊ฐœ
<p class="user">์ด๋ฆ„: ๋„๋ ˆ๋ฏธ</P>
<p class="user">์ฃผ์†Œ: somewhere</p>
<p class="user">์—ฐ๋ฝ์ฒ˜: 1234-5678</p>

 

  • querySelector() ํ•จ์ˆ˜์™€ querySelectorAll() ํ•จ์ˆ˜๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „์—๋Š” getElement๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•จ

โ€ป getElement*๋ฉ”์„œ๋“œ์˜ ์ข…๋ฅ˜

๋ฉ”์„œ๋“œ๋ช… ๊ธฐ๋Šฅ
getElementByld(id ๋ช…) id ์„ ํƒ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ ‘๊ทผ
getElementsByClassName(class ๋ช…) class ์„ ํƒ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ ‘๊ทผ
getElementsByTagName(ํƒœ๊ทธ๋ช…) ํƒœ๊ทธ ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ์ ‘๊ทผ

 

์›น ์š”์†Œ์˜ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ

  • ์›น ์š”์†Œ์— ์ ‘๊ทผํ•œ ํ›„ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์˜ innerText ํ”„๋กœํผํ‹ฐ, innerHTML ํ”„๋กœํผํ‹ฐ, textContent ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•จ
    (ํ”„๋กœํผํ‹ฐ(property): ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์—์„œ ์†์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์šฉ์–ด)

 

์›น ์š”์†Œ์˜ ๋‚ด์šฉ ๊ฐ€์ ธ์˜ค๊ธฐ

// 3๊ฐ€์ง€ ํ”„๋กœํ”„ํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›น ์š”์†Œ์— ์ ‘๊ทผํ•˜์—ฌ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ
์›น ์š”์†Œ.innerText
์›น ์š”์†Œ.innerHTML
์›น ์š”์†Œ.textContent

 

ex) ์›น ์š”์†Œ์˜ ๋‚ด์šฉ ๊ฐ€์ ธ์˜ค๊ธฐ

// .html
// ์ƒ๋žต
    <div id="profile">
      <img src="images/pf.png" alt="๋„๋ ˆ๋ฏธ">
      <div id="desc">
        <p class="user">์ด๋ฆ„     :     ๋„๋ ˆ๋ฏธ</p>
        <p class="user" style="display:none">์ฃผ์†Œ     :     somewhere</p>
        <p class="user" style="display:none">์—ฐ๋ฝ์ฒ˜     :     1234-5678</p>
      </div>
// ์ƒ๋žต
  • sytle="display:none" : ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š๊ฒŒ ๊ฐ์ถค

  • innerText ํ”„๋กœํผํ‹ฐ: ์›น ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์— ๋ณด์ด๋Š” ๋‚ด์šฉ๋งŒ ๊ฐ€์ ธ์˜ด
  • innerHTML ํ”„๋กœํผํ‹ฐ: #desc ์š”์†Œ ์•ˆ์— ์žˆ๋Š” ํƒœ๊ทธ์™€ ๋‚ด์šฉ์„ ํ•จ๊ป˜ ๊ฐ€์ ธ์™€์„œ ๋ณด์—ฌ์คŒ. ์†Œ์Šค์— ์žˆ๋Š”๋Œ€๋กœ ๊ฐ€์ ธ์˜ด
  • textContent ํ”„๋กœํผํ‹ฐ: ์š”์†Œ์˜ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ค๋˜, ์›น ๋ธŒ์•„๋ฃจ์ € ์ฐฝ์— ๋ณด์ด๋Š” ๋Œ€๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ ์†Œ์Šค์— ์žˆ๋Š” ๋Œ€๋กœ ๊ฐ€์ ธ์˜ด
    → ๊ฐ์ถฐ์ง„ ์š”์†Œ๋“ค๊นŒ์ง€ ๊ฐ€์ ธ์™€์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ๊ฒฝ์šฐ ์œ ์šฉ

 

์›น ์š”์†Œ์˜ ๋‚ด์šฉ ์ˆ˜์ •ํ•˜๊ธฐ

  • innerText, innerHTML, textContent ํ”„๋กœํผํ‹ฐ๋Š” ์›น ์š”์†Œ์˜ ๋‚ด์šฉ์„ ๋ฐ”๊ฟ€ ๋•Œ๋„ ์‚ฌ์šฉํ•จ
  • innerText, textContent ํ”„๋กœํผํ‹ฐ: ํ…์ŠคํŠธ ๋‚ด์šฉ์„ ๋ฐ”๊ฟ€๋•Œ ์‚ฌ์šฉ
    innerHTML ํ”„๋กœํผํ‹ฐ: HTML ํƒœ๊ทธ๊ฐ€ ํฌํ•จ๋œ ๋‚ด์šฉ์„ ๋ฐ”๊ฟ€ ๋•Œ ์‚ฌ์šฉ
์›น ์š”์†Œ.innerText = ๋‚ด์šฉ
์›น ์š”์†Œ.innerHTMl = ๋‚ด์šฉ
์›น ์š”์†Œ.textContent = ๋‚ด์šฉ

// ์ด๋ฏธ์ง€ ์š”์†Œ์— ์ ‘๊ทผํ›„ src ์†์„ฑ๊ฐ’์„ ๋ฐ”๊พธ์–ด ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ
์ด๋ฏธ์ง€ ์š”์†Œ.src = ์ด๋ฏธ์ง€ ํŒŒ์ผ

 

 

05-3. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์Šคํƒ€์ผ ์ˆ˜์ •ํ•˜๊ธฐ

CSS ์†์„ฑ์— ์ ‘๊ทผํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ

  • CSS ์†์„ฑ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ์š”์†Œ์— ์ ‘๊ทผํ•œ ํ›„ ์˜ˆ์•ฝ์–ด .style๊ณผ CSS ์†์„ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
์š”์†Œ.style.์†์„ฑ๋ช…
  • ๊ธ€์ž์ƒ‰ ์ ‘๊ทผ → style.color
  • ๋ฐฐ๊ฒฝ์ƒ ์ ‘๊ทผ → style.backgroundColor
    (background-Color ์†์„ฑ์ฒ˜๋Ÿผ ๋‘ ๋‹จ์–ด ์ด์ƒ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์†์„ฑ์— ์ ‘๊ทผํ•  ๋•Œ๋Š” ์ค‘๊ฐ„์— ๋Œ€์‹œ(-) ์—†์ด ์—ฐ๊ฒฐํ•ด์„œ ์‚ฌ์šฉ → ์ฒซ๊ธ€์ž๋Š” ์†Œ๋ฌธ์ž, ๋‘๋ฒˆ์งธ ๊ธ€์ž๋Š” ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘)

 

// ex) ์ œ๋ชฉ ๋ถ€๋ถ„์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ๊ธ€์ž์ƒ‰๊ณผ ๊ธ€์ž ๋ฐฐ๊ฒฝ์ƒ‰ ๋ฐ”๊พธ๊ธฐ
const tilte = document.querySelector("#title");	// #title ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ด

title.onclick = () => {
	title.style.backgroundColor = "black";	// title ์š”์†Œ์˜ ๋ฐฐ๊ฒฝ์ƒ‰ ์ˆ˜์ •
    title.style.color = "white";	// title ์š”์†Œ์˜ ๊ธ€์ž์ƒ‰ ์ˆ˜์ •
}

 

classList ํ”„๋กœํผํ‹ฐ ์‚ดํŽด๋ณด๊ธฐ

  • classList ํ”„๋กœํผํ‹ฐ: ์š”์†Œ์— ์ ์šฉํ•œ ํด๋ž˜์Šค ์Šคํƒ€์ผ์„ ๋ชจ๋‘ ๋ชจ์•„ ๋†“์€ ํ”„๋กœํผํ‹ฐ (DOM์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•จ)
    (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šค ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œํ•˜๋ฉฐ ๋‹ค์–‘ํ•œ ํšจ๊ณผ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”๋ฐ classList ํ”„๋กœํผํ‹ฐ ๋•Œ๋ฌธ)
// .html
// ์ƒ๋žต
    <div id="desc">
      <p class="user clicked">์ด๋ฆ„ : ๋„๋ ˆ๋ฏธ</p>
      <p class="user">์ฃผ์†Œ : somewhere</p>
      <p class="user">์—ฐ๋ฝ์ฒ˜ : 1234-5678</p>
    </div>
// ์ƒ๋žต

  • <div> ํƒœ๊ทธ ์•ˆ์— 3๊ฐœ์˜ <p> ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ฐ ์š”์†Œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค ์Šคํƒ€์ผ์€ classList ํ”„๋กœํผํ‹ฐ์— ์ €์žฅ๋˜์–ด ์žˆ์Œ
  • user๋ผ๋Š” ํด๋ž˜์Šค ์Šคํƒ€์ผ๊ณผ clicked ๋ผ๋Š” ํด๋ž˜์Šค ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Œ

 

ํด๋ž˜์Šค ์Šคํƒ€์ผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‚ญ์ œํ•˜๊ธฐ

  • ํด๋ž˜์Šค ์Šคํƒ€์ผ ์ถ”๊ฐ€ → add() ํ•จ์ˆ˜ ์‚ฌ์šฉ
  • ํด๋ž˜์Šค ์Šคํƒ€์ผ ์‚ญ์ œ → remove() ํ•จ์ˆ˜ ์‚ฌ์šฉ
์š”์†Œ.classList.add(ํด๋ž˜์Šค๋ช…)
์š”์†Œ.classList.remove(ํด๋ž˜์Šค๋ช…)

 

ํด๋ž˜์Šค ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” add() ํ•จ์ˆ˜

ex) ์ œ๋ชฉ ํ…์ŠคํŠธ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ background-color ์†์„ฑ๊ณผ color ์†์„ฑ ๋ณ€๊ฒฝ 

// .css
h1 {
  font-size:2rem;  
  margin-bottom:20px ;
}
.clicked {
  background-color:yellow;
  color: blue;
}

 

const title = document.querySelector("#title");

title.onclick = () => {
  title.classList.add("clicked");
}

 

  • ์ œ๋ชฉ ํ…์ŠคํŠธ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ์ ์šฉํ•  ์Šคํƒ€์ผ์„ ๋ฏธ๋ฆฌ .clicked ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋งŒ๋“ค์–ด ๋‘ 
  • ์ œ๋ชฉ ํ…์ŠคํŠธ๋ฅผ ํด๋ฆญํ•˜๋ฉด classList์˜ add() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด .clicked ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•จ

 

๋”๋ณด๊ธฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ

const tilte = document.querySelector("#title");	// #title ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ด

title.onclick = () => {
	title.style.backgroundColor = "black";	// title ์š”์†Œ์˜ ๋ฐฐ๊ฒฝ์ƒ‰ ์ˆ˜์ •
    title.style.color = "white";	// title ์š”์†Œ์˜ ๊ธ€์ž์ƒ‰ ์ˆ˜์ •
}

 

ํด๋ฆญํ–ˆ์„ ๋•Œ์˜ ํด๋ž˜์Šค ์Šคํƒ€์ผ์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘๊ณ  ์ œ๋ชฉ์„ ํด๋ฆญํ•˜๋ฉด ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘” ํด๋ž˜์Šค ์Šคํƒ€์ผ ์ ์šฉ

// .css
h1 {
  font-size:2rem;  
  margin-bottom:20px ;
}
.clicked {
  background-color:yellow;
  color: blue;
}

// .js
const title = document.querySelector("#title");

title.onclick = () => {
  title.classList.add("clicked");
}

ํด๋ฆญ ํ–ˆ์„ ๋•Œ ์Šคํƒ€์ผ๋งŒ ๋ฐ”๋€๋‹ค๋ฉด ๋ณดํ†ต ํ›„์ž์˜ ๋ฐฉ๋ฒ•์„ ๋งŽ์ด ์‚ฌ์šฉํ•จ

 

ํŠน์ • ํด๋ž˜์Šค ์Šคํƒ€์ผ์ด ์žˆ๋Š” ์š”์†Œ๋ฅผ ์ฐพ์•„ ์ฃผ๋Š” contains() ํ•จ์ˆ˜

์š”์†Œ.classList.contains(ํด๋ž˜์Šค๋ช…)

 

// ex) ์ œ๋ชฉ ํด๋ฆญํ•ด ๋ฐฐ๊ฒฝ์ƒ‰๊ณผ ๊ธ€์ž์ƒ‰ ๋ณ€๊ฒฝ. ์ดํ›„ ์›๋ž˜๋Œ€๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ
const title = document.querySelector("#title");

title.onclick = () => {
  if(!title.classList.contains("clicked")){
    title.classList.add("clicked");
  } else {
    title.classList.remove("clicked");
  }
}

 

ํด๋ž˜์Šค ์Šคํƒ€์ผ ํ† ๊ธ€ํ•˜๊ธฐ

  • ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ํŠน์ • ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒฝ์šฐ, classList์˜ toggle() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌ
์š”์†Œ.classList.toggle(ํด๋ž˜์Šค๋ช…)

 

// ex) ์•ž์—์„œ ํ•œ ์ฝ”๋“œ toggle() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ˆ˜์ •
const title = document.querySelector("#title");

title.onclick = () => {
  title.classList.toggle("clicked");
}

 

 

05-4. DOM์—์„œ ํผ ๋‹ค๋ฃจ๊ธฐ

ํผ: ์›น ๋ฌธ์„œ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด ๋†“์€ ์›น ์š”์†Œ

 

ํผ ์š”์†Œ์—์„œ ์ ‘๊ทผํ•˜๊ณ  ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•

id๋‚˜ class ์†์„ฑ๊ฐ’์„ ์‚ฌ์šฉํ•ด ํผ ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ

// .html
// ex) '์ด๋ฆ„' ํ•ญ๋ชฉ์— ์‚ฌ์šฉ๋œ id ๊ฐ’ ํ™•์ธํ•˜๊ธฐ
<!DOCTYPE html>
<html lang="ko">
<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>ํผ๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ</title>
	<link rel="stylesheet" href="css/order.css">
</head>
<body>
	<div id="container">
		<form name="order">
      <fieldset>
				<legend>์ƒํ’ˆ ์ •๋ณด</legend>
				<ul>
					<li>
						<label class="field" for="product">์ƒํ’ˆ : </label>
						<input type="text" class="input-box" id="product" name="product">
					</li>
					<li>
						<label class="field" for="prod-num">๊ฐฏ์ˆ˜ : </label>
						<input type="number" class="input-box"  id="prod-num" name="prod-num" value="1" min="1">
					</li>
				</ul>
			</fieldset>
			<fieldset>
				<legend>์ฃผ๋ฌธ ์ •๋ณด</legend>
				<ul>
					<li>
						<label class="field" for="order-name">์ด๋ฆ„ : </label>
						<input type="text" class="input-box" id="order-name" name="order-name">
					</li>
					<li>
						<label class="field" for="order-tel">์—ฐ๋ฝ์ฒ˜ : </label>
						<input type="text" class="input-box" id="order-tel" name="order-tel">	
					</li>
					<li>
						<label class="field" for="order-addr">์ฃผ์†Œ : </label>
						<input type="text" class="input-box" id="order-addr" name="order-addr">
					</li>
				</ul>
			</fieldset>
	
			<button type="submit" class="order">์ฃผ๋ฌธํ•˜๊ธฐ</button>
		</form>		
	</div>

</body>
</html>

 

ํ…์ŠคํŠธ ํ•„๋“œ์— ์ž…๋ ฅํ•œ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

  • value ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํผ ์š”์†Œ ์ค‘ ํ…์ŠคํŠธ ํ•„๋“œ๋‚˜ ์ด๋ฉ”์ผ ํ•„๋“œ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ
์š”์†Œ.value

ex) '์ด๋ฆ„' ํ•„๋“œ์— ์ด๋ฆ„์„ ์ž…๋ ฅํ•œ ํ›„ ๋‚ด์šฉ ๊ฐ€์ ธ์˜ค๊ธฐ

 

name ์†์„ฑ๊ฐ’์„ ์‚ฌ์šฉํ•ด ํผ ์š”์†Œ ์ ‘๊ทผํ•˜๊ธฐ

  • id๋‚˜ class ์†์„ฑ ์—†์ด name ์†์„ฑ๋งŒ ์žˆ์œผ๋ฉด name ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•ด ํผ ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ
  • name ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ํผ ์š”์†Œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด <form> ํƒœ๊ทธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์›ํ•˜๋Š” ํผ ์š”์†Œ๊นŒ์ง€ ๊ณ„์ธต์„ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ name์„ ์ง€์ •ํ•ด์•ผ ํ•จ

  • order: form์˜ name
  • product: input์˜ name

 

ํผ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด ํผ ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ

  • ํผ ์š”์†Œ์— id, class, name ์†์„ฑ์ด ์—†๋Š” ๊ฒฝ์šฐ ํผ ๋ฐฐ์—ด์„ ์‚ฌ์šฉ
  • document์˜ ์†์„ฑ ์ค‘ forms ์†์„ฑ์€ ๋ฌธ์„œ์— ์žˆ๋Š” <form> ํƒœ๊ทธ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•œ ํ˜•ํƒœ๋กœ ์ €์žฅํ•จ
    (๋ฌธ์„œ์— ํผ์ด 2๊ฐœ ์ด์ƒ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž„)
  • <form> ํƒœ๊ทธ ์•ˆ์— ์žˆ๋Š” ์š”์†Œ์— ์ ‘๊ทผํ•  ๋•Œ๋Š” ํ•ด๋‹น ํผ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜จ๋Š” elements ์†์„ฑ์„ ์‚ฌ์šฉ
document.form	// ๋ชจ๋“  form์„ ๊ฐ€์ ธ์˜ด
document.forms[0].elements	// ์ฒซ ๋ฒˆ์งธ form์— ์žˆ๋Š” ํผ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ด

 

 

์„ ํƒ ๋ชฉ๋ก๊ณผ ํ•ญ๋ชฉ์— ์ ‘๊ทผํ•˜๊ธฐ

  • <select> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ ๋ชฉ๋ก → '์„ ํƒ ๋ชฉ๋ก' (ํŒ์—… ๋ฉ”๋‰ด, select ๋ฉ”๋‰ด, select ๋ชฉ๋ก ์ด๋ผ๊ณ ๋„ ํ•จ)
  • ์„ ํƒ ๋ชฉ๋ก์€ <option> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ํ•œ๊บผ๋ฒˆ์— ์ง€์ •ํ•œ ํ›„ ๋ชฉ๋ก์„ ํŽผ์ณ์„œ ์›ํ•˜๋Š” ํ•ญ๋ชฉ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ

 

์„ ํƒ ๋ชฉ๋ก์— ์ ‘๊ทผํ•˜๊ธฐ

// .html
// ์„ ํƒ ๋ชฉ๋ก ์†Œ์Šค
<!DOCTYPE html>
<html lang="ko">
<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>์ˆ˜๊ฐ•์‹ ์ฒญํ•˜๊ธฐ</title>
	<link rel="stylesheet" href="css/getForm.css">
</head>
<body>
	<div id="container">
		<h1>์ˆ˜๊ฐ•์‹ ์ฒญ</h1>
		<form name="testForm">
			<fieldset>
				<legend>์‹ ์ฒญ์ธ</legend>
				<ul>
					<li>       	
						<label class="reg" for="userName">์ด๋ฆ„</label>
						<input type="text" id="userName" name="userName" maxlength="50">               
					</li>
					<li>
						<label class="reg" for="class">ํ•™๊ณผ</label>
						<select name="major" id="major">
							<option>---- ํ•™๊ณผ ์„ ํƒ ----</option>
							<option value="archi">๊ฑด์ถ•๊ณตํ•™๊ณผ</option>
							<option value="mechanic">๊ธฐ๊ณ„๊ณตํ•™๊ณผ</option>
							<option value="indust">์‚ฐ์—…๊ณตํ•™๊ณผ</option>
							<option value="elec">์ „๊ธฐ์ „์ž๊ณตํ•™๊ณผ</option>
							<option value="computer">์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ</option>
							<option value="chemical">ํ™”ํ•™๊ณตํ•™๊ณผ</option>
						</select>
					</li>
				</ul>				
			</fieldset>
			<fieldset>
				<legend>์‹ ์ฒญ ๊ณผ๋ชฉ</legend>
				<p>์ด ๋‹ฌ์— ์‹ ์ฒญํ•  ๊ณผ๋ชฉ์„ ์„ ํƒํ•˜์„ธ์š”.</p>
				<label><input type="radio" name="subject" value="speaking">ํšŒํ™”</label>
				<label><input type="radio" name="subject" value="grammar">๋ฌธ๋ฒ•</label>
				<label><input type="radio" name="subject" value="writing">์ž‘๋ฌธ</label>       
			</fieldset>
			<fieldset>
				<legend>๋ฉ”์ผ๋ง</legend>
				<p>๋ฉ”์ผ๋กœ ๋ฐ›๊ณ  ์‹ถ์€ ๋‰ด์Šค ์ฃผ์ œ๋ฅผ ์„ ํƒํ•ด ์ฃผ์„ธ์š”</p>
				<label><input type="checkbox" id="new" name="mailing" value="news">ํ•ด์™ธ ๋‹จ์‹ </label>
				<label><input type="checkbox" id="dialog" name="mailing" value="dialog">5๋ถ„ ํšŒํ™”</label>
				<label><input type="checkbox" id="pops" name="mailing" value="pops">๋ชจ๋‹ํŒ์Šค</label>
			</fieldset>
		</form>
    <button id="send">์ „์†กํ•˜๊ธฐ</button>
	</div>

	<script src="js/getForm.js"></script>
</body>
</html>

  • length ์†์„ฑ: ์˜ต์…˜ ํ•ญ๋ชฉ์˜ ๊ฐœ์ˆ˜
  • selectedIndex: ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์˜ต์…˜์˜ ์ธ๋ฑ์Šค๊ฐ’ ์ €์žฅ๋จ(์•„์ง ์„ ํƒํ•œ ํ•ญ๋ชฉ์ด ์—†์œผ๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” 0๊ธฐ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋“ค์–ด์žˆ๋Š” ์ƒํƒœ)

 

์•Œ๋ฆผ ์ฐฝ์— ์„ ํƒํ•œ ํ•ญ๋ชฉ ํ‘œ์‹œํ•˜๊ธฐ

  • ์„ ํƒํ•œ ํ•ญ๋ชฉ์˜ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” innerText ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จ
  • ์„ ํƒ ๋ชฉ๋ก์— ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ๋Š” onclick์ด ์•„๋‹Œ onchange๋ฅผ ์‚ฌ์šฉ
const selectMenu = document.querySelector("#major");  // ์„ ํƒ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์™€ selectMenu๋กœ ์ €์žฅ

function displaySelect() {
	let selectedText = selectMenu.options[selectMenu.selectedIndex].innerText;		
	alert(`[${selectedText}]๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.`);
}		

selectMenu.onchange = displaySelect;

 

๋ผ๋””์˜ค ๋ฒ„ํŠผ๊ณผ ์ฒดํฌ ๋ฐ•์Šค์— ์ ‘๊ทผํ•˜๊ธฐ

  • ๋ผ๋””์˜ค ๋ฒ„ํŠผ: ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ•ญ๋ชฉ ์ค‘ ํ•˜๋‚˜๋งŒ ์„ ํƒ ๊ฐ€๋Šฅ
  • ์ฒดํฌ ๋ฐ•์Šค: ์—ฌ๋Ÿฌ ๊ฐœ ์„ ํƒ ๊ฐ€๋Šฅ
// ์ƒ๋žต
			<fieldset>
				<legend>์‹ ์ฒญ ๊ณผ๋ชฉ</legend>
				<p>์ด ๋‹ฌ์— ์‹ ์ฒญํ•  ๊ณผ๋ชฉ์„ ์„ ํƒํ•˜์„ธ์š”.</p>
				<label><input type="radio" name="subject" value="speaking">ํšŒํ™”</label>
				<label><input type="radio" name="subject" value="grammar">๋ฌธ๋ฒ•</label>
				<label><input type="radio" name="subject" value="writing">์ž‘๋ฌธ</label>       
			</fieldset>
// ์ƒ๋žต
  • ๋ผ๋””์˜ค ๋ฒ„ํŠผ์ด๋‚˜ ์ฒดํฌ ๋ฐ•์Šค๋Š” ๊ฐ ํ•ญ๋ชฉ๋“ค์˜ name ๊ฐ’์ด ๋ชจ๋‘ ๊ฐ™์Œ → ๊ทธ๋ฃน ์•ˆ์—์„œ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜๋ฏ€๋กœ ๊ทธ๋ฃน๋ณ„๋กœ ๊ฐ™์€ name์„ ๋ถ™์˜€๊ธฐ ๋•Œ๋ฌธ

 

๋ผ๋””์˜ค ๋ฒ„ํŠผ์— ์ ‘๊ทผํ•˜๊ธฐ

  • ๋ผ๋””์˜ค ๋ฒ„ํŠผ์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ•ญ๋ชฉ์ด ์žˆ์–ด๋„ ํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ์ด๋ฏ€๋กœ name ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ์ ‘๊ทผ

  • '๋ฌธ๋ฒ•' ํ•ญ๋ชฉ์„ ์„ ํƒํ–ˆ์œผ๋ฉด HTML ์†Œ์Šค์—์„œ ์ง€์ •ํ•œ value ๊ฐ’์ธ grammar๊ฐ€ ์ €์žฅ๋จ

 

์ฒดํฌ ๋ฐ•์Šค์— ์ ‘๊ทผํ•˜๊ธฐ

  • ์ฒดํฌ ๋ฐ•์Šค๋„ ํ•˜๋‚˜์˜ ์ฃผ์ œ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ ํ•ญ๋ชฉ์˜ name ๊ฐ’์„ ๋˜‘๊ฐ™์ด ๋งŒ๋“ค์–ด์•ผ ํ•จ
  • ๋ผ๋””์˜ค ๋ฒ„ํŠผ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ name ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผ

 

checked ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ์„ ํƒํ•œ ํ•ญ๋ชฉ์— ์ ‘๊ทผํ•˜๊ธฐ

  • ๋ผ๋””์˜ค ๋ฒ„ํŠผ์ด๋‚˜ ์ฒดํฌ ๋ฐ•์Šค์—๋Š” checked ์†์„ฑ์ด ์žˆ์Œ
  • checked ์†์„ฑ → ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์„ ํƒํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ๋‘๊ฐ€์ง€ ๊ฐ’๋งŒ ๊ฐ€์ง€๋ฏ€๋กœ ๋…ผ๋ฆฌํ˜• ๊ฐ’์œผ๋กœ ํ‘œํ˜„
  • ํŠน์ • ํ•ญ๋ชฉ ์„ ํƒ์‹œ checked ์†์„ฑ์€ true๊ฐ€ ๋จ (์„ ํƒํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ false)

 

 

 

 

๊ต์žฌ: Do it! ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ •์„