1. window 객체
window.document
: 현재 문서에 대한 Document 개체 반환window.alert(massage)
: 윈도우 객체에 내장되어 있는 경고창 내보냄window.confirm()
: 확인을 위한 대화상자 표시, 사용자 선택 반환window.setTimeout()
: 지정된 시간 후 함수 실행window.setInterval()
: 지정된 시간간격으로 함수 실행location.href
: 현재 페이지의 전체 URL 반환location.reload()
: 페이지 새로고침location.replace()
: 새로운 URL로 대체location.hostname()
: 현재 페이지 호스트 이름 반환navigator.userAgent
: 브라우저 사용자 에이전트 문자열 반환screen.width
: 화면의 너비 픽셀 단위 반환screen.height
: 화면의 높이 픽셀 단위 반환screen.availWidth
: 현재 사용 가능한 화면 너비 반환screen.availHeight
: 현재 사용 가능한 화면 높이 반환querySelector()
: CSS 선택자 방식으로 단일 선택querySelectorAll()
: CSS 선택자 방식으로 복수 선택getElementById()
: ID 속성값으로 단일 선택getElementByTagName()
: 태그명으로 복수 선택getElementByClassName()
: 클래스 속성값으로 복수 선택parentNode
: 현재 노드의 부모 요소 반환childNodes
: 현재 요소의 모든 자식 노드 반환firstChild / lastChild
: 첫 번째 또는 마지막 자식 노드 반환nextSSibling / previousSibling
: 현재 노드의 형제 요소 반환.style.속성명
: 스타일 변경setAttribute(name, value)
: 속성 추가, 변경getAttribute(name)
: 속성 가져오기removeAttribute(name)
: 속성 제거classList.
: class 속성 제어add()
: 클래스 추가remove()
: 클래스 제거toggle()
: 있으면 삭제, 없으면 추가contains()
: 클래스 존재 여부 확인콘텐츠 변경
innerHTML
: HTML 콘텐츠 변경outerHTML
: HTML 콘텐츠 변경innerText
: Text 콘텐츠 변경textContent
: Text 콘텐츠 변경요소 동적 추가
createElement()
+ appendChild()
: 마지막 자식 요소로 추가insertBefore(새로운요소, 위치지정)
: 지정된 요소의 앞에 새로운 요소 추가innerHTML
요소 삭제
remove()
: 직접 삭제removeChild()
: 부모 문서 객체의 자식 요소 삭제노드 관계 요소
노드 엘리먼트 관계 요소
2. 이벤트
BOM
와 DOM
>window 객체
DOM
과 BOM
, Javascript
의 기본객체가 포함window 객체
의 속성으로 존재window.document
console.log(window.document.title);
window.alert(massage)
ex) 아이디를 입력하지 않고 전송버튼을 누를 때
“아이디를 입력해 주세요” 경고창이 뜨도록 설정
window.alert("안녕하세요!");
window.confirm()
let result = window.confirm("정말로 삭제하시겠습니까?");
window.setTimeout()
setTimeout(() => { console.log("1초 후 실행"); }, 1000);
const alarm = {
remind(aMessage) {
alert(aMessage);
this.timeoutID = undefined;
},
setup() {
if (typeof this.timeoutID === "number") {
this.cancel();
}
this.timeoutID = setTimeout(
(msg) => {
this.remind(msg);
},
1000,
"일어나세요!",
);
},
cancel() {
clearTimeout(this.timeoutID);
},
};
window.addEventListener("click", () => alarm.setup());
window.setInterval()
setInterval(() => { console.log("1초마다 실행"); }, 1000);
clearInterval(intervalID)
BOM (Brower Object Model)
location 객체
, navigator 객체
, screen 객체
, history 객체
location
객체location.href
console.log(location.href);
// 현재 URL 출력
console.log("현재 URL:", location.href);
location.reload()
location.reload();
// 페이지 새로 고침
function reloadPage() {
location.reload();
}
location.replace()
location.replace('https://www.example.com');
// URL 대체
function navigateToGoogle() {
location.replace("<https://www.google.com>");
location.hostname()
navigator
객체navigator.userAgent
console.log(navigator.userAgent);
// 사용자 에이전트 정보 출력
console.log("사용자 에이전트:", navigator.userAgent);
screen
객체screen.width
screen.height
screen.availWidth
screen.availHeight
// 화면 크기 출력
console.log("화면 너비:", screen.width);
console.log("화면 높이:", screen.height);
// 사용 가능한 화면 크기 출력
console.log("사용 가능한 너비:", screen.availWidth);
console.log("사용 가능한 높이:", screen.availHeight);
DOM (Document Object Model)
Node
로 표현, 노드는 요소 노드(Element Node), 속성 노드(Attribute Node), 텍스트 노드(Text Node) 등 다양한 종류가 있음선택
과 제어
getElementById()
const element = document.getElementById("myElement");
getElementByTagName()
const elements = document.getElementsByTagName("p");
// 모든 <p> 태그 선택
getElementByClassName()
const elements = document.getElementsByClassName("myClass");
// 클래스가 "myClass"인 모든 요소 선택
querySelector()
const element = document.querySelector(".myClass");
// 첫 번째 "myClass" 클래스 선택
querySelectorAll()
const elements = document.querySelectorAll("div.myClass");
// 모든 "myClass" 클래스의 <div> 선택
parentNode
현재 노드의 부모 요소를 반환합니다.
const parent = document.querySelector('p').parentNode;
childNodes
현재 요소의 모든 자식 노드를 반환합니다.
const children = document.querySelector('div').childNodes;
firstChild
/ lastChild
첫 번째 자식 노드 또는 마지막 자식 노드를 반환합니다.
const firstChild = document.querySelector('ul').firstChild;
const lastChild = document.querySelector('ul').lastChild;
nextSibling
/ previousSibling
현재 노드의 형제 요소를 반환합니다.
const nextSibling = document.querySelector('li').nextSibling;
const previousSibling = document.querySelector('li').previousSibling;
.style.속성명
document.getElementById("myElement").style.color = "red";
// 텍스트 색상을 빨간색으로 변경
setAttribute(name, value)
document.getElementById("myElement").setAttribute("class", "highlight");
// 클래스 속성 추가
const link = document.querySelector('a');
link.setAttribute('href', 'https://example.com');
getAttribute(name)
const link = document.querySelector('a');
const hrefValue = link.getAttribute('href');
removeAttribute(name)
document.getElementById("myElement").removeAttribute("class"); // 클래스 속성 제거
const link = document.querySelector('a');
link.removeAttribute('href');
classList
setAttribute
와는 달리,classList
는 원하는 것만 수정add()
: 클래스 추가remove()
: 클래스 제거toggle()
: 클래스 있으면 삭제, 없으면 추가contains()
: 클래스 존재 여부 확인const element = document.querySelector('div');
element.classList.add('new-class');
element.classList.remove('old-class');
innerHTML
document.getElementById("myElement").innerHTML = "<strong>Hello, World!</strong>"; // HTML 변경
outerHTML
const element = document.querySelector('div');
element.outerHTML = '<section>섹션으로 변경</section>';
innerText
document.getElementById("myElement").innerText = "Hello, World!"; // 텍스트 변경
textContent
document.getElementById("myElement").textContent =
"Hello, World!"; // 텍스트 변경
createElement()
+ appendChild()
활용innerHTML
보다 우수appendChild
필요const newDiv = document.createElement('div'); // 새로운 div 요소 생성
newDiv.classList.add('new-element'); // 클래스 추가
newDiv.textContent = '새로운 내용입니다'; // 텍스트 콘텐츠 추가
const parent = document.getElementById('content');
parent.appendChild(newDiv); // 부모 요소에 추가
insertBefore()
활용const newDiv = document.createElement('div');
const firstChild = document.getElementById('content').firstChild;
document.getElementById('content').insertBefore(newDiv, firstChild);
innerHTML
활용const newElementHTML = `
<div class="new-element">
<h2>새로운 제목</h2>
<p>새로운 내용입니다</p>
</div>
`;
document.getElementById('content').innerHTML = newElementHTML; // HTML 삽입
remove()
document.getElementById("myElement").remove(); // 요소 삭제
removeChild()
const parent = document.querySelector("div");
const child = document.querySelector("p");
parent.removeChild(child); // div의 자식 p 태그 삭제
DOM Node
Node.parentNode
: 현재 노드를 기준으로 부모 노드를 선택합니다. 부모 노드는 해당 노드를 포함하고 있는 노드입니다.
const childNode = document.querySelector(".child");
const parentNode = childNode.parentNode;
console.log(parentNode); // .child의 부모 노드를 출력
Node.firstChild
: 현재 노드를 기준으로 첫 번째 자식 노드를 선택합니다. 첫 번째 자식 노드는 텍스트 노드나 요소 노드 등일 수 있습니다.
const parentNode = document.querySelector(".parent");
const firstChild = parentNode.firstChild;
console.log(firstChild); // 부모의 첫 번째 자식 노드를 출력
Node.lastChild
: 현재 노드를 기준으로 마지막 자식 노드를 선택합니다. 마지막 자식 노드도 텍스트 노드나 요소 노드 등일 수 있습니다.
const lastChild = parentNode.lastChild;
console.log(lastChild); // 부모의 마지막 자식 노드를 출력
Node.previousSibling
: 현재 노드를 기준으로 이전 형제 노드를 선택합니다. 형제 노드는 같은 부모를 가지는 노드입니다.
const siblingNode = childNode.previousSibling;
console.log(siblingNode); // .child의 이전 형제 노드를 출력
Node.nextSibling
: 현재 노드를 기준으로 다음 형제 노드를 선택합니다.
const nextSibling = childNode.nextSibling;
console.log(nextSibling); // .child의 다음 형제 노드를 출력
Node.childNodes
: 현재 노드를 기준으로 모든 자식 노드들을 선택합니다. 이때 반환되는 노드 리스트는 요소 노드, 텍스트 노드 등 다양한 타입을 포함합니다.
const childNodes = parentNode.childNodes;
console.log(childNodes); // 부모의 모든 자식 노드를 출력
Node.parentElement
: 현재 노드의 부모 엘리먼트를 선택합니다. parentNode
와 유사하지만, 항상 엘리먼트 노드만 반환합니다.
const parentElement = childNode.parentElement;
console.log(parentElement); // .child의 부모 엘리먼트를 출력
Node.children
: 현재 노드의 자식 엘리먼트 노드를 선택합니다. 이때 반환되는 컬렉션은 HTMLCollection으로, 모든 자식 요소를 포함합니다.
const children = parentNode.children;
console.log(children); // 부모의 모든 자식 엘리먼트를 출력
Node.lastElementChild
: 현재 노드의 마지막 엘리먼트 노드를 선택합니다. 마지막 자식 노드가 요소 노드일 경우에만 반환됩니다.
const lastElementChild = parentNode.lastElementChild;
console.log(lastElementChild); // 부모의 마지막 자식 엘리먼트를 출력
Node.previousElementSibling
: 현재 노드의 이전 엘리먼트 노드를 선택합니다. 이전 형제 노드가 요소 노드일 경우에만 반환됩니다.
const previousElementSibling = childNode.previousElementSibling;
console.log(previousElementSibling); // .child의 이전 엘리먼트 노드를 출력
Node.nextElementSibling
: 현재 노드의 다음 엘리먼트 노드를 선택합니다. 다음 형제 노드가 요소 노드일 경우에만 반환됩니다.
const nextElementSibling = childNode.nextElementSibling;
console.log(nextElementSibling); // .child의 다음 엘리먼트 노드를 출력
Node.childElementCount
: 현재 노드의 자식 엘리먼트 노드의 개수를 반환합니다.
const childElementCount = parentNode.childElementCount;
console.log(childElementCount); // 부모의 자식 엘리먼트 노드의 갯수를 출력
클릭 이벤트
, 키보드 이벤트
, 체인지 이벤트
등// ex)
// .addEventListener가 붙은 div가 event.currentTarget
// click이 일어나는 요소인 div가 event.target
document.querySelector("div").addEventListener("click", function (e) {
// addEventListener가 이벤트 리스너
// function(e){}가 이벤트 핸들러
// click이 이벤트 타입
console.log(e); // 여기서 e가 이벤트 객체
});
preventDefalt()
Event.target
Event.currentTarget
addEventListener
removeEventListener
click
, 더블 클릭 dblclick
, 스크롤 scroll
등[문서객체].addEventListener("이벤트명", 콜백함수);
문서에서 <p> 요소를 클릭했을 때 알림을 표시하는 코드는 다음과 같습니다:
document.querySelector("p").addEventListener("click", function(){
alert("클릭하셨습니다.");
});
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>클릭 이벤트 예제</title>
</head>
<body>
<button id="myButton">클릭하세요!</button>
<div id="output"></div>
<script>
const button = document.getElementById("myButton");
const output = document.getElementById("output");
button.addEventListener("click", function() {
output.textContent = "버튼이 클릭되었습니다!";
output.style.color = "green"; // 글씨 색 변경
});
</script>
</body>
</html>
keydown
은 키를 누르는 순간, keyup
은 키를 뗄 때 발생합니다.<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>키보드 이벤트 예제</title>
</head>
<body>
<input type="text" id="inputField" placeholder="여기에 입력하세요..." />
<div id="keyOutput"></div>
<script>
const inputField = document.getElementById("inputField");
const keyOutput = document.getElementById("keyOutput");
inputField.addEventListener("keydown", function(event) {
keyOutput.textContent = `누른 키: ${event.key}`;
});
inputField.addEventListener("keyup", function(event) {
keyOutput.textContent += ` (뗀 키: ${event.key})`;
});
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>드래그 이벤트 예제</title>
<style>
#draggable {
width: 100px;
height: 100px;
background-color: blue;
cursor: move; /* 드래그 시 커서 변경 */
position: relative;
}
</style>
</head>
<body>
<div id="draggable" draggable="true">드래그 해보세요!</div>
<div id="status"></div>
<script>
const draggable = document.getElementById("draggable");
const status = document.getElementById("status");
draggable.addEventListener("dragstart", function(event) {
status.textContent = "드래그가 시작되었습니다!";
event.dataTransfer.setData("text/plain", "이것은 드래그 중입니다.");
});
draggable.addEventListener("dragend", function(event) {
status.textContent = "드래그가 종료되었습니다!";
});
</script>
</body>
</html>
submit
, change
, input
이 있습니다.<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>폼 이벤트 예제</title>
<style>
#output {
margin-top: 20px;
color: blue;
}
</style>
</head>
<body>
<form id="myForm">
<label for="name">이름:</label>
<input type="text" id="name" placeholder="이름을 입력하세요" required>
<br>
<label for="email">이메일:</label>
<input type="email" id="email" placeholder="이메일을 입력하세요" required>
<br>
<button type="submit">제출</button>
</form>
<div id="output"></div>
<script>
const form = document.getElementById("myForm");
const output = document.getElementById("output");
// submit 이벤트 핸들러
form.addEventListener("submit", function(event) {
event.preventDefault(); // 기본 제출 동작 방지
const name = document.getElementById("name").value;
const email = document.getElementById("email").value;
output.textContent = `이름: ${name}, 이메일: ${email}이(가) 제출되었습니다.`;
});
// change 이벤트 핸들러
const nameInput = document.getElementById("name");
nameInput.addEventListener("change", function() {
output.textContent += ` 이름이 변경되었습니다: ${nameInput.value}`;
});
// input 이벤트 핸들러
nameInput.addEventListener("input", function() {
console.log(`현재 이름 입력: ${nameInput.value}`);
});
</script>
</body>
</html>
// ex1) 클릭했을 때 경고창 뜨기
const eventTarget = document.querySelector("button");
eventTarget.addEventListener("click", function () {
alert("click");
});
// ex2) 클릭했을 때 h1 색상 바꾸기
const eventTarget = document.querySelector("button");
eventTarget.addEventListener("click", function () {
const h1El = document.querySelector("h1");
h1El.style.color = "red";
});
오늘은 배운 내용을 정리하는데만 한참이 걸릴 정도로 배운 것이 많다.
정확히 말하면 자잘하게 배운 내용이 많다.
그 예시를 강사님께서 보여주시는데 화면 전환이 너무 빨라 정신이 없기도 했고,
작성하시는 위치가 계속 바뀌고 이것도 지우고 이것도 추가하고 뭐가 뭔지 하나도 ..
그래서 연습문제를 푸는 시간에 딱 한 문제 풀었다 ....
그것도 앞에 내용 찾아가면서...
근데 용어와 내용이 이해가 안되는건 나 뿐인 것 같았다.
보통 같았으면 조금 뒤에 충분히 이해가 돼서 문제풀이 추가 설명 시간에 들었을텐데
오늘은 개념 자체가 이해가 안되니까 그 설명도 안 들으러가고 혼자 배운 내용을 정리했다.
정리하고나니 확실히 이해는 어느 정도 된 것 같다.
이제는 문제 풀이에 적용을 해봐야하는데.. 막상하려니 걱정이 앞선다.
일단은 오늘 남은 시간은 주말 과제나 다른 건 생각말고 아까 못 푼 연습문제부터 풀어야겠다.
힘드니까 팀 단톡방에서 유머감각이 살아난다. 미쳐가는거지 ㅋㅋㅋㅋ
물론 그 힘듦이 정도를 넘어섰을 땐 카톡이고 뭐고 눈에서 레이저 나올 듯 강의 화면을 봐도
이해는 안 되고 몸은 점점 고되고 으으으... 일단 오늘 하루 마무리부터 잘 해보자!!