
📃 요약
Document Object Model 이라고하며 자바스크립트에서 html 태그를 선택하는 방법, CSS 선택자(태그/id/class/전체/특수 등의 선택자)를 모두 사용할 수 있는 함수를 제공함
요소 기술 :
– Basic : Javascript DOM
📃 기술 구현
스펙 :
- vscode - js (es6)
📃 DOM
- Document Object Model, html 문서(태그 등이 있음) - HTML 태그들을 컴퓨터의 메모리(DRAM)에 저장해서 사용하는 것을 말함 - 저장시 구조화해서 저장하는데 그것을 DOM 이라고 함
html 웹 문서 동작
1) 컴퓨터 웹브라우저에 html 문서를 읽어들임(파싱)
2) 파싱된 문서(DOM)를 메모리에 저장(DOM 저장됨)
- 파싱된 문서는 Tree 구조로 저장됨(자료구조)
– html 문서(DOM) 주요 요소 :
- 태그(tag) - 속성(attribute) - 텍스트(text) - 주석(comment) - 위의 태그, 속성, 텍스트, 주석 별로 구분해서 트리구조로 메모리에 저장됨
아래 html 소스가 메모리에서 어떻게 저장되는지를 시각화한것임
- 03_dom.detail.html
<html>
<head>
</head>
<body>
<!-- DOM 이해를 돕기위한 예제 -->
<div style="background-color: aqua;">안녕하세요</div>
<script src="./js/03_dom_detail.js"></script>
</body>
</html>
예)
- html 문서가 메모리에 저장되는 형태는 아래와 같음 : 03_dom.detail.html
window(최상위 부모객체: html문서, 주소창, 메뉴, 상태바등)
|
document(객체, html 문서)
|
html(태그, 부모)
|
-------------------------------------
| |
head(태그, 자식) body(태그)
|
----------------------------------------
| |
div(태그) - style="backgroundColor='aqua'"(속성) script - src="./js/03_dom_detail.js"
|
"안녕하세요"(텍스트, ==innerHTML속성)
📃 바닐라 js
- DOM 을 선택하는 js 함수들을 말함, 대표적으로 document.querySelector() 함수가 있음 - 과거에는 기능이 부실해서 jQuery 라이브러리를 이용한 개발이 주를 이루었으나 현재는 기능이 업그레이드되고 jQuery 보다 크기나 성능이 빨라져 추천되는 코딩이 되었음
📃 DOM 사용법
DOM 선택함수를 이용해서 다양한 효과를 나타냄
DOM 선택 함수 : 태그선택자
document.querySelector(태그선택자)
예 : 아래 예제 html
<html>
<body>
<h1 id=”h1Id” class=”h1Class”>안녕하세요</h1>
</body>
</html>document.querySelector(태그선택자)
예 :
let num = document.querySelector("h1"); // 변수에 임시 저장
alert(num.innerHTML);
또는
alert(document.querySelector(“h1”).innerHTML); // 변수 사용 않함
DOM 선택 함수 : id선택자
- document.querySelector(id선택자)
예 :
let num = document.querySelector("#h1Id"); // 변수에 임시 저장
alert(num.innerHTML);
또는
alert(document.querySelector(“#h1Id”).innerHTML); // 변수 사용 않함
### DOM 선택 함수 : class선택자
- document.querySelector(class선택자)
```js
예 :
let num = document.querySelector("#h1Class"); // 변수에 임시 저장
alert(num.innerHTML);
또는
alert(document.querySelector(“#h1Class”).innerHTML); // 변수 사용 않함
위의 사례에 비쳐 document.querySelector(css선택자) , css 선택자로 기본/특수선택자 모두 사용 가능함
DOM 선택 함수 : 다수 html 태그 선택
- document.querySelectorAll(css선택자)
예 : 아래 예제 html
<html>
<body>
<h1 id=”h1Id” class=”h1Class”>안녕하세요</h1>
<h1 id=”h1Id2” class=”h1Class”>안녕하세요2</h1>
</body>
</html> - document.querySelectorAll(css선택자) : 2개의 h1 태그가 선택되므로 배열로 저장됨
let h1Tag = document.querySelectorAll("h1"); // 변수에 임시 저장
alert(h1Tag[0].innerHTML);
alert(h1Tag[1].innerHTML);
주요 속성 : innerHTML
설명 : 1) 선택된 html 태그 사이에 문자열 끼워넣기
예 : 아래 예제 html<html>
<body>
<h1 id=”h1Id” class=”h1Class”>안녕하세요</h1>
<div id=”output”></div>
</body>
</html>let val = document.querySelector(“h1”);
// h1 의 값 “안녕하세요” 를 div 태그 위치에 문자열 끼워 넣기document.querySelector(“#output”).innerHTML = val.innerHTML; // 변수 이용
또는
document.querySelector(“#output”).innerHTML = document.querySelector(“h1”).innerHTML; // 변수 이용 않함설명 : 2) 선택된 html 태그 사이에 문자열 가져오기
예 : 아래 예제 html<html>
<body>
<div id=”output”>안녕하세요</div>
</body>
</html>let val = document.querySelector(“h1”);
// h1 의 값 “안녕하세요” 를 div 태그 위치에 문자열 끼워 넣기alert(document.querySelector(“#output”).innerHTML)
📃 이벤트
- 클릭(click), 마우스이동, 키보드 키 다운 등의 모든 것을 말함
- 클릭 이벤트 : 프로젝트에서 사용하는 이벤트는 거의 클릭이벤트가 90% 임
- 2갸지 클릭 패턴을 주로 사용
1) .addEventListener() 함수 이용
2) html 태그의 속성으로 click 사용
1) 클릭이벤트
- html 태그를 클릭했을때 실행되는 이벤트 , 주로 버튼 클릭이 주를 이름
(1) .addEventListener() 함수 이용
06_dom_display.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<p>문서를 열면 팝업 창이 표시됩니다.</p>
<div class="popup" id="notice">
<h1>공지사항</h1>
<ul>
<li>공지사항 내용</li>
<li>공지사항 내용</li>
<li>공지사항 내용</li>
<li>공지사항 내용</li>
<li>공지사항 내용</li>
</ul>
<button>닫기</button>
</div>
<script src="./js/06_dom_display.js"></script>
</body>
</html>
- css선택자를 클릭하면 function 안에 실행문을 실행함
- .addEventListener(click, function(){}); 패턴
사용법 : document.querySelector("css선택자").addEventListener("click", function(){ 실행문; })
예)
let closeBtn = document.querySelector(".popup > button"); // 자손선택자
closeBtn.addEventListener("click", function(){
// 클릭시 실행될 부분
// 2) .popup 태그를 안보이게 함
document.querySelector(".popup").style.display = "none"; // 사라짐
})
(2) html 태그의 속성으로 click 사용
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="./css/function.css">
</head>
<body>
<ul>
<li>
<!-- 사용법 : <태그 onclick="함수명();"></태그> -->
<!-- 클릭하면 함수명() 실행됨 -->
<a href="#" onclick="changeBg('green')">Green</a>
</li>
</ul>
<!-- 출력위치 -->
<div id="result"></div>
<script src="./js/07_dom_onclick.js"></script>
</body>
</html>
function changeBg(color) {
// id=result 위치에 배경색을 바꿈
let result = document.querySelector("#result");
// 배경색 바꾸기
result.style.backgroundColor = color; // color='green'
}
2) mouseOver / mouseOut
- mouseOver : 마우스가 html 태그 위로 올라갔을때 실행되는 함수 - mouseOut : 마우스가 html 태그 밖으로 나갔을때 실행되는 함수
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
color: white;
background-color: skyblue;
padding: 10px;
width: 200px;
text-align: center;
}
</style>
</head>
<body>
<div onmouseover="mouseOver(event)" onmouseout="mouseOut(event)">
마우스를 올려보세요
</div>
<script src="./js/09_event_mouseover.js"></script>
</body>
</html>
// 마우스 위로 함수 : 배경색을 변경(오렌지)
function mouseOver(event) {
// event.target == 현재 마우스위로 올라간 태그(div)
event.target.style.backgroundColor = "orange";
}
// 마우스 나갔을때 함수 : 배경색을 변경(하늘색)
function mouseOut(event) {
// event.target == 현재 마우스위로 올라간 태그(div)
event.target.style.backgroundColor = "skyblue";
}
📃 event.target
- 웹브라우저에서 항상 현재 이벤트(클릭, 마우스오버 등)가 걸린 html 태그가 임시 저장됨
document.getElementById(“id속성명”) :
- document.querySelect(css선택자) 와 유사하게 html 의 id 속성을 선택하는 함수
이미지 컵을 클릭하면 html 태그의 src 속성을 가져오는 예제
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="container">
<!-- 함수의 사용 : myImgClick(event) -->
<img src="./img/cup-1.png" alt="컵" id="cup"
onclick="myImgClick(event)">
</div>
<script>
function myImgClick(event) {
// TODO: event.target == 현재 클릭한 태그
alert("클릭한 이미지 파일명 : " + event.target.src);
}
// querySelector() 함수 == getElementById(id이름);
let img = document.getElementById("cup");
</script>
</body>
</html>
📃 기타 바닐라 함수
children 속성
- html 태그의 자식들을 선택하게 하는 속성
- 목록(li) 태그중에 1번째, 2번째 태그의 글자 출력하기
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>자식 요소(element, 태그) 접근</title>
</head>
<body>
<ul>
<li>HTML</li>
<li>CSS</li>
<li>Vanila js</li>
<li>React</li>
</ul>
<script src="./js/23_dom_handing_children.js"></script>
</body>
</html>
// TODO: 자식 요소(태그) 접근
// 선택함수 : querySelector(css선택자)
let ulTag = document.querySelector("ul"); // ul 태그
// TODO: 사용법 : 태그.children[1] : 2nd li
// 태그.children[2] ; 3rd li
let two = ulTag.children[1].innerHTML; // 2nd li의 텍스트
let three = ulTag.children[2].innerHTML; // 3rd li의 텍스트
// 출력
console.log("two", two);
console.log("three", three);
classList 속성
- 디자이너/파블리셔들이 애용하는 속성 - 임의의 클래스명을 추가/수정/삭제하는 함수를 제공해서 디자인을 변경할 수 있음
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>클래스 리스트 조작(***)</title>
<style>
.red {
color: red;
}
.skyblue {
color: skyblue;
}
</style>
</head>
<body>
<div id="content">JS classList</div>
<script src="./js/28_dom_handing_classList.js"></script>
</body>
</html>
// TODO: 클래스 리스트 조작
// 선택함수 : #content 선택
let content = document.querySelector("#content"); // div 태그
// TODO: 빨간색 클래스 추가
// red 클래스를 div 태그에 추가
// 사용법 : 태그.classList.add("클래스명");
content.classList.add("red");
// TODO: 빨간색 -> 하늘색 교체
// 사용법 : 태그.classList.replace("원클래스", "바꿀클래스")
content.classList.replace("red", "skyblue");
// TODO: 하늘색 클래스 삭제
// 사용법 : 태그.classList.remove("삭제할클래스")
content.classList.remove("skyblue");
// TODO: 클래스가 있으면 삭제, 없으면 추가 : toggle()
// 사용법 : 태그.classList.toggle("토글할클래스");
content.classList.toggle("skyblue"); // 추가가 됨
주요 속성 : input 태그 의 value
설명 : input 태그의 속성 value 는 화면에서 입력양식에 입력된 값
예 : 아래 예제 html
<html>
<body>
<input type=”text” id=”name” value=”안녕하세요”>
<div id=”output”></div>
</body>
</html>input 양식의 value 값 가져오기
let val2 = document.querySelector(“name”); // 변수 사용
alert(val2.value);
또는
alert(document.querySelector(“name”).value); // 변수 사용 않함input 양식의 value 값 변경하기
document.querySelector(“name”).value = “값을 변경했어요”;
alert(document.querySelector(“name”).value);
그 외 html 의 모든 속성을 DOM 선택 함수로(document.querySelector(css선택자)) 선택해서 값을 가져오거나 값을 변경할 수 있음
📃 변수의 종류 :
전역변수 : 어디서나 사용할 수 있는 변수
- 단점 : 너무 많이 사용하면 메모리 부족 현상 생김
사용법 : 변수명 ( let , const 예약어를 빼고 사용 ) 예) num = 1; // 전역변수
지역변수 : {} 내에서 사용되며 {} 벗어나면 삭제됨
- 장점 : 메모리 부족 현상을 막을 수 있어서 사용이 권장됨
사용법 : let 변수명; 예) let num = 1; // 지역변수
📃 전역 객체
- 웹 브라우저에서 미리 정의되어 있는 객체로 어떤 소스에서도 불러 사용할 수 있음 - 종류 : Window , Location, Screen 등의 객체가 있음
1) Window 전역 객체
- 웹 브라우저의 최상위 객체 - 웹 브라우저 메뉴바, 상태바 등을 가지고 있고, 속성값에 접근할 수 있음
새창/새탭 띄우기
- 웹브라우저에서 새탭 띄우기가 금지되어 있을 경우 해제하고 실습할 것
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
#container {
width: 300px;
margin: 20px auto;
}
button {
border: 1px solid #222;
padding: 15px;
font-size: 0.8em;
margin-right: 20px;
}
</style>
</head>
<body>
<div id="container">
<button onclick="openWin()">팝업 창 열기</button>
<button onclick="closeWin()">팝업 창 닫기</button>
</div>
<script src="./js/01_window_open.js"></script>
</body>
</html>
// 새창(새탭) 열기/닫기, 새창/새탭 금지(웹브라우저 설정)
function openWin() {
let opt = "width=400, height=350"; // 새창 크기
// myWin : let(예약어 없음 : 전역변수, 추천하지 않음)
// 사용법 : window.open("html이름", "새창제목", "크기")
myWin = window.open("notice.html", "doit", opt);
}
function closeWin() {
myWin.close(); // 새창 띄우고 리턴된 변수를 사용
}
2) Location 객체
- 웹브라우저 주소창의 속성을 가지고 있는 객체 - 주로 웹페이지 이동시 사용함
사용법 : location.href = "url";
- url 로 페이지 이동, url 과거이력이 있어서 웹브라우저의 뒤로가기 기능 사용가능
사용법 : location.replace("url");
- url 로 페이지 이동, url 과거이력은 없음, 웹브라우저 뒤로가기 기능 사용못함
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Location 객체 2</title>
</head>
<body>
<button onclick="moveNaver()">네이버로 이동</button>
<button onclick="moveGoogle()">구글 이동</button>
<script>
// 함수 정의
function moveNaver() {
// 이력 : 웹브라우저 기본기능(방문한 페이지는 자동 저장됨)
// 페이지 이동 : 이력(history)을 남기면서 이동(뒤로 갈수 있음)
location.href = "http://www.naver.com";
}
function moveGoogle() {
// 페이지 이동 : 이력(history)을 남기지않음(뒤로 갈수 없음)
location.replace("http://www.google.com");
}
</script>
</body>
</html>



