직접 제작한 그림, 사진이 아닐 경우 출처를 링크로 첨부합니다.
해당 그림, 사진을 클릭해서 확인하세요.
메소드 | 설명 |
---|---|
document.getElementsByTagName(태그이름) | 해당 태그 이름의 요소를 모두 선택함. |
document.getElementById(아이디) | 해당 아이디의 요소를 선택함. |
document.getElementsByClassName(클래스이름) | 해당 클래스에 속한 요소를 모두 선택함. |
document.getElementsByName(name속성값) | 해당 name 속성값을 가지는 요소를 모두 선택함. |
document.querySelectorAll(선택자) | 해당 선택자로 선택되는 요소를 모두 선택함. |
메소드 | 설명 |
---|---|
document.createElement(HTML요소) | 지정된 HTML 요소를 생성함. |
document.write(텍스트) | HTML 출력 스트림을 통해 텍스트를 출력함. |
메소드 | 설명 |
---|---|
document.getElementById(아이디).onclick = function(){ 실행할 코드 } | 마우스 클릭 이벤트와 연결될 이벤트 핸들러 코드를 추가함. |
객체 | 설명 |
---|---|
document.body | <body> 요소를 반환함. |
document.cookie | HTML 문서의 쿠키(cookie)를 반환함. |
document.domain | HTML 문서가 위치한 서버의 도메인 네임(domain name)을 반환함. |
document.forms | <form> 요소를 모두 반환함. |
document.images | <img> 요소를 모두 반환함. |
document.links | href 속성을 가지는 <area> 요소와 <a> 요소를 모두 반환함. |
document.referrer | 링크(linking)되어 있는 문서의 URI를 반환함. |
document.title | <title> 요소를 반환함. |
document.URL | HTML 문서의 완전한 URL 주소를 반환함 |
HTML 요소를 다루기 위해서는 우선 해당 요소를 선택해야만 한다.
자바스크립트에서 특정 HTML 요소를 선택하는 방법은 아래와 같다.
DOM (Document Object Model)
- 웹 페이지를 프로그래밍 언어로 조작할 수 있게 해주는 인터페이스
- 웹 페이지의 구조를 표현하는 방법으로, HTML과 XML 문서를 계층적인 트리 구조로 표현한다.
- 이 트리의 각 노드는 객체를 나타내고, 객체는 속성(properties), 메서드(methods), 그리고 이벤트(events)를 가질 수 있다.
- DOM을 이용하면 자바스크립트와 같은 스크립팅 언어를 통해 웹 페이지의 내용과 구조를 동적으로 변경할 수 있다.
- 웹 페이지에 interactive한 기능을 추가하기 위해 주로 사용한다.
document.getElementsByTagName()
메서드를 사용하면, 해당 HTML 태그 이름을 가진 모든 요소를 선택할 수 있다.var paragraphs = document.getElementsByTagName('p'); // 모든 <p> 태그를 선택함
document.getElementById()
메서드를 사용하면, 해당 아이디를 가진 요소를 선택할 수 있다. var uniqueElement = document.getElementById('my-id'); // 아이디가 'my-id'인 요소를 선택함
document.getElementsByClassName()
메서드를 사용하면, 해당 클래스를 가진 모든 요소를 선택할 수 있다. var elementsWithClass = document.getElementsByClassName('my-class'); // 클래스가 'my-class'인 모든 요소를 선택함
document.getElementsByName()
메서드를 사용하면, name 속성값이 일치하는 모든 요소를 선택할 수 있다.document.querySelector()
와 document.querySelectorAll()
메서드를 사용하면, CSS 선택자에 일치하는 요소를 선택할 수 있다.querySelector()
는 일치하는 첫 번째 요소를, querySelectorAll()
은 모든 요소를 선택한다.var firstElement = document.querySelector('.my-class'); // 클래스가 'my-class'인 첫 번째 요소를 선택함
var allElements = document.querySelectorAll('.my-class'); // 클래스가 'my-class'인 모든 요소를 선택함
document.forms
를 사용하면 문서 내의 모든 <form>
요소에 접근할 수 있다. var allForms = document.forms; // 문서 내의 모든 <form> 요소를 선택함
HTML 문서의 정보는 노드 트리(node tree)라고 불리는 계층적 구조에 저장된다.
이러한 노드 트리는 노드들의 집합이며, 노드 간의 관계를 보여준다.
자바스크립트에서는 HTML DOM을 이용하여 노드 트리에 포함 된 모든 노드에 접근할 수 있다.
노드 종류 | 설명 |
---|---|
문서 노드 (document node) | HTML 문서 전체를 나타내는 노드임. |
요소 노드 (element node) | 모든 HTML 요소는 요소 노드이며, 속성 노드를 가질 수 있는 유일한 노드임. |
속성 노드 (attribute node) | 모든 HTML 요소의 속성은 속성 노드이며, 요소 노드에 관한 정보를 가지고 있음. 하지만 해당 요소 노드의 자식 노드(child node)에는 포함되지 않음. |
텍스트 노드 (text node) | HTML 문서의 모든 텍스트는 텍스트 노드임. |
주석 노드 (comment node) | HTML 문서의 모든 주석은 주석 노드임. |
Node Property | Description |
---|---|
parentNode | 해당 노드의 부모 노드를 참조한다. |
childNodes | 해당 노드의 자식 노드들의 리스트를 참조한다. |
firstChild | 해당 노드의 첫 번째 자식 노드를 참조한다. |
lastChild | 해당 노드의 마지막 자식 노드를 참조한다. |
nextSibling | 해당 노드의 바로 다음에 위치한 형제 노드를 참조한다. |
previousSibling | 해당 노드의 바로 이전에 위치한 형제 노드를 참조한다. |
nodeName | 해당 노드의 이름을 반환한다. 요소 노드의 경우, 이는 태그 이름이다. |
nodeValue | 해당 노드의 값을 반환한다. 이 값은 노드의 유형에 따라 달라진다. 예를 들어, 텍스트 노드의 경우, 이는 노드의 텍스트 내용이다. |
nodeType | 해당 노드의 유형을 나타내는 코드를 반환한다. 예를 들어, 요소 노드의 경우, 이 값은 1이다. |
<!DOCTYPE html>
<html>
<body>
<p id="paragraph">Hello World!</p>
<p>OpenAI is great!</p>
<p>ChatGPT is really smart!</p>
<script src="script.js"></script>
</body>
</html>
// 첫 번째 p 요소를 선택한다.
var p = document.getElementById("paragraph");
// parentNode 프로퍼티
console.log(p.parentNode.nodeName);
// childNodes 프로퍼티
console.log(p.childNodes.length);
// firstChild 프로퍼티
console.log(p.firstChild.nodeValue);
// lastChild 프로퍼티
console.log(p.lastChild.nodeValue);
// nextSibling 프로퍼티
console.log(p.nextSibling.nodeName);
// previousSibling 프로퍼티
console.log(p.previousSibling);
// nodeName 프로퍼티
console.log(p.nodeName);
// nodeValue 프로퍼티
console.log(p.firstChild.nodeValue);
// nodeType 프로퍼티
console.log(p.nodeType);
HTML 문서의 요소들을 배열처럼 다루는 객체
- 특정 요소나 조건에 따라 선택된 모든 노드를 저장하며, 이들은 순서대로 접근 가능하다.
getElementsByTagName()
메소드나childNodes
프로퍼티를 이용해 노드 리스트를 얻을 수 있다.- 노드 리스트는 실시간으로 업데이트 된다. 이는 원본 HTML 문서가 변화할 때 노드 리스트도 그 변화를 바로 반영한다는 것을 의미한다.
- 노드 리스트 내의 각 노드는 0부터 시작하는 인덱스를 이용해 접근할 수 있다. 이는 배열과 유사한 방식으로 노드를 다룰 수 있게 한다.
var pList = document.getElementsByTagName("p"); // 모든 <p> 요소를 선택
for (var i = 0; i < pList.length; i++) { // 선택된 모든 <p> 요소를 순회
console.log(pList[i].textContent); // 각 <p> 요소의 텍스트 내용을 출력
}
html 문서 앞에 <script>
태그 내에 js코드를 작성했고, 문서가 로드 되기 전에 script의 element를 가져오지 못한 상태에서 console.log로 디버그하여 개발자도구에 확인해보았을때는 왜 element를 가져와졌는지 이유에 대해서 알아보시오.
<!DOCTYPE html>
<html lang='ko'>
<head>
<meta charset='UTF-8'>
<title>JavaScript DOM Element</title>
<script>
//HTML 태그 이름을 이용한 선택
console.log('aaa')
var selectedItem = document.getElementsByTagName('li'); // 모든 <li> 요소를 선택함.
console.log(selectedItem) // 얘는 로그 찍히는 것 처럼 보인다.
console.log(selectedItem.length) // 얘는 안찍힌다.
for (var i = 0; i < selectedItem.length; i++) { // 실제로 selectedItem.length를 받아오지 못해서 색도 안바뀐다.
selectedItem.item(i).style.color = 'red';
console.log(selectedItem.item(i));
}
</script>
</head>
<body>
<h1>HTML 태그 이름을 이용한 선택</h1>
<ul>
<li>첫 번째 아이템이에요!</li>
<li>두 번째 아이템이에요!</li>
<li>세 번째 아이템이에요!</li>
<li>네 번째 아이템이에요!</li>
<li>다섯 번째 아이템이에요!</li>
</ul>
<script>
// 원래 여기에 적는게 맞다.
</script>
</body>
</html>
위 코드의 경우 var selectedItem = document.getElementsByTagName('li');
을 body가 로드되기 전에 읽어지는 헤더에 적어 뒀기 때문에 원래대로라면 객체를 찾아오지 못해야한다. 그리고 실제로 selectedItem.length
를 받아오지 못해서 색도 안바뀌며 selectedItem.length
는 콘솔창에 0으로 찍히는 것을 확인할 수 있다.
그런데 헤더에 위치한 console.log(selectedItem)
는 정상적으로 값을 가져와 5개의 <li>
를 콘솔창에 나타내고 있다. 도대체 왜 그럴까??
HTML 문서는 위에서 아래로 해석되는데, 이는 스크립트 코드도 마찬가지다. <script>
태그를 HTML의 <head>
에 위치시키면, 그 스크립트는 HTML 문서의 나머지 부분이 아직 로드되지 않은 상태에서 실행된다. 따라서 <head>
태그 내에 위치한 JavaScript 코드가 실행되는 시점에서는 아직 <body>
태그 내의 DOM 요소들이 생성되지 않았으므로, 해당 DOM 요소를 선택하거나 조작할 수 없다.
이 코드의 경우, <head>
내부에 위치한 스크립트는 아직 <body>
내부의 <li>
요소들이 생성되지 않은 상태에서 document.getElementsByTagName("li")를 호출하므로, 선택된 요소가 없다. 그래서 console.log(selectedItem)
의 출력 결과는 비어있는 NodeList가 되며 console.log(selectedItem.length)
는 0으로 콘솔창에 남는다.
즉, console.log(selectedItem)
과 console.log(selectedItem.length)
두가지 모두 다 읽어지는 당시에는 값을 제대로 가져오지 못하는게 맞다!!
하지만 노드 객체는 웹 페이지의 상태에 따라 실시간으로 변경된다. 따라서 페이지가 로딩됨에 따라 selectedItem
노드 객체의 값은 최신화 된다. 하지만 console.log()
는 일반적으로 실행되는 시점에서의 값을 출력하기 때문에 최신화 된 노드 객체의 값이 안보이는게 정상인데 왜 보이는걸까?
console.log()
는 일반적으로 실행되는 시점에서의 값을 출력하는 것이 맞지만 console.log(selectedItem)
은 HTMLCollection 객체에 대한 참조를 출력하는 것으로, 이 참조는 실시간으로 동적인 페이지 상태를 반영한다. (브라우저의 기능)
(selectedItem.length
은 객체가 아니라 숫자 데이터 타입의 값이라 동적 상태를 반영하는 기능을 브라우저가 지원하지 않는다.)
따라서 브라우저의 기능 떄문에 웹 개발자 도구의 콘솔에서 로그가 호출된 시점 이후에 로드된 DOM 요소들이 업데이트 되어 볼 수 있는 것이다!!!
- 객체 타입의 값은 동적 반영이 된다!!
Web-API를 이용하여 본인의 웹사이트의 기능을 구현한 후 코드와 작동되는 화면을 영상 또는 스크린샷을 찍어서 첨부하기
https://eunjin.site
배포 주소에서 직접 확인 가능합니다.
<script>
$(document).ready(function () {
show_comment();
});
function save_comment() {
let name = $('#name').val()
let comment = $('#comment').val()
$.ajax({
type: "POST",
url: "https://eunjin.site/comments",
data: {'name': name, 'comment': comment},
success: function (response) {
alert(response["msg"])
window.location.reload()
}
});
}
function show_comment() {
$('#comment-list').empty()
$.ajax({
type: "GET",
url: "https://eunjin.site/comments",
data: {},
success: function (response) {
let rows = response;
for (let i = 0; i < rows.length; i++) {
let name = rows[i].name;
let comment = rows[i].comment;
let temp_html = `<div class="card">
<div class="card-body">
<blockquote class="blockquote mb-0">
<p>${comment}</p>
<footer class="blockquote-footer">${name}</footer>
</blockquote>
</div>
</div>`
$('#comment-list').append(temp_html)
}
}
});
}
</script>
본 후기는 정보통신산업진흥원(NIPA)에서 주관하는 <AI 서비스 완성! AI+웹개발 취업캠프 - 프론트엔드&백엔드> 과정 학습/프로젝트/과제 기록으로 작성 되었습니다.
#정보통신산업진흥원 #NIPA #AI교육 #프로젝트 #유데미 #IT개발캠프 #개발자부트캠프 #프론트엔드 #백엔드 #AI웹개발취업캠프 #취업캠프 #개발취업캠프