-
자바스크립트 DOM & EVENT팀플 2022. 5. 16. 21:51
✅ 노드에 접근하기
DOM (Document Object Model)
- html문서의 각 요소를 TREE형식으로 만듦(아래와 같은 계층적 구조를 노드트리라고 부름)
- js를 이용해서 이를 생성,수정,삭제 할 수 있음
- 하나의 객체를 노드라고 부름
- 최상단의 document를 제외하고 맨 위에 있는 노드를 루트노드라고 부름
- 모든 html 코드는 객체
- document.body = body에 접근 가능
# 노드 찾기 el = document.getelementbyid('first'); ----- id는 1개만 쓸 수 있음 > element 단수형 plist = document.getelementsbytagname('p') ----- p태그는 여러번 쓸 수 있음 > elements 복수형 모든 p태그에 접근 * plist > for (p of plist)로 작성 가능 *getelementsby를 이용하면 classname 이나 name으로 노드에 접근할 수 있음 * document.getelementsbyclassname('link'); = document.queryselectorall('.link'); ---------- css문법 / 모든 노드를 가지고 옴 document.queryselector('.link'); ---------- 제일 처음의 노드만 가지고 옴 * document.queryselector('h3:nth-of-type(2)'); ----- 2번째 h3만 찾음 plist = document.queryselector('h3:nth-of-type(2n)'); ----- 짝수번째 p만 찾음
- nodelist는 arrary가 아님 / index를 통해 각 노드에 접근이 가능함
- array가 아니기 때문에 push,pop,filter,join 사용불가능
🆕 노드의 종류
- html 문서의 모든 것은 노드
✅ 부모, 자식, 형제 노드
document.queryselectorall('p') > nodelist(4) > 한번 저장된 값을 계속 사용 document.getelementsbytagname('p') > htmlcollection(4) > 노드의 변경사항이 실시간으로 변경 아닌 경우도 있음
- 부모노드
document.documentelement; --- html document.documentelement.parentnode; --- 부모노드 중 모든 노드 반환 document.documentelement.parentelement --- 부모노드 중 요소노드만 반환
- 자식모드
ul.childnode; nodelist > 공백과 text모두 포함 / 모든 type의 노드 ul.childten; htmlcollection > 요소 type의 노드 / 실시간 반영 동작 ul.firstelementchild; > 첫번째 요소 노드 ul.lastelementchild; > 마지막 요소 노드
- 형제노드
이전 형제 / 다음 형제로 나뉨 previoussibling / nextsibling > 형제 노드 중 모든 type
🆕 노드의 관계
- 노드 트리의 모든 노드는 서로 계층적 관계를 맺고 있음
- 루트노드를 제외한 모든 노드는 단 하나의 부모노드를 가짐
- 모든 요소 노드는 자식노드를 가질 수 있음
- 형제 노드(sibling node)란 같은 부모 노드를 가지는 모든 노드를 말함
✅ 노드 생성, 추가, 복제, 삭제
- 노드 생성/추가
.nodevalue 이용하면 텍스트 변경할 수 있음 > 모든 노드가 가지고 있지만, text노드가 아니면 null을 반환 textcontnent 를 사용하면 text가 아니라도 변경 가능하지만 마크업이 날아감 > innerhtml을 사용하면 마크업을 적용할 수 있음 > 하지만 요소를 추가할 때마다 적어줘야 함 newli = document.createlement('li') --- 새로운 li 만들기 newli; > <li></li>; newli.innerhtml = 'green'; > 'green' newli; > <li>green</li>; ul.appendchild(newli); ----- 만든 newli를 ul로 추가함(자식노드를 만들기 위해 innerhtml이용) # 그래서 아래 사용 # newli2 = document.createlement('li') --- 새로운 li 만들기 newtext = document.createtextnode('pink') --- 새로운 노드 만들기 newli2.appendchild(newtext) --- li에 넣기 ul.appendchild(newli2) appendchild는 항상 지정한 부모노드에 가장 마지막 자식으로 추가 > 원하는 위치에 추가하려면 특정한 노드를 지정한 뒤 그 노드 앞에 추가해야 함 > insertbefore 사용 newli3= document.createlement('li') textnode3 = document.createtextnode('black') newli3.appendchild(textnode3) const red = document.getelementbyid('red'); ul.insertbefore(newli3, red) --- red앞에 li를 넣어라
- 노드 복제
clonenode 이용 newblack = newli3.clonenode(); ul.appendchild(newblack); newblack2 = newli3.clonenode(true); ---- 자식 노드까지 다 복제됨 or ( ) / (false) ---- 자신만 복제
- 노드 삭제
removechild ul.removechild(red); ul.removechild.firstelementchild; ul.removechild.lastelementchild;
✅ CSS style, class 제어
# style box.style.backgroundcolor = "red"; # class box.classname ='bg-blue'; --- background box.classname ='txt-pink'; > bg 사라짐 >> box.classname ='bg-blue txt-pink'; > 둘 다 적용 됨 / 많아지면 번거로움 # 그래서 아래 사용 # # add, remove box.classlist.add('text-white'); box.classlist.remove('text-white'); box.classlist.add('bg-green', 'txt-yellow'); > 여러개 적용 # replace box.classlist.replace('bg-blue', 'bg-red'); # toggle 해당 class를 넣었다 뺐다 setinterval(()=>{ box.classlist.toggle('bg-red') }, 1000)
✅ 이벤트 핸들러(Event Handler)
<button onclick="alert('click')">클릭1</button> <button onclick="sayhello">클릭2</button> <button id="btn">클릭3</button> <button id="btn2">클릭4</button> function sayhello() { alert("hello") } const el = document.getelementbyid("btn"); el.onclick = sayhello; const el2 = document.getelementbyid("btn2"); el.addeventlistener("click",sayhello); --- 특정이벤트가 발생하면 전달된 함수를 실행 el.addeventlistener("click",() => { alert("hi"); } # addeventlistener ----- removeeventlistener 도 있음 html과 구별지을 수 있음 일부 이벤트는 항상 이걸로 처리해야 함 -- domcontentloaded가 되면 발생 document.addeventlistener("domcontentloaded", () => { document.body.style.backgroundcolor = "red"; });
- 자주 사용하는 event
# dbclick -- 더블클릭할 때 const el = document.getelementbyid("btn"); el.addeventlistener("dbclick",sayhello); # keyup -- 글자가 입력하면 콘솔이 찍히게 함 const input = document.getelementbyid("txt"); input.addeventlistener("keyup", (event) => { console.log(event.key); }; # focus -- input창에 focus가 발생할 때 const input = document.getelementbyid("txt"); input.addeventlistener("focus", () => { input.style.backgroundcolor = "rgba(255,0,0,0.2)"; # blur -- focus를 잃을 때 input.addeventlistener("blur", () => { input.style.backgroundcolor = null; # mousemove -- 마우스를 움직일 때 const box = document.getelementbyid("box") const circle = document.getelementbyid("circle") box.addeventlistener("mousemove", event => { circle.style.top = `${event.clientY}px`; --- 원을 만들어서 움직일 때 따라다님 circle.style.left = `${event.clientX}px`; }) # resize -- 창 크기가 바뀔 때, 높이와 너비 변경 window.addeventlistener("resize", () => { document.body.innertext = `현재 창 크기는 ${window.innerwidth} x ${window.innerheight}`; });
✅ 이벤트 버블링, 이벤트 위임
- 하위요소(자식요소)에서 상위요소(부모요소)로 올라감 = 이벤트 버블링
- 버블링 X =focus, blur, mouseenter, mouseleave
- 버블링O => focusin, focusout, mouseover,mouseout
- 인위적으로 막을 수 있음 = stoppropagation
- 이벤트 위임 : 자신에게 발생하는 이벤트를 다른 요소에서 처리 => clickhandler
- even.target : 이벤트를 발생시키는 요소
- event.currenttarget : 이벤트 핸들러가 등록된 요소
참고 영상 : ✅ 자바스크립트 DOM & EVENT
참고 사이트 : 🆕 http://www.tcpschool.com/javascript/js_dom_node
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'팀플' 카테고리의 다른 글
[ What I Learn ] Self-Project (0) 2022.06.26 React JS (0) 2022.05.26 JavaScript 이해하기 (0) 2022.05.09 HTML & CSS ( 4. CSS 이해하기 / 5. 단위, 배경, 박스모델 / 6. 폰트,텍스트 / 7. 레이아웃 / 8. 미디어쿼리) (0) 2022.05.05 HTML & CSS (1. HTML 이해하기 / 2.HTML 태그 / 3. 콘텐츠모델, 시멘틱마크업, 블록) (0) 2022.05.01