[JavaScript 5-2] DOM(Document Object Model)

임승현·2022년 11월 21일

JavaScript

목록 보기
4/4

🐧onload 이벤트

◈ 요청 웹프로그램(웹문서)의 실행결과를 응답받아 출력되는 영역을 자바스크립트에서는 document 객체로 표현하며 document 객체에 출력되는 태그(박스모델)는 Element 객체로 표현하여 처리
◈ DOM : 브라우저의 출력영역(document 객체)을 기반으로 제공되는 자바스크립트 객체
◈ 브라우저에서 이벤트가 발생될 경우 이벤트 처리 명령으로 박스모델(Element 객체)을 조작하여 동적인 페이지 제공 - DHTML(Dynamic HTML)
◈ 이벤트(Event) : 태그(박스모델)에서 발생되는 다양한 사건
◈ 이벤트 처리(Event Handle) : 태그에서 발생된 이벤트에 대한 처리 명령 - 자바스크립트 이용
◈ 페이지를 구성하는 모든 태그가 Element 객체로 표현되어 있어야지만 동적인 페이지 구현 가능 - DOM Tree 완성 후 Element 객체 조작 가능
◈ DOM Tree : document 객체를 최상위 부모 객체로 두고 모든 태그가 Element 객체로 트리(Tree) 형식의 계층적 구조로 메모리에 표현되어 있는 상태
◈ DOM Tree는 웹문서를 모두 읽어 DOM Parser에 의해 해석(parsing)된 경우 완성

📃35_onload.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript</title>
<script type="text/javascript">
function load() {//이벤트 처리 함수
	alert("DOM Tree가 완성되어 동적인 페이지 구현이 가능합니다.");
}
/*
//태그의 이벤트 속성을 객체의 프로퍼티로 사용하여 이벤트 처리 함수 등록 가능
//→ 태그에서 이벤트가 발생되면 이벤트 처리 함수가 자동 호출되어 실행
window.onload=function() {
	alert("DOM Tree가 완성되어 동적인 페이지 구현이 가능합니다.");
}
*/
</script>
</head>
<!-- body 태그의 onload 이벤트 속성 : body 태그를 모두 읽은 경우에 대한 이벤트 속성 - DOM Tree 완성 -->
<!-- → onload 이벤트 속성값으로 이벤트 처리 명령(자바스크립트 - 이벤트 처리 함수 호출) 설정 -->
<!--<body> --><!-- javascript 접두사 생략 가능 -->
<body>
 	<h1>DOM(Document Object Model) - onload 이벤트</h1>
 	<hr>
 	<p>요청 웹프로그램(웹문서)의 실행결과를 응답받아 출력되는 영역을 자바스크립트에서는
 	document 객체로 표현하며 document 객체에 출력되는 태그(박스모델)는 Element 객체로 표현하여 처리</p>
 	<p>DOM : 브라우저의 출력영역(document 객체)을 기반으로 제공되는 자바스크립트 객체</p>
 	<p>브라우저에서 이벤트가 발생될 경우 이벤트 처리 명령으로 박스모델(Element 객체)을 
 	조작하여 동적인 페이지 제공 - DHTML(Dynamic HTML)</p>
 	<p>이벤트(Event) : 태그(박스모델)에서 발생되는 다양한 사건</p>
 	<p>이벤트 처리(Event Handle) : 태그에서 발생된 이벤트에 대한 처리 명령 - 자바스크립트 이용</p>
 	<p>페이지를 구성하는 모든 태그가 Element 객체로 표현되어 있어야지만 동적인 페이지 구현 가능 - DOM Tree 완성 후 Element 객체 조작 가능</p>
 	<p>DOM Tree : document 객체를 최상위 부모 객체로 두고 모든 태그가 Element 객체로 트리(Tree) 형식의 계층적 구조로 메모리에 표현되어 있는 상태</p>
 	<p>DOM Tree는 웹문서를 모두 읽어 DOM Parser에 의해 해석(parsing)된 경우 완성</p>
 	<!-- ======================================================================= -->
 	<!--  body 태그의 마지막 자식태그로 script 태그 작성 -->
 	<script type="text/javascript">
 	//onload 이벤트를 사용하지 않아도 동적인 페이지 구현 가능 - 가독성 증가
 	alert("DOM Tree가 완성되어 동적인 페이지 구현이 가능합니다.");
 	</script>
</body>
</html>


🐧document

📌document.gerElementById(id) : 태그의 id 속성값으로 태그를 검색하여 태그에 대한 Element 객체를 반환하는 메소드

→ document 객체의 자식태그 중 하나의 태그를 검색하여 Element 객체로 반환
→ document 객체 대신 부모 Element 객체를 사용하여 자식 Element 객체를 검색하여 반환

var h2E=document.getElementById("headline");
alert(h2E);

📌Node.nodeName : Node(Element) 객체의 노드명(태그명)을 저장한 프로퍼티

alert(h2E.nodeName);//H2

📌Node.nodeValue : Node(Element) 객체의 노드값(태그내용)을 저장한 프로퍼티

alert(h2E.nodeValue);//null

📌Node.firstChild : Node(Element) 객체의 첫번째 자식 Node(Element) 객체를 저장한 프로퍼티

alert(h2E.firstChild);//[object Text] - TextNode

alert(h2E.firstChild.nodeName);//#text

alert(h2E.firstChild.nodeValue);//h2 태그에 의해 출력되는 내용 - 태그내용

📌Node 객체의 nodeValue 프로퍼티의 저장값 변경 - 태그내용 변경

h2E.firstChild.nodeValue="h2 태그의 내용 변경";

📌document.getElementsByTagName(tagName) : 태그명을 이용하여 태그를 검색하여 NodeList 객체로 반환하는 메소드

→ 다수의 태그를 검색하여 Element 객체의 모임(List 객체)으로 반환
→ document 객체 대신 부모 Element 객체를 사용하여 자식 Element 객체들을 검색하여 반환
◈ NodeList 객체 : Node(Element) 객체가 다수 저장된 콜렉션 객체

var liList=document.getElementsByTagName("li");
alert(liList);//[object HTMLCollection]

📌NodeList.length : NodeList 객체에 저장된 Node 객체의 갯수를 저장한 프로퍼티

📌NodeList.item(index) : NodeList 객체에 첨자(Index) 위치의 Node(Element) 객체를 반환하는 메소드

for(i=0;i<liList.length;i++) {
	var liE=liList.item(i);
	//alert(liE);//[object HTMLLIElement]
    //
	//alert(liE.nodeName);
	alert(liE.firstChild.nodeValue);
	}

📌document.querySelector(selector) : CSS 선택자로 태그를 검색하여 Element 객체를 반환하는 메소드

→ document 객체의 자식태그 중 하나의 태그를 검색하여 Element 객체로 반환
→ document 객체 대신 부모 Element 객체를 사용하여 자식 Element 객체를 검색하여 반환

var pE=document.querySelector(".text");
alert(pE);//[object HTMLParagraphElement]

alert(pE.nodeName);//P

alert(pE.firstChild.nodeValue);//p 태그에 의해 출력되는 내용

📌document.querySelectorAll(selector) : CSS 선택자로 태그를 검색하여 NodeList 객체를 반환하는 메소드

→ document 객체의 자식태그 중 하나의 태그를 검색하여 Element 객체로 반환
→ document 객체 대신 부모 Element 객체를 사용하여 자식 Element 객체를 검색하여 반환

var pList=document.querySelectorAll(".text");
alert(pList);//[object NodeList]

alert(pList.item(0).nodeName);//P

alert(pList.item(0).firstChild.nodeValue);//p 태그에 의해 출력되는 내용

📃36_element.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript</title>
</head>
<body>
 	<h1>DOM(Document Object Model) - Element 객체</h1>
 	<hr>
 	<h2 id="headline">h2 태그에 의해 출력되는 내용</h2>
 	<p>Node 객체 : 태그(TagNode)와 태그내용(TextNode)을 객체로 표현</p>
 	<p>Element 객체 : 태그만을 객체로 표현</p>
 	<hr>
 	<ul>
 		<li>li 태그에 의해 출력되는 내용-1</li>
 		<li>li 태그에 의해 출력되는 내용-2</li>
 		<li>li 태그에 의해 출력되는 내용-3</li>
 	</ul>
 	<p class="text">p 태그에 의해 출력되는 내용</p>
 	<script type="text/javascript">
 	//document.gerElementById(id) : 태그의 id 속성값으로 태그를 검색하여 태그에 대한 Element 객체를 반환하는 메소드
 	//→ document 객체의 자식태그 중 하나의 태그를 검색하여 Element 객체로 반환
 	//→ document 객체 대신 부모 Element 객체를 사용하여 자식 Element 객체를 검색하여 반환
 	var h2E=document.getElementById("headline");
 	//alert(h2E);//[object HTMLHeadingElement]
 	//==============================================================================
 	//Node.nodeName : Node(Element) 객체의 노드명(태그명)을 저장한 프로퍼티
 	//alert(h2E.nodeName);//H2
 	//==============================================================================
 	//Node.nodeValue : Node(Element) 객체의 노드값(태그내용)을 저장한 프로퍼티
 	//alert(h2E.nodeValue);//null
 	//==============================================================================
 	//Node.firstChild : Node(Element) 객체의 첫번째 자식 Node(Element) 객체를 저장한 프로퍼티
 	//alert(h2E.firstChild);//[object Text] - TextNode
 	//==============================================================================
 	//alert(h2E.firstChild.nodeName);//#text
 	//==============================================================================
 	//alert(h2E.firstChild.nodeValue);//h2 태그에 의해 출력되는 내용 - 태그내용
 	//==============================================================================
 	//Node 객체의 nodeValue 프로퍼티의 저장값 변경 - 태그내용 변경
 	//h2E.firstChild.nodeValue="h2 태그의 내용 변경";
 	//==============================================================================
 	//document.getElementsByTagName(tagName) : 태그명을 이용하여 태그를 검색하여 NodeList 객체로 반환하는 메소드
 	//→ 다수의 태그를 검색하여 Element 객체의 모임(List 객체)으로 반환
 	//→ document 객체 대신 부모 Element 객체를 사용하여 자식 Element 객체들을 검색하여 반환
 	//NodeList 객체 : Node(Element) 객체가 다수 저장된 콜렉션 객체
 	var liList=document.getElementsByTagName("li");
 	//alert(liList);//[object HTMLCollection]
 	//==============================================================================
 	//NodeList.length : NodeList 객체에 저장된 Node 객체의 갯수를 저장한 프로퍼티
 	//alert(liList.length);//3
 	//==============================================================================
 	/*
 	for(i=0;i<liList.length;i++) {
		//NodeList.item(index) : NodeList 객체에 첨자(Index) 위치의 Node(Element) 객체를 반환하는 메소드
		var liE=liList.item(i);
		//alert(liE);//[object HTMLLIElement]
		//
		//alert(liE.nodeName);
		alert(liE.firstChild.nodeValue);
	}
 	*/
 	//==============================================================================
 	//document.querySelector(selector) : CSS 선택자로 태그를 검색하여 Element 객체를 반환하는 메소드
 	//→ document 객체의 자식태그 중 하나의 태그를 검색하여 Element 객체로 반환
 	//→ document 객체 대신 부모 Element 객체를 사용하여 자식 Element 객체를 검색하여 반환
 	var pE=document.querySelector(".text");
 	//alert(pE);//[object HTMLParagraphElement]
 	//alert(pE.nodeName);//P
 	//alert(pE.firstChild.nodeValue);//p 태그에 의해 출력되는 내용
 	//==============================================================================
 	//document.querySelectorAll(selector) : CSS 선택자로 태그를 검색하여 NodeList 객체를 반환하는 메소드
 	//→ document 객체의 자식태그 중 하나의 태그를 검색하여 Element 객체로 반환
 	//→ document 객체 대신 부모 Element 객체를 사용하여 자식 Element 객체를 검색하여 반환
 	var pList=document.querySelectorAll(".text");
 	//alert(pList);//[object NodeList]
 	//alert(pList.item(0).nodeName);//P
 	alert(pList.item(0).firstChild.nodeValue);//p 태그에 의해 출력되는 내용
 	</script>
</body>
</html>

🐧Element 객체 생성 및 추가

📌document.createElement(nodeName) : 전달값의 태그명을 가진 Element 객체를 생성하여 반환하는 메소드 - 태그 생성

var h2E=document.createElement("h2");//<h2></h2>

📌document.createTextNode(content) : 전달값을 태그내용으로 가진 Text 객체를 생성하여 반환하는 메소드 - 태그 내용 생성

var h2T=document.createTextNode("h2 태그의 내용");

📌Node.appendChild(newNode) : Node(Element) 객체의 마지막 자식 Node 객체로 추가하는 메소드

h2E.appendChild(h2T);//<h2>h2 태그의 내용</h2>

📌document.body : body 태그를 객체로 표현 가능 - 웹문서에 하나의 body 태그만 존재

document.body.appendChild(h2E);//DOM Tree에 Node 객체 부착 >> 출력

var imgE=document.createElement("img");//<img>

📌Element.attributeName : Element 객체의 프로퍼티로 태그의 속성 표현 가능

imgE.src="images/koala.jpg";//<img src="images/koala.jpg">
alert(imgE.src);//http://localhost:8000/web/js/images/koala.jpg - 절대경로

imgE.width="300";//http://localhost:8000/web/js/images/koala.jpg width="300"

📌Element 객체를 반환받아 마직막 자식객체에 태그 배치 - 추가

var imageDiv=document.getElementById("imageDiv");
imageDiv.appendChild(imgE);

📌Element.attributeName : Element 객체의 프로퍼티로 태그의 속성을 표현하여 사용 가능

/*
imgE.src="images/Koala.jpg";//<img src="images/Koala.jpg">
alert(imgE.src);//http://localhost:8000/web/js/images/Koala.jpg - 절대경로
imgE.width="300";//<img src="images/Koala.jpg" width="300">
*/

📌Element.setAttribute(name, value) : Element 객체의 태그 속성을 변경하는 메소드

imgE.setAttribute("src", "images/Koala.jpg");//<img src="images/Koala.jpg">

📌Element.getAttribute(name) : Element 객체의 태그 속성값을 반환하는 메소드

alert(imgE.getAttribute("src"));//images/Koala.jpg - 상대경로
imgE.setAttribute("width", "300");//<img src="images/Koala.jpg" width="300">

📌Element 객체를 반환받아 마지막 자식 Element 객체로 태그 배치 - 출력

var imageDiv=document.getElementById("imageDiv");
imageDiv.appendChild(imgE);

var hrE=document.createElement("hr");//<hr>
alert(hrE);//[object HTMLHRElement]

📌Node.insertBefore(newElement, before) : 기존 Node(Elemet) 객체전에 새로운 Node(Element) 객체를 삽입하는 메소드

document.body.insertBefore(hrE, h2E);

📃37_add_element.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript</title>
</head>
<body>
 	<h1>DOM(Document Object Model) - Element 객체 생성 및 추가</h1>
 	<hr>
 	<div id="imageDiv"></div>
 	<script type="text/javascript">
 	//document.createElement(nodeName) : 전달값의 태그명을 가진 Element 객체를 생성하여 반환하는 메소드 - 태그 생성
 	var h2E=document.createElement("h2");//<h2></h2>
 	//alert(h2E);//[object HTMLheadingElement]
 	//==============================================================================
 	//document.createTextNode(content) : 전달값을 태그내용으로 가진 Text 객체를 생성하여 반환하는 메소드 - 태그 내용 생성
 	var h2T=document.createTextNode("h2 태그의 내용");
 	//alert(h2T);//[object Text]
 	//==============================================================================
 	//Node.appendChild(newNode) : Node(Element) 객체의 마지막 자식 Node 객체로 추가하는 메소드 
 	h2E.appendChild(h2T);//<h2>h2 태그의 내용</h2>
 	//==============================================================================
 	//document.body : body 태그를 객체로 표현 가능 - 웹문서에 하나의 body 태그만 존재
 	//alert(document.body);//[object HTMLBodyElement]
 	document.body.appendChild(h2E);//DOM Tree에 Node 객체 부착 >> 출력
 	//==============================================================================
 	var imgE=document.createElement("img");//<img>
 	//
 	/*
 	//Element.attributeName : Element 객체의 프로퍼티로 태그의 속성을 표현하여 사용 가능 
	imgE.src="images/Koala.jpg";//<img src="images/Koala.jpg">
	//alert(imgE.src);//http://localhost:8000/web/js/images/Koala.jpg - 절대경로
 	//
 	imgE.width="300";//<img src="images/Koala.jpg" width="300">
 	*/
 	//Element.setAttribute(name, value) : Element 객체의 태그 속성을 변경하는 메소드
	imgE.setAttribute("src", "images/Koala.jpg");//<img src="images/Koala.jpg">
	//Element.getAttribute(name) : Element 객체의 태그 속성값을 반환하는 메소드
	//alert(imgE.getAttribute("src"));//images/Koala.jpg - 상대경로
 	//
 	imgE.setAttribute("width", "300");//<img src="images/Koala.jpg" width="300">
 	//
 	//Element 객체를 반환받아 마지막 자식 Element 객체로 태그 배치 - 출력
	var imageDiv=document.getElementById("imageDiv");
	imageDiv.appendChild(imgE);
 	//==============================================================================
 	var hrE=document.createElement("hr");//<hr>
	//alert(hrE);//[object HTMLHRElement]
	//Node.insertBefore(newElement, before) : 기존 Node(Elemet) 객체전에 새로운 Node(Element) 객체를 삽입하는 메소드
	document.body.insertBefore(hrE, h2E);
 	</script>
</body>
</html>

🐧Element 객체 삭제

🎨id가 있을때 삭제 방법

📌Node.removeChilde(oldNode) : Node(Element) 객체의 자식 Node(Element) 객체를 삭제하는 메소드

document.body.removeChild(h2E);

📌Node.parentNode : Node(Element) 객체의 부모 Node(Element) 객체를 저장한 프로퍼티

h2E.parentNode.removeChild(h2E);

🎨id가 없을때 삭제 방법

var h2List=document.getElementsByTagName("h2");
var removeE=h2List.item(1);
removeE.parentNode.removeChild(removeE);

📃38_remove_element.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript</title>
</head>
<body>
 	<h1>DOM(Document Object Model) - Element 객체 삭제</h1>
 	<hr>
	<h2>엘리먼트-1</h2>
	<h2 id="remove">엘리먼트-2</h2>
	<h2>엘리먼트-3</h2>
	<script type="text/javascript">
	var h2E=document.getElementById("remove")
	//
	/*
	//id가 있을때 삭제 방법
	//Node.removeChilde(oldNode) : Node(Element) 객체의 자식 Node(Element) 객체를 삭제하는 메소드
	//document.body.removeChild(h2E);
	//
	//Node.parentNode : Node(Element) 객체의 부모 Node(Element) 객체를 저장한 프로퍼티
	h2E.parentNode.removeChild(h2E);
	*/
	//==============================================================================
	//id가 없을때 삭제 방법
	var h2List=document.getElementsByTagName("h2");
	var removeE=h2List.item(1);
	removeE.parentNode.removeChild(removeE);
	</script>
</body>
</html>

🐧innerHTML

🎨첫번째 방법

◈ Node(Element) 객체의 첫번쨰 자식 객체(Text 객체)의 노드내용 변경 - 태그내용 변경

liE.firstChild.nodeValue="신메뉴";//<li>신메뉴</li>

🎨두번째 방법

var liT=document.createTextNode("신메뉴");//Text 객체 생성하여 변수에 저장

📌Node.replaceChild(newChild, oldChild) : Node(Element) 객체의 자식 Node(Element) 객체를 변경하는 메소드

liE.replaceChild(liT, liE.firstChild);

🎨불편한 방법

var pE=document.createElement("p");//<p></p>
var pT=document.createTextNode("p 태그의 내용");
pE.appendChild(pT);//<p>p 태그의 내용</p>
var textE=document.getElementById("text");
textE.appendChild(pE);

🎨편한 방법(innerHTML)

var textE=document.getElementById("text");

📌Node.innerHTML : Node(Element) 객체에 하위태그를 저장한 프로퍼티

→ Node.innerHTML 프로퍼티를 사용하여 Node(Element) 객체의 하위태그 변경 가능

textE.innerHTML="<p>p 태그의 내용</p>"

📃39_innerHTML.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript</title>
</head>
<body>
 	<h1>DOM(Document Object Model) - innerHTML</h1>
 	<hr>
 	<ul>
 		<li>메뉴-1</li>
 		<li>메뉴-2</li>
 		<li>메뉴-3</li>
 	</ul>
 	<ul>
 		<li>메뉴-4</li>
 		<li>메뉴-5</li>
 		<li>메뉴-6</li>
 	</ul>
 	<hr>
 	<div id="text"></div>
 	<script type="text/javascript">
 	var ulList=document.getElementsByTagName("ul");
 	var liList=ulList.item(0).getElementsByTagName("li");//첫번째 ul 태그
 	//ulList.item(1);//두번째 ul 태그
 	var liE=liList.item(1);//<li>메뉴-2</li>
 	//
 	//첫번째 방법
 	//Node(Element) 객체의 첫번쨰 자식 객체(Text 객체)의 노드내용 변경 - 태그내용 변경
 	//liE.firstChild.nodeValue="신메뉴";//<li>신메뉴</li>
 	//두번째 방법
 	var liT=document.createTextNode("신메뉴");//Text 객체 생성하여 변수에 저장
 	//Node.replaceChild(newChild, oldChild) : Node(Element) 객체의 자식 Node(Element) 객체를 변경하는 메소드
 	liE.replaceChild(liT, liE.firstChild);
 	//==============================================================================
 	/*
 	//불편한 방법
 	var pE=document.createElement("p");//<p></p>
 	var pT=document.createTextNode("p 태그의 내용");
 	pE.appendChild(pT);//<p>p 태그의 내용</p>
 	var textE=document.getElementById("text");
 	textE.appendChild(pE);
 	*/
 	//편한 방법(innerHTML)
 	var textE=document.getElementById("text");
 	//Node.innerHTML : Node(Element) 객체에 하위태그를 저장한 프로퍼티
 	//→ Node.innerHTML 프로퍼티를 사용하여 Node(Element) 객체의 하위태그 변경 가능
 	textE.innerHTML="<p>p 태그의 내용</p>"
 	</script>
</body>
</html>

💯예제문제 - 시계

📃40_clock.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript</title>
<style type="text/css">
#displayDiv {
	width: 600px;
	margin: 0 auto;
	padding: 30px 0;
	font-size: 2em;
	font-weight: bold;
	text-align: center;
	border: 2px solid black;
}
</style>
</head>
<body>
 	<h1>DOM(Document Object Model) - 시계</h1>
	<hr>
	<div id="displayDiv">2022년 11월 21일 17시 08분 30초</div>
	<script type="text/javascript">
	//태그를 검색하여 Element 객체를 반환받아 변수에 저장
	var displayDiv=document.getElementById("displayDiv");
	//
	//함수를 생성하여 변수에 저장
	var displayClock=function()	{
		var now=new Date();//클라이언트의 현재 날짜와 시간이 저장된 Date 객체 생성
		//
		var printNow=now.getFullYear()+"년 "+(now.getMonth()+1)+"월 "+now.getDate()+"일 "
		+now.getHours()+"시"+now.getMinutes()+"분"+now.getSeconds()+"초";
		//
		displayDiv.innerHTML=printNow;
	}
	//
	displayClock();//함수 호출 - 현재 날짜와 시간 출력
	//
	//1초마다 함수 호출 - 동적인 페이지 구현
	setInterval(displayClock, 1000);
	</script>
</body>
</html>

0개의 댓글