
이러한 내장 객체가 중요한 이유는 프로그래밍을 하는데 기본적으로 필요한 도구들이기 때문이다.
예 : Object, Function, Array, String, Boolean, Number, Math, Date, RegExp
1. Date
① Date() : 함수로 호출할 경우 newDate() 와 동일하게 현재 날짜와 시간을 나타내는 문자열을 반환한다.
② new Date() : 생성자로 호출할 경우 새로운 Date 객체를 반환한다.
<script>
var date = new Date();
date.getFullYear(); // 현지 시간 기준 연도(네 자리 연도면 네자리 반환)
date.getDate(); // 현지 시간 기준 일(1~31으로 반환)
date.getDay(); // 현지 시간 기준 요일(0~6으로 반환)
date.getTime(); // 1970.01.01 0:0:0 UTC로부터의 경과시간을 밀리초 단위로 반환
date.getHours(); // 현지 시간 기준 시(0~23)
date.getMinutes(); // 현지 시간 기준 분(0~59)
date.getSeconds(); // 현지 시간 기준 초(0~59)
</script>
③ Date.now() : 1970년 1월 1일 00:00:00 UTC로부터 지난 시간을 밀리초 단위의 숫자 값으로 반환한다.
2. Math
Math 함수 정확도는 구현에 따라 다를 수 있기 때문이다.)<script>
Math.PI(); // 파이값. 약 3.14
Math.E(); // 오일러의 상수이며 자연로그의 밑. 약 2.718
Math.min(); // 가장 작은 값
Math.max(); // 가장 큰 값
Math.random(); // 0~1 사이의 난수를 반환
Math.round(); // 반올림해서 정수 반환
Math.floor(); // 버림해서 정수 반환
Math.ceil(); // 올림해서 정수 반환
</script>DOM이란?
: DOM은 HTML 문서의 계층적 구조와 정보를 표현하면 이를 제어할 수 있는 API, 즉 프로퍼티와 메서드를 제공하는 트리 자료구조이다.
: DOM은 문서의 구조화된 표현을 제공하며 프로그래밍 언어가 DOM 구조에 접근할 수 있는 방법을 제공하여 그들이 문서 구조, 스타일, 내용 등을 변경할 수 있게 돕는다.💡 " 웹 페이지를 스크립트 또는 프로그래밍 언어들에서 사용될 수 있게 연결시켜주는 역할을 담당한다! "
1. 요소 선택
1)document.getElementById
2)document.getElementsByClassName
3)document.getElementsByTagName
getElementsByTagName 메서드가 반환하는 DOM 컬렉션 객체인 HTMLCollection 객체는 유사 배열 객체이면서 이터러블이다.🤷🏻♀️ 이터러블이란?
: 반복 가능한 객체는 배열을 일반화한 객체이며, 메서드Symbol.iterator가 구현된 객체이다.
- 이터러블은
for...of문으로 순회할 수 있으며, 스프레드문법, 배열 디스트럭처링의 대상으로 사용 가능하다..- 예:
String,Array,TypedArray,Map,Set
🤷🏻♀️ 유사 배열이란?
: 인덱스와length프로퍼티가 있어서 배열처럼 보이는 객체이다.
4)document.getElementsByName
name 속성값을 가진 요소의 Nodelist 컬렉션을 반환한다.5) CSS 선택자를 이용한 요소 노드 취득
5-1)document.querySelector
5-2)document.querySelectorAll
2. 요소 다루기
1) document.createElement(html요소)
2) document.write()
document.write() 메소드는 대부분 테스트나 디버깅을 위해 사용된다.<script>
document.write("hello"); // hello
document.write(3); // 3
</script> 참고3) .appendChild()
① append() : 선택된 요소의 맨 뒤의 자식 요소로 추가한다.
② prepend() : 선택된 요소의 맨 앞쪽의 자식 요소로 추가한다.
③ before() : 선택된 요소의 바로 앞의 형제 요소로 추가한다.
④ after() : 선택된 요소릐 바로 뒤의 형제 요소로 추가한다.
🤷🏻♀️
append&appendChild
append: 노드 객체 뿐만 아니라 문자열 또한 추가할 수 있으며, 한 번에 2개 이상의 자식 노드를 추가할 수 있고 return 값은 반환하지 않는다.<script> const parent = document.createElement("div"); const child = document.createElement("p"); child.append("text1", "text2"); parent.append(child); console.log(parent); // <div><p>"text1""text2"</p></div> </script>
appendChild: 노드 객체만 추가할 수 있고(문자열 추가시 에러 발생), 한 번에 2개 이상의 요소를 추가할 수 없으며 return 값을 반환한다.<script> const parent = document.createElement("div"); const child = document.createElement("p"); child.appendChild("text1"); // Error : 텍스트 추가 불가능 child.innerText = "text1"; parent.appendChild(child) // <p>text1</p> </script>
append appendChild 노드 객체 O O 문자열 O X 반환값 X O 다중 값 허용 O X
4) .removeChild()
remove() : 선택된 요소가 삭제된다.5) .innerText, .innerHTML, .textContent
① .innerText
HTML 또는 XML 마크업을 가져오거나 태그와 함께 입력하여 내용을 직접 설정할 수 있다.② .innerHTML
text 값들을 가져오거나 설정할 수 있다.③ .textContent
innerText와 달리 <script> <style> 태그에 상관없이 해당 노드가 가지고 있는 텍스트 값을 모두 읽어온다.<html>
<div id="content">
hello~
<span style="display: none">innerText X</span>
</div>
</html>
<script>
const content = document.getElementById("content");
// 1. innerHTML
console.log(content.innerHTML);
// hello~
// <span style="display: none">innerText X</span>
// 2. innerText
console.log(content.innerText);
// hello~
// 숨겨진 텍스트는 사용자에게 보여지지 않기 때문에 <span> 태그는 가져오지 않음
// 3. textContent
console.log(content.textContent);
// hello~
// innerText X
// 숨겨진 텍스트까지 포함해서 모든 텍스트를 다 가져옴
</script>
6) .className
7) classList.~
① .classList.add() : 지정한 클래스 값을 추가한다.
② .classList.remove() : 지정한 클래스 값을 제거한다.
③ .classList.contains() : 지정한 클래스 값이 엘리먼트의 class 속성에 존재하는지 확인한다.
④ .classList.toggle() : 클래스 값을 토글링한다. -> 클래스가 존재하면 제거하고 존재하지 않다면 추가한다.
8) .setAttribute("속성명", "지정할 속성")
<html>
<button>hello</button>
</html>
<script>
const button = document.qureySelector("button")
button.serAttrubut("name", "helloButton");
// <button name="helloButton">hello</button>
</script>
addEventListener<script>
addEventListener(type, listener);
addEventListener(type, listener, options);
</script>
listener: 이벤트를 수신할 객체이다.handleEvent()메서드를 포함하는 객체 또는 JavaScript 함수여야 한다.
options: 이벤트 수신기의 특징을 지정할 수 있는 객체이다.
〉 이벤트의 종류
1) UI 이벤트 : 사용자가 웹페이지가 아닌 브라우저의 UI와 상호작용할 때 발생한다.
load : 웹페이지의 로드가 완료되었을 때unload : 웹페이지가 언로드 될 때(새로운 페이지를 요청한 경우)error : 브라우저가 자바스크립트 오류를 만났거나 요청한 자원이 없는 경우resize : 브라우저의 창 크기를 조정했을 때scroll : 사용자가 페이지를 위아래로 스크롤 할 때2) 키보드 이벤트 : 사용자가 키보드를 이용할 때 발생한다.
keydown : 사용자가 키를 처음 눌렀을 때keyup : 키를 땔 때keypress : 사용자가 눌렀던 키의 문자가 입력되었을 때3) 마우스 이벤트 : 사용자가 마우스나 터치화면을 사용할 때 발생한다.
click : 사용자가 동일한 요소 위에서 마우스 버튼을 눌렀다 땔 때dbclick : 두번 눌렀다가 땔 때mousedown : 마우스를 누르고 있을 때mouseup : 눌렀던 마우스 버튼을 땔 때mousemove : 마우스를 움직였을 때mouseover : 요소 위로 마우스를 움직였을 때mouseout : 요소 바깥으로 마우스를 움직였을 때4) 포커스 이벤트
focus : 요소가 포커스를 얻었을 때blur : 요소가 포커스를 잃었을 때참고: 포스코x코딩온 강의 자료(10_03_js_04_DOM.pdf)
참고 : ⌜모던 자바스크립트 Deep Dive⌟, 이웅모, 위키북스.
getElementByID vs querySelector-> getElementByID와 querySelector이 어떤 점에서 차이가 있는지 궁금하여 찾아보고자 한다.
〉 예
<script>
<form id="productForm">
<input id="productOne" class="product" type="text" value="Product 1" />
<input id="productTwo" class="product" type="text" value="Product 2" />
<input id="productThree" class="product" type="text" value="Product 3" />
</form>
</script>
① getElementByID, querySelector를 사용하여 #productOne 요소 를,
② getElementsByClassName, querySelectorAll를 사용하여 모든 .product 요소들 을 선택해고자 한다.
1) getElementByID, getElementsByClassName : id를 통해 요소 반환. 없다면 null 반환
<script>
// getElementByID
var productOne = document.getElementById("productOne");
// getElementsByClassName : HTMLCollection에 리턴된다.
var products = document.getElementsByClassName("product");
</script>
2) querySelector, querySelectorAll : css선택자를 통해 요소 반환. 없다면 null 반환
<script>
// querySelector
var productOne = document.querySelector("#productForm #productOne");
// querySelectorAll : Nodelist에 리턴된다.
var products = document.querySelectorAll("#productForm .product");
</script>
대체로
querySelector가getElementByID에 비해 연산이 느리다고 한다.
하지만,querySelector는 다양한 선택자를 사용할 수 있기 때문에(예:id,class,[data-*=""],input[name=""]) 생산성과 편의성이 더 좋다는 장점이 있다.
따라서, 상황에 따라 적절하게 섞어서 사용하면 좋을 것 같다. 더 구체적으로 요소를 선택하고 싶을 때는querySelector와querySelectorAll를 사용해보자!
HTML Collection vs Nodelist① HTMLCollection은 요소 노드(예: <div>, <p>, <span>)만 포함하고 NodeList는 요소 노드, 속성 노드, 텍스트 노드 등을 포함한다.
② HTMLCollection은 자식 요소 노드를 id, name 속성 또는 인덱스로 접근할 수 있으며, NodeList는 인덱스로만 접근할 수 있다.
③ HTMLCollection은 DOM에 추가된 새로운 요소를 가져오지만(동적: 객체가 스스로 실시간 노드 객체의 상태 변경을 반영함), NodeList는 가져오지 못한다(정적).

④ HTMLCollection은 for...of 문으로 각 요소를 순회하며(forEach(): 사용 X), NodeList는 forEach() 메서드로 순회한다.

1) 테이블에 행 추가하기
① insertRow();
HTMLTableElement.insertRow() 메서드를 활용하여 테이블에 행을 직접 삽입할 수 있다.
table 안에 tbody 요소가 여러 개인 경우에는 마지막 tbody 요소에 삽입된다.
+) insertCell() : table row element에 새로운 cell을 추가해준다.

② createElement("tr")
Document.createElement() 메서드는 지정한 tagName의 HTML 요소를 만들어 반환한다.
참고