[JavaScript] DOM
문서객체 모델(DOM, document object model)
-넓은 의미: 웹 브라우저가 HTML 페이지를 인식하는 방식
-좁은 의미: document 객체와 관련된 객체의 집합
-HTML 페이지에 태그를 추가, 수정, 제거할 수 있음
-기본적인 자바스크립트만으로 DOM을 다루기에는 너무 복잡하므로 간단한 내용만 살펴보고 자세한 내용은 jQuery와 함께
DOM 관련 용어
-문서 객체: html or body 태그를 자바스크립트에서 이용할 수 있는 객체로 만들면 그것이 문서 객체
-노드: 각 요소(head, body, title, script, h1, HEADER...)
--요소노드(Element Node): HTML 태그
--텍스트노드(Text Node): 요소 노드 안에 들어 있는 글자
-정적으로 문서 객체를 생성한다는 의미: 웹페이지가 처음 HTML 페이지에 적혀있는 태그들을 읽으며 생성하는 것
-동적으로 문서 객체를 생성한다는 의미: 자바스크립트를 사용해 원래 HTML 페이지에는 없는 문서 객체(태그 등)을 생성하는 것
1. 문서 객체의 변경
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM01.html</title>
<script type="text/javascript">
function changeHeader(){
// document.getElementById("header_1").innerHTML="펭귄";
var header=document.getElementById("header_1");
header.innerHTML="펭귄";
// 문서 객체를 변수에 저장하고 .innerHTML 사용이 가능함. 그 외 메서드들도 변수와 함께 사용 가능
}
</script>
</head>
<body>
<h1 id="header_1">HEADER</h1>
<img src="images/Penguins.jpg" width="300">
<div><h1 id="header_2" class="" name="">HEADER-2</h1></div>
<h1 id="clock"></h1>
<input type="button" value="제목변경" onclick="changeHeader();"/><br/>
</body>
</html>
2. 문서의 객체 추가
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM02</title>
<script type="text/javascript">
function createTag(){
// 요소노드(HTML) 생성 -> 텍스트노드 생성 -> 텍스트노드를 요소노드에 첨가(삽입) -> 요소노드를 body에 첨가(삽입)
// 요소노드 생성에서 변수에 저장
var header=document.createElement('h2'); // h2 태그를 생성해서 변수에 저장. 아직 화면에 표시되지 않음
// 텍스트노드를 생성해서 변수에 저장
var textNode=document.createTextNode('hello DOM');
// 텍스트 노드에 내용을 문서객체(h2)에 원래 내용이 있다면 그 끝에 이어서 원래 내용이 없다면 처음의 내용으로 삽입
header.appendChild(textNode);
// body에 header 객체를 원래 내용들의 맨끝에 추가 또는 원래 내용이 없다면 처음의 내용으로 추가
document.body.appendChild(header);
}
</script>
</head>
<body>
<h1 id="header_1">HEADER</h1>
<img src="images/Penguins.jpg" width="300">
<div><h1 id="header_2" class="" name="">HEADER-2</h1></div>
<h1 id="clock"></h1>
<input type="button" value="문서객체생성1" onclick="createTag();"/><br/><!-- 없던 태그 추가 배치-->
</body>
</html>
3. 이미지 태그 생성 - 텍스트 노드가 없는 노드 생성
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM03</title>
<script type="text/javascript">
function createImg(){
var imgTag=document.createElement('img');
imgTag.src='images/Koala.jpg';
imgTag.width=300;
document.body.appendChild(imgTag);
}
</script>
</head>
<body>
<h1 id="header_1">HEADER</h1>
<img src="images/Penguins.jpg" width="300">
<div><h1 id="header_2" class="" name="">HEADER-2</h1></div>
<h1 id="clock"></h1>
<input type="button" value="문서객체생성2" onclick="createImg();"/><br/><!-- 이미지 태그 추가 -->
</body>
</html>
4. 문서 객체의 innerHTML을 이용하여 객체 생성
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM04</title>
<script type="text/javascript">
function createUI(){
var output='<br/>';
output+='<ul>';
output+='<li><h2>JavaScripte</h2></li>';
output+='<li><h2>jQuery</h2></li>';
output+='<li><h2>Ajax</h2></li>';
output+='</ul>';
output+='<br/>';
output+='<ul>';
// alert(output);
document.body.innerHTML+=output;
}
</script>
</head>
<body>
<h1 id="header_1">HEADER</h1>
<img src="images/Penguins.jpg" width="300">
<div><h1 id="header_2" class="" name="">HEADER-2</h1></div>
<h1 id="clock"></h1>
<input type="button" value="문서객체생성3" onclick="createUI();"/><br/>
</body>
</html>
5. 문서 객체 선택 및 가져오기1
-웹페이지에 이미 존재하는 HTML 태그를 스크립트로(id로) 가져오는 방법
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM05</title>
<script type="text/javascript">
// -getElementById() 메서드는 한 번에 한가지 문서 객체만 가져올 수 있음
function getDom(){
var header1=document.getElementById('header_1');
var header2=document.getElementById('header_2');
header1.innerHTML='hello javascript';
header2.innerHTML='hello DOM';
}
</script>
</head>
<body>
<h1 id="header_1">HEADER</h1>
<img src="images/Penguins.jpg" width="300">
<div><h1 id="header_2" class="" name="">HEADER-2</h1></div>
<h1 id="clock"></h1>
<input type="button" value="문서객체 선택_가져오기1" onclick="getDom();"/><br/>
</body>
</html>
6. 문서 객체 선택 및 가져오기2
-getElementByTagName('tagName'): tagName과 일치하는 문서객체를 배열로 가져옴
-getElementByName('name'): 태그의 name 속성이 name과 일치하는 문서 객체를 배열로 가져옴
-getElementByClassName('className'): 태그의 class 속성과 일치하는 문서 객체를 배열로 가져옴
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM06</title>
<script type="text/javascript">
function getDom2(){
var headers=document.getElementsByTagName('h1');
headers[0].innerHTML='태그이름으로 가져오기1';
headers[1].innerHTML='태그이름으로 가져오기2';
// name이나 TagName, ClassName이 중복되어 있다면
// getElement 함수로 가져왔을 때 순서대로 인덱스가 부여된 배열로 사용됨
}
</script>
</head>
<body>
<h1 id="header_1">HEADER</h1>
<img src="images/Penguins.jpg" width="300">
<div><h1 id="header_2" class="" name="">HEADER-2</h1></div>
<h1 id="clock"></h1>
<input type="button" value="문서객체 선택_가져오기2" onclick="getDom2();"/><br/>
</body>
</html>
7. 문서객체의 스타일 변경
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM07</title>
<script type="text/javascript">
function changeStyle(){
var header=document.getElementById('header_1');
header.style.border='1px solid black';
header.style.color='orange';
header.style.backgroundColor='yellow';
}
</script>
</head>
<body>
<h1 id="header_1">HEADER</h1>
<img src="images/Penguins.jpg" width="300">
<div><h1 id="header_2" class="" name="">HEADER-2</h1></div>
<h1 id="clock"></h1>
<input type="button" value="문서객체스타일조작" onclick="changeStyle();"/><br/>
</body>
</html>
8. 문서객체 제거
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM08</title>
<script type="text/javascript">
function removeDom(){
var willRemove=document.getElementById('header_1');
document.body.removeChild(willRemove);
// body 문서 객체 바로 아래 수준에 제거하고자 하는 문서객체가 있을 때 가능한 코드
var willRemove2=document.getElementById('header_2');
willRemove2.parentNode.removeChild(willRemove2);
// 일반적으로 문서 객체를 제거할 때 사용하는 코드
}
</script>
</head>
<body>
<h1 id="header_1">HEADER</h1>
<img src="images/Penguins.jpg" width="300">
<div><h1 id="header_2" class="" name="">HEADER-2</h1></div>
<h1 id="clock"></h1>
<input type="button" value="문서객체제거" onclick="removeDom();"/><br/>
</body>
</html>
9. 날짜/시간 표시
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM09</title>
<script type="text/javascript">
function viewDateTime(){
var clock=document.getElementById('clock');
setInterval(function(){
var date=new Date();
clock.innerHTML=date.toLocaleString();
},1000);
}
</script>
</head>
<body>
<h1 id="header_1">HEADER</h1>
<img src="images/Penguins.jpg" width="300">
<div><h1 id="header_2" class="" name="">HEADER-2</h1></div>
<h1 id="clock"></h1>
<input type="button" value="날짜시간표시" onclick="viewDateTime();"/><br/>
</body>
</html>