Document Object Model : 웹의 문서와 웹의 태그와 관련된 객체
HTML 요소들의 구조화된 표현
DOM 객체 구조 = ‘노드 트리’ : 부모 가지 —> 자식 가지(element) —> 잎
이러한 DOM 요소를 기반으로 브라우저가 해석하여 랜더링
window.onload = () => {
// p 엘리먼트 생성
const eleNode = document.createElement("p");
// 텍스트 노드 생성
const txtNode = document.createTextNode("Welcome to DOM");
// 합하기
eleNode.appendChild(txtNode); // <p>Welcome to DOM</p>
// body에 붙이기
document.body.appendChild(eleNode);
};
window.onload = () => {
// img 엘리먼트 생성
const imgNode = document.createElement("img");
// 생성한 이미지 엘리먼트(태그)에 속성 추가
imgNode.src =
"https://cdn.pixabay.com/photo/2020/11/07/13/07/waves-5720916_960_720.jpg";
imgNode.width = 400;
imgNode.height = 300;
// body에 붙이기
document.body.appendChild(imgNode);
};
setAttribute() 메서드를 이용하여 속성 추가
—> 사용자 정의 속성을 직접 만들어서 추가하는 것이 가능
window.onload = () => {
// img 엘리먼트 생성
const imgNode = document.createElement("img");
// 생성한 이미지 엘리먼트에 속성을 추가
imgNode.setAttribute(
"src",
"https://cdn.pixabay.com/photo/2020/11/07/13/07/waves-5720916_960_720.jpg"
);
imgNode.setAttribute("width", 400);
imgNode.setAttribute("height", 400);
imgNode.setAttribute("addProperty", "obj");
// <img src="https://cdn.pixabay.com/photo/2020/11/07/13/07/waves-5720916_960_720.jpg" width="400" height="400" addproperty="obj1">
// body에 붙이기
document.body.appendChild(imgNode);
};
window.onload = () => {
// 문자열 변수 생성
let strHtml = "";
strHtml += "<h1>제목 : 동해안 파도</h1>";
strHtml +=
"<img src='https://cdn.pixabay.com/photo/2020/11/07/13/07/waves-5720916_960_720.jpg'";
strHtml += "width='400' height='300'>";
// --> 텍스트 자체로 삽입
document.body.innerText = strHtml;
// HTML 태그로 삽입
document.body.innerHTML = strHtml;
};
버튼 클릭시 사용자 이름과 홈페이지 주소가 바디에 추가
// index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<form>
<label for="user_name">
수강생 이름: <input type="text" size="50" id="user_name" /> <br />
</label>
<label for="user_home">
수강생 홈피: <input type="text" size="50" id="user_home" /> <br /><br />
</label>
<input type="button" id="btn" value="사용자 추가하기" />
</form>
<br />
<div id="memberList"></div>
<script src="app.js"></script>
</body>
</html>
// app.js
window.onload = () => {
document.getElementById("btn").addEventListener("click", function () {
const user_name = document.getElementById("user_name");
const user_home = document.getElementById("user_home");
// a 태그 노드 생성
const aNode = document.createElement("a");
aNode.href = user_home.value;
// 텍스트 노드 생성
const txtNode = document.createTextNode(user_name.value);
aNode.appendChild(txtNode);
// 붙이기
const memberList = document.getElementById("memberList");
const br = document.createElement("br");
memberList.appendChild(aNode);
memberList.appendChild(br);
user_name.value = "";
user_home.value = "";
});
};
window.onload = () => {
document.getElementById("btn").addEventListener("click", function () {
const memberList = document.getElementById("memberList");
const p1 = document.getElementById("p1");
memberList.removeChild(p1);
});
};
window.onload = () => {
document.getElementById("btn").addEventListener("click", function () {
const p1 = document.getElementById("p1");
p1.parentNode.removeChild(p1);
});
};
function removeEleByText(text) {
const li = document.querySelectorAll("li");
// 삭제
li.forEach((e) => {
if (e.innerText == text) {
e.parentNode.removeChild(e);
}
});
}
document.getElementById("btn").addEventListener("click", function () {
removeEleByText("박진수");
});
자바스크립트에서 Element 배열을 다룰 시
NodeList vs Array
console.log(li.item(0)); // 첫번째 li 요소
console.log(li.item(4)) // NodeList >> null
console.log(li[4]) // Array >> undefined
// index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<link rel="stylesheet" href="main.css" />
</head>
<body>
<div class="wrap">
<ul>
<li>
<img src="01.jpg" alt="" class="smallImg" data-image="01.jpg" />
</li>
<li>
<img src="02.jpg" alt="" class="smallImg" data-image="02.jpg" />
</li>
<li>
<img src="03.jpg" alt="" class="smallImg" data-image="03.jpg" />
</li>
<li>
<img src="04.jpg" alt="" class="smallImg" data-image="04.jpg" />
</li>
</ul>
<div class="box">
<img src="05.jpg" alt="" id="bigImg" data-image="05.jpg" />
</div>
</div>
<script src="app.js"></script>
</body>
</html>
// app.js
const imgs = document.querySelectorAll(".smallImg");
for (let i = 0; i < imgs.length; i++) {
imgs[i].onclick = function () {
const bigImg = document.getElementById("bigImg");
bigImg.src = this.dataset.image;
};
}
//-------------------------//
// forEach 사용
imgs.forEach((i) => {
i.addEventListener("click", function () {
document.getElementById("bigImg").src = this.dataset.image;
});
});
onclick
window.onload = () => {
const e = document.getElementById("btn");
e.onclick = () => {
alert("1번"); // 실행안됨
};
e.onclick = () => {
alert("2번"); // --> 실행
};
};
addEventListener
window.onload = () => {
const e = document.getElementById("btn");
e.addEventListener("click", function () {
alert("1번");
});
e.addEventListener("click", function () {
alert("2번");
});
// 순서대로 둘 다 실행
};
window.onload = () => {
const lis = document.querySelectorAll("li");
lis.forEach((e) => {
e.addEventListener("click", function (e) {
console.log(e.target);
// <img/> : 이벤트가 일어날 (자식) 객체
// 이벤트 버블링의 가장 끝단에 위치한 마지막 요소를 반환
console.log(e.currentTarget);
// <li><img/></li> : 이벤트가 위임된 부모 객체를 반환
});
});
};