자바스크립트JavaScript 문서 객체 모델(DOM) 개념 및 DOM의 이벤트 처리 및 삭제 방법
안녕하세요 JJU_DEVELOPER입니다.
이번 시간에는 자바스크립트 문서 객체 모델(DOM)에 대해 알아보겠습니다.
자바스크립트는 웹 문서와 그 안에서 사용한 텍스트, 이미지, 표 등의 모든 요소를 각각 다른 객체로 인지하여 처리합니다.
이렇게 자바스크립트에서 웹 문서의 객체를 다루는 시스템을 문서객체 모델이라고 합니다.
<목차>
17-1 문서 객체 모델 알아보기
17-2 DOM 요소에 접근하고 속성 가져오기
17-3 DOM에서 이벤트 처리하기
17-4 DOM에서 노드 추가, 삭제하기
▼▼▼[지난 시간]▼▼▼
자바스크립트JavaScript 내장 객체, 브라우저와 관련된 객체 알아보기
안녕하세요 JJU_DEVELOPER입니다. 이번시간에는 javascript 에서 말하는 객체 대한 설명입니다~! 목차 16-1 객체 알아보기 16-2 자바스크립트와 내장 객체 16-3 브라우저와 관련된 객체 16-1 객체 알아보기
jju240.tistory.com
17-1 문서 객체 모델 알아보기
DOM(Document Object Model)은 웹 페이지에 대한 인터페이스입니다.
기본적으로 여러 프로그램들이 페이지의 콘텐츠 및 구조, 그리고 스타일을 읽고 조작할 수 있도록 API를 제공합니다.
DOM은 원본 HTML 문서의 객체 기반 표현 방식입니다.
둘은 서로 비슷하지만, DOM이 갖고 있는 근본적인 차이는 단순 텍스트로 구성된 HTML 문서의 내용과 구조가 객체 모델로 변환되어 다양한 프로그램에서 사용될 수 있다는 점입니다.
DOM의 개체 구조는 “노드 트리”로 표현됩니다.
하나의 부모 줄기가 여러 개의 자식 나뭇가지를 갖고 있고, 또 각각의 나뭇가지는 잎들을 가질 수 있는 나무와 같은 구조로 이루어져 있기 때문입니다.
이 케이스의 경우, 루트 요소인 <html> 은 “부모 줄기”, 루트 요소에 내포된 태그들은 “자식 나뭇가지” 그리고 요소 안의 콘텐츠는 “잎”에 해당합니다.
DOM은 HTML 문서에 대한 인터페이스입니다.
첫째로 뷰 포트에 무엇을 렌더링 할지 결정하기 위해 사용되며,
둘째로는 페이지의 콘텐츠 및 구조, 그리고 스타일이 자바스크립트 프로그램에 의해 수정되기 위해 사용됩니다.
DOM은 원본 HTML 문서 형태와 비슷하지만 몇 가지 차이점이 있습니다.
<차이점>
1. 항상 유효한 HTML 형식입니다.
2. 자바스크립트에 수정될 수 있는 동적 모델이어야 합니다.
3. 가상 요소를 포함하지 않습니다. (Ex. ::after)
4. 보이지 않는 요소를 포함합니다. (Ex. display: none)
DOM 을 구성하는 원칙
• 모든 HTML 태그는 요소(element) 노드
• 웹 문서의 텍스트 내용은 요소 노드의 자식 노드인 텍스트(text) 노드
• 태그의 속성은 요소 노드의 자식 노드인 속성(attribute) 노드
• 주석은 주석(comment) 노드
17-2 DOM 요소에 접근하고 속성 가져오기
웹 문서에서 원하는 요소를 찾아가는 것을 “접근한다(access)”고 합니다.
1. getElementById( ) 메서드 | 기본형 요소명.getElementById("id명") 아이디를 선택하여 해당 아이디를 찾고, 그 안에있는 메소드(프로퍼티)를 실행합니다. |
2. getElementsByClassName( ) 메서드 | 기본형 요소명.getElementsByClassName("class명") • 반환 값이 2개 이상일 수 있음 • HTMLCollection 객체에 저장됨 |
3. getElementsByTagName( ) 메서드 | 기본형 요소명.getElementsByTagName("태그명") • 반환 값이 2개 이상일 수 있음 • HTMLCollection 객체에 저장됨 |
4. querySelector( ) 메서드 5. querySelectorAll( ) 메서드 |
document.querySelector() : 일치하는 가장 첫 번째 것만 반환. document.querySelectorAll() : 일치하는 모든 요소의 NodeList 반환. 기본형 노드.querySelector(선택자), 노드.querySelectorAll(선택자 또는 태그 )
|
6. setAttribute( ) 메서드 |
기본형 setAttribute("속성명", "값") |
innerText, innerHTML 프로퍼티 웹 요소의 내용을 수정하는 프로퍼티 • innerText : 텍스트 내용 지정 • innerHTML : HTML 태그까지 포함해서 텍스트 내용 지정 1. innerTex function inntext(){
document.getElementById("current").innerText = now;
}
2. innerHTML function innhtml() {
document.getElementById("current").innerHTML = "<em>" + now + "</em>";
}
|
//getAttribute : id가 cup인 src의 값을 가져와라
즉, 웹 페이지의 이미지를 누르게 되면,
지정해 놓은 이미지의 링크가 팝업으로 뜨게 되는 것입니다.
17-3 DOM에서 이벤트 처리하기
17-3-1 DOM 요소에 함수 직접 연결하기
DOM 요소에 이벤트 처리기 함수를 직접 연결
이벤트 핸들러를 function()으로 정의

17-3-2 함수 이름을 사용해 연결하기
• 함수를 따로 정의해 놓았다면 DOM 요소에 함수 이름을 사용해 연결하시면 됩니다.
• 이때 함수 이름 다음에 괄호를 추가하지 않습니다.
이렇게 이미지를 한번 클릭하면 다른 이미지로 변신하게 됩니다.
17-3-3 querySelector( ) event.pageX, event.pageY 예시
pageX: 현재 문서 기준으로 이벤트가 발생한 가로 위치를 반환합니다.
pageY: 현재 문서 기준으로 이벤트가 발생한 세로 위치를 반환합니다.
17-3-4 DOM의 event 객체
웹 문서에서 이벤트 발생한 요소가 무엇인지,
어떤 이벤트가 발생했는지 등의 정보가 담긴 객체
17-3-5 this
이벤트가 발생한 대상에 접근할 때 사용하는 예약어
17-3-6 addEventListener( ) 메서드 사용하기
지금까지는 하나의 요소의 한 이벤트 처리기만 연결할 수 있었습니다.
하지만 다음과 같이 addEventListener( ) 메서드와 이벤트 객체를 사용하면,
한 요소에 여러 이벤트 처리기를 연결해 실행할 수 있습니다.
기본형 : 요소. addEventListener(이벤트, 함수, 캡처여부);
위 코드는 마우스를 위로 올릴 때 이미지가 변경되도록 자바스크립트 코드가 되어있는 것입니다.
17-3-7 CSS 속성에 접근하기
자바스크립트를 이용하면 스타일 속성값을 가져와서 그 값을 원하는 대로 수정할 수 있습니다.
자바스크립트에서는 각 요소의 스타일을 자유롭게 수정할 수 있으므로, 웹문서에서 다양한 효과를
만들 수 있습니다.
기본형: document. 요소명. style. 속성명
자바스크립트에서 요소를 선택하여 style의 속성 값을 지정해 값을 변경할 수 있는 것을 볼 수 있습니다.
이렇게 자바스크립트를 이용하면 다양한 처리가 가능한 것을 볼 수 있습니다~!
17-4 DOM에서 노드 추가, 삭제하기
17-4-1 노드 리스트란
querySelectorAll( ) 메서드를 사용해 가져온 여러 개의 노드를 저장한 것입니다.
예를 들면 3개의 리스트가 있고 얘 내들을 한 번에 값을 가져오고 싶을 때 사용합니다.
리스트 아이템으로 되어있는 노드를 전부 가져와 배열 형태로 저장합니다.

17-4-2 텍스트 노드를 사용하는 새로운 요소 추가하기
1. 요소 노드 만들기 – createElement( ) 메서드
DOM에 새로운 요소를 추가할 때 가장 먼저 할 일은 요소 노드를 만드는 것입니다.
하지만 createElement() 메서드는 새로운 노드를 만들 뿐 아직 웹 문서에 새로운 노드를 추가한 것이 아닙니다.
이제 <p> 태그의 내용에 해당되는 텍스트 노드도 만들어야겠죠~?
2. 텍스트 노드 만들기 – createTextNode( ) 메서드
새로운 노드 요소를 만들었다면, 그다음은 내용을 담는 텍스트 노드를 자식노드로 만들어 연결해야 합니다.
텍스트 노드를 만드는 메서드는 createTextNode( )입니다.
3. 자식 노드 연결하기 – appendChild( ) 메서드
기본형: 부모노드. appendChild(자식노드)
1. p태그를 createElement 하고
2. txtNode에 넣을 텍스트 작성해서 넣고
3. appendChild 해서 작성한 텍스트를 넣어줍니다.
//<p>DOM은 Document Object Model의 줄임말입니다. </p>
그렇다면!!! 속성 값이 있는 새로운 요소 추가할 수 있겠죠?
더 보기 링크를 클릭하면 텍스트와 함께 이미지를 표시할 수 있습니다.
더보기 클릭 후 변화-->
.
17-4-3 노드 삭제하기!!!
노드를 삭제할 때는 부모 노드에서 자식 노드를 삭제해야 한다
-> 노드를 삭제하려면 부모 노드부터 찾아야 함
parentNode 프로퍼티
현재 노드의 부모 노드에 접근해서 부모 노드의 요소 노드를 반환
기본형: 노드.parentNode
removeChild( ) 메서드
자식 노드 삭제
기본형: 부모노드.removeChild(자식노드)
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Web Programming</title>
<link rel="stylesheet" href="css/nodelist.css">
</head>
<body>
<div id="container">
<h1>Web Programming</h1>
<p>공부할 주제를 기록해 보세요. </p>
<p>공부가 끝난 것은 클릭해서 삭제할 수 있습니다.</p>
<form action="">
<input type="text" id="subject" autofocus>
<button onclick="newRegister(); return false;">추가</button>
</form>
<hr>
<ul id="itemList"> </ul>
</div>
<script>
function newRegister() {
let newItem = document.createElement("li"); // 요소 노드 추가
let subject = document.querySelector("#subject"); // 폼의 텍스트 필드
let newText = document.createTextNode(subject.value); // 텍스트 필드의 값을 텍스트 노드로 만들기
newItem.appendChild(newText); // 텍스트 노드를 요소 노드의 자식 노드로 추가
let itemList = document.querySelector("#itemList"); // 웹 문서에서 부모 노드 가져오기
itemList.insertBefore(newItem, itemList.childNodes[0]); // 자식 노드중 첫번째 노드 앞에 추가
subject.value="";
}
</script>
</body>
</html>
이뜻은 쉽게 말하면,
이렇게 처음에 db를 넣고 두번째에 javascript를 넣었다고 치면,
저렇게 위로 올라가는 형태가 되도록 넣는다는 뜻 입니다.
그럼 이런 형태가 됩니다.
이제 추가한 요소를 클릭하면 삭제되는 코드를 짜볼까요?
이제 짱구를 클릭해서 지워보겠습니다.
<script>
function newRegister() {
let newItem = document.createElement("li"); // 요소 노드 추가
let subject = document.querySelector("#subject"); // 폼의 텍스트 필드
let newText = document.createTextNode(subject.value); // 텍스트 필드의 값을 텍스트 노드로 만들기
newItem.appendChild(newText); // 텍스트 노드를 요소 노드의 자식 노드로 추가
let itemList = document.querySelector("#itemList"); // 웹 문서에서 부모 노드 가져오기
itemList.insertBefore(newItem, itemList.childNodes[0]); // 자식 노드중 첫번째 노드 앞에 추가
subject.value="";
let items = document.querySelectorAll("li")
//리스트를 다 찾고 그걸 items에 넣는다.
for(i=0;i<items.length;i++){
items[i].addEventListener("click",function(){
//각각을 클릭했을때 이벤트 발생하기!
if(this.parentNode)
//this는 리스트 아이템을 뜻합니다.
this.parentNode.removeChild(this);
});
}
}
</script>
<removeChild 핵심 코드>
그럼 지금까지 자바스크립트에서의 문서 객체 모델(DOM) 개념 및 DOM의 이벤트 처리 및 삭제 방법에 대한
설명이었습니다.
참고 서적: DoIt 한 권으로 끝내는 웹 기본 교과서 HTML+CSS+자바스크립트 웹 표준의 정석
오늘도 수고 많으셨습니다~!