GiantStepDEV
article thumbnail

  • HTML ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•œ ํƒœ๊ทธ, ์ฃผ์„, ํ…์ŠคํŠธ์™€ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์€ ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฐ๊ฐ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ์ธ์‹ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ HTML ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ๋‹ค๋ฃจ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ(DOM)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Document Object Model</title>
</head>
<body>
  <h1>header</h1>
  <a href="#">link</a>
</body>
</html>

DOM ํŠธ๋ฆฌ

  • DOM ํŠธ๋ฆฌ๋Š” document ๊ฐ์ฒด ํ•˜์œ„์— HTML ํƒœ๊ทธ ์š”์†Œ, ์†์„ฑ, ํ…์ŠคํŠธ, ์ฃผ์„ ๋“ฑ์ด 'ํŠธ๋ฆฌ' ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋˜๋Š”๋ฐ, ์ด๋“ค์„ ๊ฐ๊ฐ '๋…ธ๋“œ'๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • document๋Š” ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” html์ด ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ฉ”์†Œ๋“œ๋กœ ๋…ธ๋“œ ์„ ํƒํ•˜๊ธฐ

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ๋ฐ”๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ ๋…ธ๋“œ ์„ ํƒ ๋ฐฉ๋ฒ•์ด ๋งŽ์ด ์“ฐ์ž…๋‹ˆ๋‹ค.

์†์„ฑ๊ฐ’๊ณผ ํƒœ๊ทธ๋ช… ์‚ฌ์šฉ - get ๋ฉ”์†Œ๋“œ

getElementById("id๋ช…")

  • getElementById() ๋ฉ”์†Œ๋“œ๋กœ ์„ ํƒํ•˜๋Š” ์š”์†Œ ๋…ธ๋“œ๋Š” ๋ฌด์กฐ๊ฑด 1๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์š”์†Œ ํ•˜๋‚˜๋งŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
 <h1 id="title">์ œ๋ชฉ ์ž…๋‹ˆ๋‹ค.</h1>
const el = document.getElementById("title");
console.log(el); // <h1 id="title">์ œ๋ชฉ ์ž…๋‹ˆ๋‹ค.</h1>

getElementByclassName("class๋ช…")

  • HTMLCollection ๊ฐ์ฒด๋กœ ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • HTMLCollection ๊ฐ์ฒด๋Š” ์œ ์‚ฌ ๋ฐฐ์—ด์ด๋ผ์„œ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœ ์š”์†Œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
<p class="text">๋ณธ๋ฌธ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค.</p>
<p class="text">๋ณธ๋ฌธ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค.</p>
const classEl = document.getElementsByClassName("text");
console.log(classEl);
/* 0: p.text
   1: p.text
   length: 2 */
console.log(classEl[0]); // <p class="text">๋ณธ๋ฌธ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค.</p>
for(let el of classEl) console.log(el); // ํ–ฅ์ƒ๋œ for๋ฌธ๊ณผ ์œ ์‚ฌ

getElementByTagName("ํƒœ๊ทธ๋ช…")

  • HTMLCollection ๊ฐ์ฒด๋กœ ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์„ ํƒ๊ฐ€๋Šฅํ•˜๊ณ , ํƒœ๊ทธ๋ช…๊ณผ ์ผ์น˜ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
<p class="text">๋ณธ๋ฌธ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค.</p>
<p class="text">๋ณธ๋ฌธ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค.</p>
const tagEl = document.getElementsByTagName("p");
for(let e of tagEl) console.log(e);

CSS ์„ ํƒ์ž ์‚ฌ์šฉํ•˜๊ธฐ - query ๋ฉ”์†Œ๋“œ

querySelector("์„ ํƒ์ž") : 1๊ฐœ๋งŒ

<div class="box-1">
    <p class="text">text-1</p>
    <p class="text">text-2</p>
  </div>
const qEl = document.querySelector(".box-1");
console.log(qEl);

const qEls = document.querySelector(".box-1 .text");
console.log(qEls);

querySelectorAll("์„ ํƒ์ž") : ๋ชจ๋‘ ์„ ํƒ

  • ์ž์‹ ๋…ธ๋“œ ์„ ํƒํ•  ๋•Œ๋Š” ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋กœ ํ•  ๊ฒƒ
const qEls2 = document.querySelectorAll(".box-1 .text");
console.log(qEls2);
console.log(qEls2[0]);

document ๊ฐ์ฒด์˜ get ๋ฉ”์†Œ๋“œ์™€ query ๋ฉ”์†Œ๋“œ๋Š” ๋‘˜ ๋‹ค ์›ํ•˜๋Š” ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค๋Š” ์ ์€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ query ๋ฉ”์†Œ๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ CSS ์„ ํƒ์ž๋ฅผ ์ „๋‹ฌ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— get ๋ฉ”์†Œ๋“œ๋ณด๋‹ค ๋ฒ”์šฉ์„ฑ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ ์กฐ์ž‘ํ•˜๊ธฐ

  • document ๊ฐ์ฒด์˜ ์†์„ฑ์ด๋‚˜ ๋ฉ”์†Œ๋“œ๋กœ ๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ์˜ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ณ  ๋‚˜๋ฉด ์„ ํƒํ•œ ๋…ธ๋“œ์— ์—ฌ๋Ÿฌ ์กฐ์ž‘์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปจํ…์ธ  ์กฐ์ž‘ํ•˜๊ธฐ

๐Ÿ‘‰ ์„ ํƒํ•œ ๋…ธ๋“œ์˜ ํƒ€์ž…์ด ์š”์†Œ ๋…ธ๋“œ(h1, p, ...)๋ผ๋ฉด ๋‹ค์Œ ํ‘œ์— ์ •์˜๋œ ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ์ปจํ…์ธ ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

textContent : ์š”์†Œ ๋…ธ๋“œ์˜ ๋ชจ๋“  ํ…์ŠคํŠธ์— ์ ‘๊ทผ

innerText : ์š”์†Œ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ ์ค‘ ์›น ๋ธŒ๋ผ์šฐ์ €์— ํ‘œ์‹œ๋˜๋Š” ํ…์ŠคํŠธ์— ์ ‘๊ทผ

innerHTML : ์š”์†Œ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ ์ค‘ HTML ํƒœ๊ทธ๋ฅผ ํฌํ•จํ•œ ํ…์ŠคํŠธ ์ ‘๊ทผ

  <p id="title2">Hello, <span style="display: none;">JavaScript!!!</span></p>
let txtContent = document.getElementById("title2").textContent;
let inText = document.getElementById("title2").innerText;
let inHTML = document.getElementById("title2").innerHTML;
console.log(txtContent); // Hello, JavaScript!!!
console.log(inText); // Hello,
console.log(inHTML); // Hello, <span style="display: none;">JavaScript!!!</span>

document.getElementById("title2").innerHTML = "<h1>Rest</h1>"; // ์ง์ ‘ html ์กฐ์ž‘ ๊ฐ€๋Šฅ
innerHTML ์†์„ฑ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ํƒœ๊ทธ๋กœ ์ธ์‹ํ•ด ๋…ธ๋“œ์˜ ์ปจํ…์ธ ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ textContent ์†์„ฑ๊ณผ innerHTML ์†์„ฑ์€ ๋‹จ์ˆœํžˆ ํ…์ŠคํŠธ๋กœ ์ทจ๊ธ‰ํ•ด์„œ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋…ธ๋“œ์˜ ์ปจํ…์ธ ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

์Šคํƒ€์ผ ์กฐ์ž‘ํ•˜๊ธฐ

const sEl = document.querySelectorAll(".text");
for(e of sEl) {
  e.style.backgroundColor = "salmon";
  e.style.fontSize = "50px";
  e.style.color = "fff";
  e.style.fontWeight = "bold";
}
  • ์„ ํƒ๋œ ๋…ธ๋“œ์˜ ํƒ€์ž…์ด ์š”์†Œ ๋…ธ๋“œ๋ผ๋ฉด style ์†์„ฑ์œผ๋กœ ์š”์†Œ์— ์Šคํƒ€์ผ(CSS)์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ์†์„ฑ ์กฐ์ž‘ํ•˜๊ธฐ

  • style ์†์„ฑ์œผ๋กœ ์Šคํƒ€์ผ์„ ์กฐ์ž‘ํ•˜๋ฉด ์†์„ฑ์„ ํ•˜๋‚˜์”ฉ ์ ์–ด์ค˜์•ผ ํ•ด์„œ ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋„ class ์†์„ฑ์„ ์กฐ์ž‘ํ•ด ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ ํƒํ•œ ์š”์†Œ ๋…ธ๋“œ์— class ์†์„ฑ์„ ์ง€์ •ํ•  ๋•Œ๋Š” classList ์†์„ฑ์˜ add(), remove(), toggle() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .active {
      font-size: 2em;
      font-weight: bold;
      line-height: 1px;
    }
    .red-color {
      color: red;
    }
    .blue-color {
      color: blue;
    }
  </style>
</head>
<body>
  <p id="text">text</p>
  <a href="https://google.co.kr">๊ตฌ๊ธ€</a>
  <script src="./230330_2_DOM2.js"></script>
</body>
</html>
const el = document.querySelector("#text");
el.classList.add("active", "blue-color"); // class ์†์„ฑ ์ถ”๊ฐ€
el.classList.remove("active"); // class ์†์„ฑ ์ œ๊ฑฐ

๋ฉ”์†Œ๋“œ ์†์„ฑ์œผ๋กœ ์กฐ์ž‘ํ•˜๊ธฐ

  • ๋ชจ๋“  ์†์„ฑ์„ ์ „์ฒด์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.getAttribute("์†์„ฑ๋ช…") : ์†์„ฑ๊ฐ’์„ ๊ฐ€์ ธ์˜ด

.setAttribute("์†์„ฑ๋ช…", "์†์„ฑ๊ฐ’") : ์†์„ฑ๊ฐ’ ์„ค์ •

.removeAttribute("์†์„ฑ๋ช…") : ์†์„ฑ ์‚ญ์ œ

const aEl = document.querySelector("a"); // a ํƒœ๊ทธ ์„ ํƒ
const href = aEl.getAttribute("href");
console.log(href); // https://google.co.kr
aEl.setAttribute("href", "https://kakao.com");
aEl.innerText = "์นด์นด์˜ค";

๋…ธ๋“œ ์ถ”๊ฐ€/์‚ญ์ œํ•˜๊ธฐ

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

๋…ธ๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ

  • ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ํ™”๋ฉด์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋จผ์ € DOM ํŠธ๋ฆฌ์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑํ•œ ๋…ธ๋“œ๋ฅผ ๊ธฐ์กด์˜ DOM ํŠธ๋ฆฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ ํ•ฉ๋‹ˆ๋‹ค.
// createElement() : ์š”์†Œ ๋…ธ๋“œ ์ƒ์„ฑ
const aEl = document.createElement("div");
// <๊ธฐ์ค€๋…ธ๋“œ>.appendChild(์ถ”๊ฐ€ํ•  ์ž์‹ ๋…ธ๋“œ);
document.body.appendChild(aEl);
aEl.innerText = "Test";

๋…ธ๋“œ ์‚ญ์ œํ•˜๊ธฐ

๋’ค์— ๋‚˜์˜ฌ 'ํˆฌ๋‘๋ฆฌ์ŠคํŠธ' ์˜ˆ์ œ์—์„œ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.


ํผ ์กฐ์ž‘ํ•˜๊ธฐ

form ํƒœ๊ทธ ์„ ํƒํ•˜๊ธฐ

  • HTML ํผ ์š”์†Œ์˜ ์‹œ์ž‘์€ ํ•ญ์ƒ form ํƒœ๊ทธ ์ž…๋‹ˆ๋‹ค.
  • ํผ ์š”์†Œ์—๋Š” input, select, button ํƒœ๊ทธ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํผ ์š”์†Œ๋ฅผ ์„ ํƒํ•  ๋•Œ๋Š” elements ์†์„ฑ์ด๋‚˜ name ์†์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํผ ์š”์†Œ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ’์„ ์ž…๋ ฅ ๋ฐ›์•„ ์„œ๋ฒ„์— ์ „๋‹ฌ ํ•ฉ๋‹ˆ๋‹ค. ์ „๋‹ฌ ๋ฐ›์€ ๊ฐ’์„ ์„œ๋ฒ„์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€๋Š” ๋ฐฑ์—”๋“œ ์˜์—ญ์ด์ง€๋งŒ, ์„œ๋ฒ„์— ์ „๋‹ฌํ•˜๊ธฐ๊นŒ์ง€ ํผ ์š”์†Œ์— ์ž…๋ ฅ๋œ ๊ฐ’์ด ์œ ํšจํ•œ์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›๋Š” ๋Œ€ํ‘œ์ ์ธ ํผ ์š”์†Œ๋กœ๋Š” input๊ณผ select๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

input(text,password,number,url,search,email)

  • ์ด๋Ÿฌํ•œ ์š”์†Œ๋“ค์„ ํ•œ ์ค„ ์š”์†Œ๋“ค์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ชจ๋‘ ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค.
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>input set</title>
</head>
<body>
  <form name="frm">
    <input type="text" name="id">
    <input type="password" name="pw">
  </form>
  <script>
    document.frm.id.value = '๊ณฐ๋Œ์ด์‚ฌ์œก์‚ฌ';
    document.frm.pw.value = 'sphb8250';
  </script>
</body>
</html>

textarea : ์—ฌ๋Ÿฌ ์ค„ ์ž…๋ ฅ ์š”์†Œ

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>textarea</title>
</head>
<body>
  <form name="frm">
    <textarea name="desc"></textarea>
  </form>
  <script>
		document.frm.desc.value = 'setting!';
  </script>
</body>
</html>

์ฒดํฌ๋ฐ•์Šค ๋‹ค๋ฃจ๊ธฐ

  • ์ฒดํฌ๋ฐ•์Šค๋„ value ์†์„ฑ์œผ๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ํ•œ ์ค„ ์ž…๋ ฅ ์š”์†Œ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ฒดํฌ๋ฐ•์Šค์— ์ฒดํฌ ํ‘œ์‹œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ๋งŒ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ!
querySelectorAll์€ DOM์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ, ํŠน์ • ์„ ํƒ์ž(selector)์™€ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ(element)๋ฅผ ์ฐพ์•„ NodeList ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
const checkEl = document.querySelectorAll("[type='checkbox']");
for(let e of checkEl) {
  if(e.value === "orange") e.checked = true;
}

์ฝค๋ณด ๋ฐ•์Šค ๋‹ค๋ฃจ๊ธฐ

const optionEl = document.querySelectorAll("option");
for(let e of optionEl) {
  if(e.value === "orange") e.selected = true;
}

ํŒŒ์ผ ์—…๋กœ๋“œ ๋‹ค๋ฃจ๊ธฐ

function upload() {
  const filePath = document.frm.upload.files;
  console.log(filePath);
}
<form name="frm">
    <input type="file" name="upload">
  </form>
  <button onclick="upload()">ํŒŒ์ผ ์—…๋กœ๋“œ</button>

์‹ค์Šต ์˜ˆ์ œ - ํˆฌ๋‘๋ฆฌ์ŠคํŠธ

  • ์ž…๋ ฅ ํ•„๋“œ๋ฅผ ํ†ตํ•ด ๊ณผ๋ชฉ์„ ์ž…๋ ฅ ๋ฐ›์•„์„œ ๋ฆฌ์ŠคํŠธ ์ถ”๊ฐ€ํ•˜๊ธฐ
  • ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€๋œ ํ•ญ๋ชฉ ํด๋ฆญ์‹œ ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ ์ทจ์†Œ์„  ๊ธ‹๊ธฐ

โœฆ addEventListener() ๋ฉ”์†Œ๋“œ๋Š” ์ด๋ฒคํŠธ(event)๋ฅผ ์š”์†Œ์— ๋“ฑ๋กํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ์ด๋ฒคํŠธ ์œ ํ˜•๊ณผ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.

โœฆ click()์€ ์ด๋ฒคํŠธ ์œ ํ˜• ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ์ด ๊ฒฝ์šฐ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋“ฑ๋ก๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ต๋ช… ํ•จ์ˆ˜๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ, ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    li {
      list-style:none;
      cursor: pointer;
    }
    li.completed {
      text-decoration: line-through;
    }
  </style>
</head>
<body>
  <h1>๐Ÿ”ฅDEV STUDY TO-DO List๐Ÿ”ฅ</h1>
  <p>๊ณต๋ถ€ํ•  ๊ณผ๋ชฉ์„ ์ถ”๊ฐ€ํ•ด๋ณด์„ธ์š”.</p>
  <p>๊ณต๋ถ€๊ฐ€ ๋๋‚œ ๊ณผ๋ชฉ์€ ํด๋ฆญํ•˜์„ธ์š”.</p>
  <label for="stydy">๊ณผ๋ชฉ๋ช…๐Ÿ“š</label>
  <input type="text" id="study">
  <button onclick="addStudy()">์ถ”๊ฐ€ํ•˜๊ธฐ</button>
  <div id="planner"></div>

  <script src="./230330_5_1_์Šคํ„ฐ๋””ํ”Œ๋ž˜๋„ˆ.js"></script>
</body>
</html>
function addStudy() {
  let ul = document.createElement("ul");
  let study = document.getElementById("study").value;
  let li = document.createElement("li");
  li.innerText = study;
  li.onclick = function() {
    li.classList.toggle("completed");
  }
  ul.appendChild(li);

  let studyEl = document.querySelector("#planner");
  studyEl.appendChild(ul);
}


์‹ค์Šต ์˜ˆ์ œ - ํˆฌ๋‘๋ฆฌ์ŠคํŠธ(๊ฐ•์‚ฌ๋‹˜)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./230331_1_ToDoList_๊ฐ•์‚ฌ๋‹˜.css">
</head>
<body>
  <div id="container">
    <h1>To Do List๐Ÿ“š</h1>
    <p>๊ณต๋ถ€ํ•  ๊ณผ๋ชฉ์„ ๊ธฐ๋กํ•ด ๋ณด์„ธ์š”.</p>
    <p>๊ณต๋ถ€๊ฐ€ ๋๋‚œ ๊ณผ๋ชฉ์€ ํด๋ฆญํ•ด์„œ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>
    <form action="">
      <input type="text" id="subject" autofocus>
      <button onclick="newRegister(); return false;">์ถ”๊ฐ€ํ•˜๊ธฐ</button>
    </form>
    <ul id="itemList"></ul>
  </div>
  <script src="./230331_1_ToDoList_๊ฐ•์‚ฌ๋‹˜.js"></script>
</body>
</html>
* {
  box-sizing: border-box;
}
#container {
  width: 500px;
  margin: 20px auto;
  padding: 20px;
}
input[type="text"] {
  width: 370px;
  float: left;
  height: 30px;
  padding-left: 30px;
}
button {
  width: 90px;
  height: 30px;
  float: right;
  background: rgb(2,0,36);
  background: linear-gradient(90deg, rgba(2,0,36,1) 0%, rgba(9,9,121,1) 35%, rgba(0,212,255,1) 100%);
  color: #fff;
  border: none;
}
ul {
  padding-top: 50px;
  list-style: none;
}
li {
  line-height: 2; /* ํฐํŠธ ํฌ๊ธฐ์˜ 2๋ฐฐ */
}
li:hover {
  cursor: pointer;
}ใ„นใ„ฑใ……ใ…Ž
function newRegister() {
  // ulํƒœ๊ทธ ์•„๋ž˜์— ์ถ”๊ฐ€ํ•  ์š”์†Œ ๋…ธ๋“œ ์ƒ์„ฑ
  let newItem = document.createElement("li");
  // ์‚ฌ์šฉ์ž๊ฐ€ input์— ์ž…๋ ฅํ•œ ๊ฐ’ ๋‹ด๊ธฐ
  let subject = document.querySelector("#subject");
  // html ๋ฌธ์„œ์— ์ƒˆ๋กœ์šด ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ฌ.
  let newText = document.createTextNode(subject.value);
  // ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
  newItem.appendChild(newText);

  let itemList = document.querySelector("#itemList");

  // insertBefore() ๋ฉ”์†Œ๋“œ๋Š” DOM ์š”์†Œ๋ฅผ ํŠน์ • ์š”์†Œ ์ด์ „์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  // ์ž์‹ ๋…ธ๋“œ ์ค‘ ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ ์•ž์— ์ถ”๊ฐ€
  itemList.insertBefore(newItem, itemList.childNodes[0]);

  // ์ž…๋ ฅํ•˜๋ฉด ์นธ ๋น„์›Œ์คŒ
  subject.value = "";
  // ๋ฒ„ํŠผ ๋ˆ„๋ฅธ ๋’ค input(#subject)์— ์ž๋™์œผ๋กœ ํฌ์ปค์Šค ๊ฐ€๋„๋ก..
  document.getElementById("subject").focus();

  let items = document.querySelectorAll("li");
  for(let e of items) {
    e.addEventListener("click", function() {
      // ์—ฌ๊ธฐ์„œ์˜ this๋Š” ํด๋ฆญํ•œ ์š”์†Œ ๊ทธ ์ž์ฒด
      if(this.parentNode) { // ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์š”์†Œ์˜ ๋ถ€๋ชจ๊ฐ€ ์žˆ์œผ๋ฉด ..
        this.parentNode.removeChild(this);
      }
    });
  }
}

์ถ”๊ฐ€๋œ ์‚ฌํ•ญ!

  • ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ์ถ”๊ฐ€ํ•˜๊ธฐ ๋ˆŒ๋ €์„ ๋•Œ input์— ์ž๋™ ์ปค์„œ
  • ์ž…๋ ฅํ•˜๋ฉด ์นธ ์ž๋™ ๋น„์›Œ์คŒ
  • ์ตœ๊ทผ์— ๋“ฑ๋กํ•œ๊ฒŒ ๋งจ ์œ„๋กœ ์˜ฌ๋ผ์˜ค๊ฒŒ ํ•˜๊ธฐ
profile

GiantStepDEV

@kongmi

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!