포스트

[Vanilla JS] DOM 요소 수정: 텍스트·속성·클래스·스타일·구조 변경

[Vanilla JS] DOM 요소 수정: 텍스트·속성·클래스·스타일·구조 변경

DOM 요소 수정은 화면에 보이는 값이나 상태를 실제로 바꾸는 단계이다.
사용자 입력에 따라 텍스트를 갱신하거나, 버튼 상태를 변경하고, 클래스·스타일을 조정하며,
필요하다면 DOM 구조 자체를 추가·삭제하기도 한다.
본 글에서는 바닐라 JavaScript에서 DOM을 수정하는 대표 방법을 예시 HTML과 함께 정리한다.



1. 텍스트 수정

textContent로 텍스트 바꾸기

1
2
<h2 class="title">안녕하세요</h2>
<button class="btn">문구 변경</button>
1
2
3
4
5
6
7
8
9
const title = document.querySelector(".title");
const btn = document.querySelector(".btn");

btn?.addEventListener("click", () => {
  if (!title) return;

  title.textContent = "반갑습니다";
  console.log(title.textContent); // "반갑습니다"
});


innerHTML로 마크업까지 바꾸기(주의)

1
2
<div class="message">기본 문구</div>
<button class="btn">강조 문구</button>
1
2
3
4
5
6
7
8
9
const msg = document.querySelector(".message");
const btn = document.querySelector(".btn");

btn?.addEventListener("click", () => {
  if (!msg) return;

  msg.innerHTML = "<strong>중요</strong> 문구로 변경";
  console.log(msg.innerHTML); // "<strong>중요</strong> 문구로 변경"
});

innerHTML은 편리하지만, 사용자 입력값을 그대로 넣는 방식은 보안 문제(XSS)로 이어질 수 있으므로 주의해야 한다.



2. 속성 수정

setAttribute로 속성 변경

1
2
<img class="avatar" src="/img/cat.png" alt="고양이" />
<button class="btn">이미지 변경</button>
1
2
3
4
5
6
7
8
9
10
const img = document.querySelector(".avatar");
const btn = document.querySelector(".btn");

btn?.addEventListener("click", () => {
  if (!img) return;

  img.setAttribute("src", "/img/dog.png");
  img.setAttribute("alt", "강아지");
  console.log(img.getAttribute("src")); // "/img/dog.png"
});


프로퍼티로 상태 변경(value/checked 등)

1
2
3
4
5
6
7
<label>
  <input id="email" type="email" value="test@example.com" />
  <input id="agree" type="checkbox" />
  약관 동의
</label>
<button class="emailBtn">이메일 변경</button>
<button class="agreeBtn">강제 체크</button>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const input = document.querySelector("#email");
const agree = document.querySelector("#agree");
const emailBtn = document.querySelector(".emailBtn");
const agreeBtn = document.querySelector(".agreeBtn");

emailBtn?.addEventListener("click", () => {
  if (!(input instanceof HTMLInputElement)) return;

  input.value = "great@example.com";
  console.log(input.value); // "great@example.com"
})

agreeBtn?.addEventListener("click", () => {
  if (!(agree instanceof HTMLInputElement)) return;

  agree.checked = true;
  console.log(agree.checked); // true
});


data-* 수정: dataset

1
2
<li class="todo-item" data-status="todo">할 일</li>
<button class="btn">상태 변경</button>
1
2
3
4
5
6
7
8
9
const item = document.querySelector(".todo-item");
const btn = document.querySelector(".btn");

btn?.addEventListener("click", () => {
  if (!item) return;

  item.dataset.status = "done";
  console.log(item.dataset.status); // "done"
});


3. 클래스 수정

classList.add / remove / toggle

1
2
3
4
5
<button class="btn-add">추가(add)</button>
<button class="btn-remove">제거(remove)</button>
<button class="btn-toggle">토글(toggle)</button>

<p class="desc">설명 문구</p>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const desc = document.querySelector(".desc");

const btnAdd = document.querySelector(".btn-add");
const btnRemove = document.querySelector(".btn-remove");
const btnToggle = document.querySelector(".btn-toggle");

btnAdd?.addEventListener("click", () => {
  if (!desc) return;

  desc.classList.add("active");
  console.log(desc.className); // "desc active"
});

btnRemove?.addEventListener("click", () => {
  if (!desc) return;

  desc.classList.remove("active");
  console.log(desc.className); // "desc"
});

btnToggle?.addEventListener("click", () => {
  if (!desc) return;

  const next = desc.classList.toggle("active"); // 토글 결과(추가되면 true, 제거되면 false)
  console.log(next); // true 또는 false
  console.log(desc.className); // "desc active" 또는 "desc"
});


4. 스타일 수정

인라인 스타일 변경(style)

1
2
<div class="box">BOX</div>
<button class="btn">색 변경</button>
1
2
3
4
5
6
7
8
9
10
11
const box = document.querySelector(".box");
const btn = document.querySelector(".btn");

btn?.addEventListener("click", () => {
  if (!box) return;

  box.style.backgroundColor = "black";
  box.style.color = "white";

  console.log(box.style.backgroundColor); // "black"
});


CSS 변수(–var) 수정

1
2
3
4
5
6
7
<style>
  :root { --main-size: 16px; }
  .text { font-size: var(--main-size); }
</style>

<p class="text">텍스트</p>
<button class="btn">크기 키우기</button>
1
2
3
4
5
6
7
8
const btn = document.querySelector(".btn");

btn?.addEventListener("click", () => {
  document.documentElement.style.setProperty("--main-size", "22px");

  const v = getComputedStyle(document.documentElement).getPropertyValue("--main-size").trim();
  console.log(v); // "22px"
});


5. DOM 구조 수정

요소 추가: createElement + append

1
2
<ul class="list"></ul>
<button class="btn">항목 추가</button>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const list = document.querySelector(".list");
const btn = document.querySelector(".btn");

let n = 1;

btn?.addEventListener("click", () => {
  if (!list) return;

  const li = document.createElement("li");
  li.textContent = `항목 ${n}`;

  list.append(li);

  console.log(list.children.length); // 1, 2, 3 ... (클릭할 때마다 증가)
  n += 1;
});


요소 삭제: remove

1
2
3
4
5
<ul class="list">
  <li class="item">A</li>
  <li class="item">B</li>
</ul>
<button class="btn">첫 항목 삭제</button>
1
2
3
4
5
6
7
8
9
10
11
12
13
const list = document.querySelector(".list");
const btn = document.querySelector(".btn");

btn?.addEventListener("click", () => {
  const first = list?.querySelector(".item");
  if (!first) {
    console.log("삭제할 항목이 없습니다.");
    return;
  }

  first.remove();
  console.log(list.children.length); // 1 ... (클릭할 때마다 감소)
});


템플릿 문자열로 삽입: insertAdjacentHTML

1
2
<div class="cards"></div>
<button class="btn">카드 추가</button>
1
2
3
4
5
6
7
8
9
10
11
12
13
const cards = document.querySelector(".cards");
const btn = document.querySelector(".btn");

btn?.addEventListener("click", () => {
  if (!cards) return;

  cards.insertAdjacentHTML(
    "beforeend",
    `<div class="card"><strong>새 카드</strong>가 추가되었습니다.</div>`
  );

  console.log(cards.querySelectorAll(".card").length); // 1, 2, 3 ... (추가된 카드 수)
});

insertAdjacentHTML은 빠르고 간단하지만, 외부 입력값을 그대로 넣는 방식은 보안 문제로 이어질 수 있다.

안전이 중요하다면 createElement 기반 조립이 더 적합하다.



6. 폼 입력값 초기화 및 상태 리셋

value 초기화와 focus 이동

1
2
<input class="name" type="text" value="test" />
<button class="btn">초기화</button>
1
2
3
4
5
6
7
8
9
10
11
const input = document.querySelector(".name");
const btn = document.querySelector(".btn");

btn?.addEventListener("click", () => {
  if (!(input instanceof HTMLInputElement)) return;

  input.value = "";
  input.focus();

  console.log(input.value); // ""
});


마무리

DOM 수정은

  • 텍스트(textContent)
  • 속성(setAttribute/프로퍼티/dataset)
  • 클래스(classList)
  • 스타일(style/CSS 변수)
  • 구조(추가·삭제·삽입)

예시 HTML 구조를 함께 두고 “어떤 상태를 바꾸는지”를 명확히 하여 코드를 작성하는 것이 중요하다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.