
NaN : 수학적 or 계산 상황에서 예상치 못한 결과 / 정의되지 않은 결과를 나타냄
다른 변수에 값을 할당하거나 함수 인자를 넘길 때 값을 복사해 전달한다.
메모리 주소의 참조값을 저장한다.



// * document객체
console.log(document); // html 문서 전체
console.log(document.documentElement); // html 문서 내의 모든 element(요소)들을 가져옴
console.log(document.head); // head 태그와 내부 모든 element들
console.log(document.body); // body 태그와 내부 모든 element들
console.log(document.URL); // http, www. ... 전부 포함
console.log(document.domain); // ip주소나 우리가 아는 도메인



console.log(document.getElementsByTagName("div"));





// 해당 요소 내부의 텍스트 변경
div1.innerText =
" 여기는 첫 번째 div 태그이면서 js에서 수정이 있었습니다. ";
// 해당 요소 내부에 태그를 작성해도 태그 적용 안됨
div1.innerText =
"여기는 첫 번째 div 태그이면서 js에서 <strong>수정</strong>이 있었습니다.";
// 해당 요소 내부의 html 변경
div1.innerHTML =
" 여기는 첫 번째 div 태그이면서 innerHTML을 사용해 수정했습니다. ";
// 해당 요소 내부에 태그 작성하면 적용 됨
div1.innerHTML =
"여기는 첫 번째 div 태그이면서 <strong>innerHTML을 사용해 수정</strong>했습니다.";
// div1.innerHTML = "<ul> <li>1</li> <li>2</li> <li>3</li> </ul>"; // 이와같이 ul,li 태그를 사용할 수도 있다.
let naver = document.getElementById("naver");
console.log(naver);

요소 속성 수정
선택한 요소의 속성 값을 직접 지정할 수 있는 메소드이다.
-> 요소.setAttrbute("속성명","속성값");

점 접근법 사용가능하다.
요소.접근할 곳

let flowers = document.querySelectorAll("#flower li");
for (let li of flowers) {
// style 속성 지정
// li.style.backgroundColor = "skyblue";
// li.style.color = "green";
// 클래스 추가
li.classList.add("changeStyle"); // html css에 있던 changeStyle 클래스를 추가함.
}
html 코드
.changeStyle {
background-color: greenyellow;
color: blue;
}
-> 주석처럼 하나하나 적용할 수도 있지만, 보통 html 코드에 css를 추가하고 클래스 추가하여 적용하는게 보편적이다.
html
<!-- 요소 스타일링, for of문으로 순회, classList, 부모 형제 요소 접근 -->
<ul id="flower">
<li class="pink">벚꽃</li>
<li>진달래</li>
<li>개나리</li>
<li>장미</li>
</ul>
js
const parentEl = document.querySelector("#flower"); // ul
const childEl = document.querySelector("#flower .pink"); // ul > li.pink
// 자식 노드 접근하기
console.log(parentEl.children); // ul의 자식 li들 유사배열로 불러옴
console.log(parentEl.children[2]); // 개나리
// 자식 요소에 접근하려면 배열 접근 방식을 따름
// 자식이 하나여도 동일
// 부모 노드 접근하기
// 요소 자체에 접근
console.log(childEl.parentNode); // childEl의 부모를 선택
// 형제 노드 접근
// 위 노드 접근
console.log(childEl.previousElementSibling); // 앞 형제 요소가 없기 때문에 null
console.log(childEl.parentNode.children[2].previousElementSibling); // 진달래
// 아래 노드 접근
console.log(childEl.nextElementSibling); // 진달래
html
<!-- 요소 생성, 추가, 삭제 -->
<div class="container"></div>
js
const pEl2 = document.createElement("p"); // p태그 생성
pEl2.innerHTML = "새로 만들어진 두 번째 p태그";
// 여러 자식요소 한 번에 삽입가능
container.append(pEl, pEl2);
// createElement를 사용해 만든 요소는 여러번 삽입해도 한번만 들어감
container.append(pEl, pEl2, pEl2, pEl2);

부모.append(자식요소) : 해당 요소를 부모요소의 마지막 자식으로 추가
-> 여러개 요소를 한번에 추가 할 수 있다. (단, 여러번 삽입해도 한번만 들어감)
-> 텍스트 추가 가능하다.
부모.appendChild(요소) : 해당요소를 부모요소의 마지막 자식으로 추가
-> 한 번에 하나의 요소만 추가 가능하다.
-> 텍스트 추가 불가능하다.
// 선택된 요소의 자식요소로 매개변수 요소가 추가되는데, 가장 뒤에 자식요소로 추가됨
// 한번에 하나의 요소만 추가할 수 있음
const p2 = document.createElement("p");
p2.innerText = "appendChild 사용해서 추가할 첫 번째 p태그";
const p3 = document.createElement("p");
p3.innerText = "appendChild 사용해서 추가할 두 번째 p태그";
const p4 = document.createElement("p");
p4.innerText = "appendChild 사용해서 추가할 세 번째 p태그";
container.appendChild(p2);
container.appendChild(p3, p4); // p4는 추가되지 않음 (한번에 하나의 요소만 추가가능)
container.appendChild(p4); // p4는 추가되지 않음 (한번에 하나의 요소만 추가가능)
container.append(p2, p3, p4);
// container.appendChild("과연 될까요?"); // 텍스트 추가 안됨.
const div2 = document.createElement("div");
div2.classList.add("prepend");
div2.innerText = "prepend로 추가된 첫 번째 요소";
container.prepend(div2);
// ? 화면에는 div2 태그만 나타나는데, 개발자 도구를 보면 div3도 추가 되어 있다.
// -> 화면에 표시되는 순서는 DOM 계층 구조에서의 위치에 따라 달라진다.
// div2가 먼저 추가되었다면 렌더링 결과에서는 div3 위에 표시됩니다
const div3 = document.createElement("div");
div3.classList.add("prepend");
div3.innerText = "prepend로 추가된 두 번째 요소";
container.prepend(div3);

요소.before(추가할 요소) : 선택된 요소의 앞에 추가할 요소 추가
-> prepend랑 유사한데, 다른점은 선택된 요소의 형제 인자로 전달한 요소를 추가한다는 것이다.
요소.after(추가할 요소) : 선택된 요소의 뒤에 추가할 요소 추가
-> append랑 유사한데, 역시 이도 선택요소의 형제 인자로 전달한 요소를 추가한다.
: 포커스가 갔을 때
: 포커스가 벗어나는 순간
: 웹 페이지에 필요한 모든 파일 (html,css,js 등)의 다운로드가 완료 됐을 때
: 브라우저의 창 크기가 변경될 때
: 링크를 타고 이동하거나, 브라우저를 닫을 때
: 폼 필드의 상태가 변경되었을 때
: 스크롤이 발생할 때

url의 ?이후에 나오는 문자열을 말한다.
예를들어, https://velog.io/write?id=74abb157-c530-486a-9651-791b476c9c0b&Page=1&groupId=dfke123 에서 ?이후의 'id=74abb157-c530-486a-9651-791b476c9c0b&Page=1&groupId=dfke123 '이다.
다양한 쿼리스트링을 사용하는 경우 &로 이어준다.
window.location.search : 윈도우의 쿼리스트링만 뽑아준다.

URLSearchParams : 많은 쿼리스트링을 쉽게 추출할 수 있도록 도와준다.

const urlParam = new URLSearchParams(window.location.search);
const productId = urlParam.get("id"); // 쿼리스트링 중 id 키의 값을 뽑아줌
console.log(productId);