본문 바로가기
카테고리 없음

자바 스크립트 ⑥ 노드 추가, 삭제, 최상위 객체 Window, Data 객체, Math 객체

by hey-min-eee 2024. 10. 19.

1. DOM 트리와 노드/노드 리스트

- DOM에는 단순히 태그에 해당하는 요소 노드 뿐만 아니라 여러 종류의 노드가 있음

> 노드를 구성하는 원칙

- 모든 HTML 태그는 요소 노드가 됨

- HTML 태그에서 사용하는 텍스트 내용은 자식 노드인 텍스트 노드가 됨

- HTML 태그에 있는 속성은 모두 자식 노드인 속성 노드가 됨

- 주석들은 주석 노드가 됨

> 노드 리스트

- querySelectorAll() 메소드를 사용하면 여러 개의 노드를 한꺼번에 가져올 수 있음

- 노드 리스트 : 가져온 여러개의 노드 정보를 저장한 것

- 노드 리스트는 배열과 비슷하게 생겼고 배열은 아니지만 배열처럼 사용할 수 있음

- Q : p 요소 노드들을 저장한 노드 리스트 중에서 두 번째 노드를 가져오려면? A : document.querySelectorAll("p")[1]

2. 새로운 노드 추가하기

(1) 웹 문서에 새로운 노드 추가 > 텍스트 내용과 속성 추가 > 자식 노드 연결

- Q : 웹 문서에서 처음에는 화면에 보이지 않다가 이벤트가 발생했을 때 화면에 특정한 내용이 표시되도록 하려면 어떻게 해야 할까요?

- A : 특정 이벤트가 발생했을 때 DOM 트리거에 새로운 노드를 추가함

ⓐ 새롭게 추가할 노드에 텍스트 내용만 있는 경우

- 텍스트 노드를 만들고(텍스트 내용이 있는 노드)

- 요소 노드를 만들어서(예 <p>)

- 텍스트 노드를 요소 노드에 연결한 후(<p> 텍스트 내용 </p>)

- 원하는 영역에 추가(head, title 등 원하는 위치에 추가)

<body>
 <h1> 노드 리스트 살펴보기 </h1>
 <p>HTML</p>
 <p>CSS</p>
 <p>JavaScript</p>
 <p>텍스트 노드 추가</p>
</body>

- createElement() : DOM에 새로운 요소를 추가할 때 가장 먼저 요소 노드를 만들어야 함

- 콘솔창에 입력하기 :

노드 정의 : let newP = document.createElement("p") > 노드 정의한 것뿐, 내용과 속성이 없고 연결이 안됨
노드에 내용과 속성 저장 : let testNode = document.createTextNode("Typescript")
 > 새로운 p의 요소에 들어갈 내용을 텍스트 노드로 만들고 textNode라는 변수에 저장
 > 속성과 내용은 넣었지만, 연결이 아직 안됨
바디에 들어가게 연결하기 : newP.appendChild(textNode) / document.body.appendChild(newP)
> 부모 노드와 자식 노드로 연결해줌

(2) 속성 값이 있는 노드 추가하기

- HTML 태그에서는 여러 가지 속성을 사용해서 웹 요소를 제어함

- 속성이 필요한 요소를 추가할 때는 속성 노드도 함께 만들어서 자식 노드로 연결해야 함

- 예를 들어 이미지 표현 시 src 속성은 Source의 의미로 이미지가 저장된 위치를 저장함, 이 또한 이미지 노드의 속성임

- (1)의 예시에서 이미지를 추가한다고 가정

노드 정의 : let newImg = document.createElement("img")
속성 혹은 텍스트 정의 : let srcNode = document.createAttribute("src")
속성에 내용 삽입 : srcNode.value = "C:\Users\유혜민\OneDrive\사진\KakaoTalk_20221126_103747305"
속성 노드 연결하기 : newImg.setAttributeNode(srcNode)
부모 노드와 자식 노드로 연결 : document.body.appendChild(newImg)

(3) 기존 노드 앞에 추가하기

- 지금까지 살펴본 방법은 새로 만든 요소를 부모 노드의 맨 마지막에 자식 노드를 추가하는 것

- insertBefore()를 사용하면 특정 노드 앞에 새 요소를 추가할 수 있음

- (1)과 (2) 사이에 노드를 추가해보자

요소 정의 : let tsNode = document.createElement("p")
테스트 내용 : let tsTestNode = document.createTextNode("두번째 만들기")
테스트 연결 : tsNode.appendChild(tsTestNode)
기존 노드 앞에 연결 : let basisNode = document.querySelectorAll("img")[0] // 첫번째 p 요소를 기준으로 정하기
document.body.insertBefore(tsNode, basisNode)

3. 노드 삭제하기

(1) 노드 삭제하기

- remove()는 삭제하려는 요소에서 사용하는 메서드

- 2(3)의 p값을 없애보자

위치 지정하기 : heading = document.querySelectorAll("p")[1]
삭제 : heading.remove()

- removeChild() 자식 노드를 삭제하는 메서드

- 이 메서드를 사용하려면 우선 부모 노드를 찾아야하고, 그 후에 자식 노드를 삭제해야 함

- IE : removeChild() 메서드만 사용할 수 있어서, 주로 removeChild()를 사용함

- 모던 브라우저(크롬) : remove() 메서드를 사용해도 됨

(2) 이벤트 리스너에서 함수 안에 있는 this, 삭제 버튼 클릭해서 삭제하기

- 이벤트 리스너에서 function() {...}에 this를 사용하면, this는 이벤트가 발생한 노드를 가르킴

- 첫 번째 항목을 클릭했다면, 첫번째 li 요소가 this가 됨

- 이벤트 리스너에서 화살표 함수를 사용할 경우, this는 최상위 객체 window를 가르킴

- 화살표 함수를 사용할 경우 클릭한 요소를 찾을 때 this를 사용할 수 없음

- 이벤트가 발생한 요소를 this로 사용하려면 function () {...}를 사용해야 함

item.addEventListener("click", function() {
  this.parentNode.removeChild(this);
});

4. 최상위 객체 Window

(1) 내장 객체란?

- 사용자가 가져다 쓸수 있도록 미리 만들어진 객체

- 웹 브라우저에 웹 문서가 열리면 가장 먼저 window 객체가 만들어지고 하위에 웹 브라우저 요소에 해당하는 객체들이 만들어짐

- window 객체를 비롯해 하위에 연결된 객체들은 모두 HTML 웹 API에 만들어진 객체들

(2) Window 객체

- 웹 브라우저 창의 상태를 제어하는 객체

- 가장 최상위, 기본의 객체

- 웹 브라우저 창과 관련된 여러 속성이 있음

- window 객체의 속성과 메서드에 접근하는 마침표(.)를 사용함

(3) Window 객체의 주요 메서드

- document, frameElement, innerHeight, localStorage, location, name, outerHeight, pageXOffset, parent, screenX, scrollX, sessionStorage

- 대화창을 표시하거나 브라우저 창의 크기나 위치를 알아내고 지정하는 등 웹 브라우저 창 자체와 관련된 것이 대부분

- alert(), prompt() 함수도 window 함수에 해당

- 객체의 함수 표기법에 따르면 window.alert()으로 표기해야 하지만, window. 생략 가능

- alert(), blur(), close(), comfirm(), focus(), moveBy(), open(), postMessage(), print(), prompt(), resizeBy(), scroll(), setCursor(), showModalDialog(), stop() .... 

(4) 팝업 창을 여는 open() 함수

- open(경로, 창 이름, 창 옵션) 함수를 사용하면 현재 창이나 새 탭, 새로운 알림 창 등 다양한 형태로 새 창을 열 수 있음

- 창 이름을 지정하지 않으면, 팝업 창이 계속 새로 나타남

- 위치를 지정하지 않으면 화면의 맨 왼쪽 위에 나타남

open("notice.html", "", "width=600, height=500")
// 버튼을 클릭했을 때 팝업이 열리게 만들기
function openPopup() {
  window.open( "notice.html", "", "width=600 height=500 left=300 top=200") }
const bttn = document.querySelector("button");
bttn.onclick = openPopup;

(5) 브라우저 창을 닫는 close() 함수

<button onclick = "close()" >닫기</button>

(6) screen 객체

- 사용자의 화면 크기나 방향 등의 정보를 담고 있는 객체

- availHeight, colorDepth, orientation, pixelDepth, Width, Height, lockOrientation ...

(7) 팝업창, 화면 가운데 표시하기

- 팝업창의 기본 위치는 화면의 왼쪽 위, 가운데 배치를 위해서는 위치를 계산해야 함

- Q : 화면의 너미 1000px, 높이 600px, 팝업 창의 너비 500px 높이 400px이라면? 가운데 정렬

- A : open("notice.html", "event", "width=100 height=100 left=100 top=100");

- 듀얼 모니터는 적용 안됨, 1번 모니터에만 가운데로 표시

(8) history 객체

- history 객체에는 브라우저에서 뒤로나 앞으로 또는 주소 표시줄에 입력해서 방문한 사이트 주소가 배열 형태로 저장

- 브라우저 히스토리는 보안 문제 때문에 읽기 전용임

- 프로퍼티 : length, back(), forward(), go() : go(-1)은 이전 페이지, go(2)는 2번 이후 페이지

(9) location 객체

- 현재 문서와 URL 주고와 관련된 정보가 들어있음

- 프로퍼티 : hash, host, hostname, href, pathname, port, protocol, password, search, username

 

5. Data 객체 활용하기

(1) Data 객체,Data 객체의 인스턴스 만들기

- 자바 스크립트에 저의된 내장 객체를 사용할 때, 객체의 프로퍼티와 메서드를 가진 새로운 객체를 만든 후 여기에 식별자를 붙여 프로그래밍에서 사용, Date 객체를 사용하려면 자바 스크립트의 Date 객체를 똑같이 만들어서 사용함

- 인스턴스 객체 : 내장 객체와 똑같은 모양으로 찍어낸 객체

- new Date() / let today = new Date() / today.getDate() / new Date("2025-02-25") / new Date("2025-02-25T 18:00:00")

(2) 자바 스크립트 날짜, 시간 입력 방식, Data 객체의 메서드, 자바 스크립트 시간 단위

- YYYY-MM-DD 형태로 지정

- YYYY-MM-DD THH:MM:SS로 저장

- MM/DD/YYYY로도 사용 가능

- getFullYear(), getTime() : 1970년 1월 1일 0:0:0 이후의 시간, getHour() >> get은 시간 정보를 가져오는 메서드

- setFullYear() .... >> set이 붙으면 시간 정보를 설정하는 메서드

- toGMTString() >> to는 형식을 바꾸는 메서드

6. Math 객체 활용하기

- 삼각 함수나 로그 함수를 비롯한 수학 연산 함수를 가진 내장 객체

- 메서드 : abs, cbrt(세제곱근), ceil, floor, random, round() ...

- 예시 : Math.PI, Math.round(x), (3.141595)toFixed(3) = 소수점 이하 셋째 자리 까지 = 3.142, Math.random() : 0부터 1사이의 값