JavaScript DOM 동적 삽입
이 장은 DOM 요소를 새로 만들고, 기존 요소의 스타일과 내용을 바꾸는 연습입니다. 핵심은 요소를 찾는 단계, 새 요소를 만드는 단계, 부모 요소에 붙이거나 스타일을 바꾸는 단계를 분리해서 보는 것입니다.
동적 삽입은 JavaScript로 새 요소를 만들고 기존 DOM 트리에 붙이는 작업입니다. 원본은 답보기 버튼을 누르면 p 요소를 만들어 div 안에 추가합니다.
| 코드 | 역할 | 결과 |
|---|---|---|
| parentElement | 부모 요소 찾기 | button을 감싼 div |
| lastElementChild | 마지막 자식 확인 | 중복 삽입 방지 |
| createElement("p") | 새 p 생성 | 아직 화면에는 없음 |
| appendChild | 부모에 붙이기 | 화면에 표시 |
if(obj != parent.lastElementChild) return;은 이미 답이 추가된 상태에서 버튼을 다시 눌러도 같은 답이 계속 늘어나지 않게 막습니다.
두 번째 버전은 새 p에 onclick 함수를 붙입니다. 사용자가 답 문장을 클릭하면 자기 자신을 부모에서 제거합니다.
innerHTML(prompt) 예제는 p를 클릭하면 prompt로 입력을 받고, 입력한 HTML 또는 텍스트를 p 안에 넣습니다.
| 상황 | 처리 | 의미 |
|---|---|---|
| 취소 | text == null | 아무것도 바꾸지 않음 |
| 빈 문자열 | text == "" | 아무것도 바꾸지 않음 |
| 일반 텍스트 | innerHTML 대입 | 문장 변경 |
| HTML 문자열 | 태그 해석 | 굵게/링크 등 적용 가능 |
라면 순서 예제는 ol을 클릭하면 prompt 입력값으로 li를 만들고, 그 li를 ol의 마지막에 붙입니다.
| 코드 | 역할 | 결과 |
|---|---|---|
| addItem(this) | 클릭한 ol 전달 | parent로 사용 |
| createElement("li") | 목록 항목 생성 | 새 순서 항목 |
| liObj.innerHTML | 입력 내용 넣기 | 텍스트 표시 |
| parent.appendChild | 목록에 붙이기 | 맨 뒤 추가 |
DOM 조작에서 appendChild는 붙이고 removeChild는 제거합니다. 둘 다 부모와 자식 관계를 정확히 알아야 합니다.
| 메서드 | 필요한 것 | 결과 |
|---|---|---|
| appendChild(child) | 부모 요소와 새 자식 | 부모 끝에 추가 |
| removeChild(child) | 부모 요소와 기존 자식 | 자식 제거 |
| parentElement | 현재 요소 | 부모 접근 |
| this | 이벤트 대상 | 클릭된 요소 |
| 실수 | 증상 | 해결 |
|---|---|---|
| 중복 삽입 방지 없음 | 답이 계속 늘어납니다. | lastElementChild를 확인합니다. |
| 부모 요소 착각 | removeChild가 실패합니다. | this.parentElement를 확인합니다. |
| prompt 취소 처리 없음 | null이 들어갑니다. | null과 빈 문자열을 검사합니다. |
| innerHTML 입력 과신 | HTML이 실행됩니다. | 필요하면 textContent를 씁니다. |
| append 대상 오류 | 엉뚱한 곳에 li가 붙습니다. | this로 parent를 명확히 전달합니다. |
| 체크 | 통과 기준 |
|---|---|
| createElement | 새 DOM 요소를 만드는 메서드임을 압니다. |
| appendChild | 부모의 마지막 자식으로 추가합니다. |
| removeChild | 부모에서 특정 자식을 제거합니다. |
| parentElement | 현재 요소의 부모에 접근합니다. |
| innerHTML | HTML 문자열이 해석된다는 점을 압니다. |
| prompt | 취소와 빈 값을 처리해야 함을 압니다. |
| 확인 | 콘솔 예시 | 의미 |
|---|---|---|
| 부모 | console.log(parent) | 붙일 대상 확인 |
| 마지막 자식 | console.log(parent.lastElementChild) | 중복 방지 조건 확인 |
| 새 요소 | console.log(newP) | 생성된 p 확인 |
| 입력값 | console.log(text) | prompt 결과 확인 |
| 목록 개수 | console.log(parent.children.length) | 추가 후 개수 확인 |
| 케이스 | 동작 | 예상 결과 |
|---|---|---|
| 답보기 1회 | 버튼 클릭 | 답 p 추가 |
| 답보기 반복 | 버튼 재클릭 | 중복 추가 안 됨 |
| 답 클릭 | 추가된 p 클릭 | 답 p 삭제 |
| prompt 취소 | 취소 클릭 | 내용 유지 |
| 라면 순서 추가 | ol 클릭 후 입력 | li 추가 |
동적 삽입 예제는 입력값 검증, 중복 방지, 삭제 기능을 조금씩 확장하기 좋습니다. 새 요소가 언제 만들어지고 어디에 붙는지 계속 확인하면서 연습합니다.
| 개선 | 효과 | 확인 |
|---|---|---|
| class 추가 | 새 요소 스타일을 CSS로 관리합니다. | newP.className |
| 삭제 버튼 추가 | 텍스트 클릭보다 명확합니다. | button createElement |
| 중복 텍스트 검사 | 같은 항목 반복 추가를 줄입니다. | children 순회 |
| 빈칸 trim | 공백 입력을 막습니다. | text.trim() |
| 입력 로그 | prompt 결과를 확인합니다. | console.log(text) |
예제에서는 innerHTML이 편리하지만, 입력값을 그대로 HTML로 해석한다는 특징이 있습니다. 단순 텍스트 추가라면 textContent가 더 안전합니다.
| 입력 | innerHTML | textContent |
|---|---|---|
| <b>라면</b> | 굵게 표시 | 태그 문자열 그대로 표시 |
| 일반 텍스트 | 텍스트 표시 | 텍스트 표시 |
| 빈 문자열 | 검사 후 무시 | 검사 후 무시 |
| HTML 조각 | 해석됨 | 해석 안 됨 |
여러 예제는 모두 같은 패턴으로 볼 수 있습니다. 입력을 받고, 요소를 만들고, 값을 넣고, 부모에 붙이는 흐름입니다.
| 예제 | 입력 | 생성 요소 | 붙는 위치 |
|---|---|---|---|
| 답보기 | 함수 인자 text | p | 질문 div |
| 삭제 답 | 함수 인자 text | p | 질문 div |
| innerHTML 변경 | prompt | 새 요소 없음 | 클릭한 p 내부 |
| 라면 순서 | prompt | li | ol 내부 |
| 테스트 | 확인 내용 |
|---|---|
| 답 삭제 후 재추가 | 삭제한 뒤 버튼을 다시 누르면 답이 다시 추가되는지 봅니다. |
| 공백 입력 | 공백만 입력했을 때 추가 여부를 확인합니다. |
| HTML 입력 | innerHTML과 textContent 차이를 확인합니다. |
| 여러 li 추가 | 순서대로 마지막에 붙는지 봅니다. |
| 부모 확인 | appendChild 대상이 예상한 요소인지 확인합니다. |
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| JavaScript Date · 색상 완전 정리 (0) | 2026.07.06 |
|---|---|
| JavaScript transform · z-index · 난수 완전 정리 (0) | 2026.07.06 |
| JavaScript e.target 이벤트 완전 정리 (0) | 2026.07.06 |
| JavaScript 계산기 · DOM 실습 완전 정리 (0) | 2026.07.06 |
| JavaScript 타이머 산수 · Enter 계산기 완전 정리 (0) | 2026.07.06 |
왕진 블로그

댓글