
웹 페이지 자체를 의미하는 객체
웹 페이에 존재하는 HTML 요소에 접근할 때는 반드시 document 객체로부터 시작
// 1개라도 배열로 잡음
const h1 = document.getElementsByTagName('h1')
console.log(h1)
// 클래스 네임은 당근 여러개 잡으니깐 배열로 잡음
const h2 = document.getElementsByClassName('h2')
console.log(h2)
// 이러면 모든 li의 모든 태그를 잡고
const tagName = document.getElementsByTagName('li');
console.log(tagName)
//태그이름의 갯수만큼 반복하면 모든 태그를 출력할 수 있다!
for (let i = 0; i < tagName.length; i++) {
console.log(tagName[i])
}
console.log("------------")
//js라는 클래스는 2개
const className = document.getElementsByClassName('js')
console.log(className)
//for in 문으로 배열의 갯수 만큼 반복시킨다.(i는 index)
for (const i in className) {
console.log(className[i])
}
console.log("------------")
//이 친구만 1개 잡네?
const id = document.getElementById('server');
console.log(id)
console.log("------------")
//view라는 태그의 이름을 가진 놈을 다 잡는다.
const name = document.getElementsByName("view");
//for of문으로 배열의 값들을 출력한다. 그 값은 태그임
for (const e of name) {
console.log(e)
//값을 가져와 style에 접근하고 style의 border에 접근해서 값을 대입한다.
e.style.border = "3px dotted blue";
}
console.log("------------")
//css스타일 선택자형식으로 접근가능하고 li.js의 태그들을 가져온다.
const querySelector = document.querySelectorAll('li.js');
//console.log(querySelector)
//마찬가지로 배열의 값을 가져온다.
for (const e of querySelector) {
console.log(e)
//배열의 값을 가져와서 innerHTML에 접근한다음 값을 넣는다.
e.innerHTML = e.innerHTML + "입니다."
}
HTML DOM은 노드라고 불리는 계층적 단위에 정보를 저장
노드 트리는 노드들의 집합이며 노드간의 관계를 보여줌
const gnb = document.getElementById('gnb')
//gnb 밑으로 다모여
console.log(gnb)
//gnb 니 부모는 누고? div인데예?
console.log(gnb.parentNode)
//gnb 니 밑으로 좌우로 정렬, 모보던 놈도 껴있네?, 넌 요소가 아니잖아!
//childNodes : 비요소 노드들도 포함
console.log(gnb.childNodes)
//ul 뒤에 숨어 있던 놈도 알 수 있다.
console.log(gnb.childNodes[1].childNodes[1])
//gnb 니 밑에 요소 데려와
//children : 요소노드들만 담겨있져
console.log(gnb.children)
//하지만 아래처럼 접근하면 비요소 노드도 꺼낼 수 있지!
console.log(gnb.children[0]) // ul 요소
//console.log(gnb.children[0].nextSibling) // 비요소 노드 포함
console.log(gnb.children[0].nextElementSibling) // 다음 요소 노드
//ul뒤에 숨어있던 녀석 나와라!
console.log(gnb.children[0].children[1].nextElementSibling)
console.log(gnb.children[0].firstChild) //text 노드
console.log(gnb.children[0].firstElementChild) //첫번째 요소노드
<body>
<h2>노드추가</h2>
<p id="item1">Javascript</p>
<p id="item2">TypeScript</p>
<hr>
<div id="list">
<p id="backend">node.js</p>
<p>HTML</p>
<p>CSS</p>
</div>
<p id="text">지금 시간은 오후 4시 7분입니다.</p>
<hr>
<button onclick="appendNode()">노드추가1</button>
<button onclick="insertNode()">노드추가2</button>
<button onclick="appendText()">텍스트추가</button>
</body>
const appendNode = function() {
//list 태그를 가져오고, 이 태그도 아래 자식들이 있다.
const parent = document.getElementById('list')
console.log(parent)
//item1 Id 명을 가진 태그도 가져와서
const newItem = document.getElementById('item1')
//list태그에 맨 아래에 newItem을 붙인다.
parent.appendChild(newItem)
}
//insertNode 명을 가진 함수를 만든다.
const insertNode = function () {
//list 태그를 가져오고, 이 태그도 아래 자식들이 있다.
const parent = document.getElementById('list')
//p태그를 가져온다. list의 자식노드
const backend = document.getElementById('backend')
//item1 Id 명을 가진 태그도 가져와서
const newItem = document.getElementById('item2')
//item2이라는 노드를 list의 자식노드의 앞에다가 붙인다.
parent.insertBefore(newItem, backend)
}
//appendText라는 함수를 만든다.
const appendText = function(){
//text라는 id를 가진 태그의 첫번째 자식노드(text를 의미함)
const text = document.getElementById('text').firstChild;
console.log(text)
//text에다가 첫번째 매개변수는 넣고자하는 위치 2번째 매개변수는 들어가고자 하는 값을 말함
text.insertData(0, " 집에 가고싶은 ")
}
<body>
<h2>노드의 생성 </h2>
<p id="el">새로운 문장이 이 문장 앞에 추가됨</p>
<p id="attr">이 단락에 새로운 속성이 생성됨</p>
<p id="text"></p>
<button onclick="createNode()">요소노드생성</button>
<button onclick="createAttr()">속성노드생성</button>
<button onclick="createText()">텍스트노드생성</button>
</body>
const createNode = function(){
//id가 el인 놈을 선택
const elNode = document.getElementById('el');
//새롭게 만들 엘리먼트 이름을 설정함
const newNode = document.createElement('p');
//새롭게 만들 엘리먼트의 innerHTML 을 만듦
newNode.innerHTML = '<b>✈</b><input></input>';
//body태그에 insertBefore로 새로만들 태그를 el 앞에다가 만든다.
document.body.insertBefore(newNode,elNode);
}
const createAttr = function(){
//attr라는 id를 가진 놈을 선택
const attr = document.getElementById('attr')
//속성을 만드는데 속성 이름을 style로 만들어 style 속성을 만든다.
//그렇담 name이나 class 속성도 가능할까? 당근 가능하다.
const nameAttr = document.createAttribute('name')
nameAttr.value = "attr;"
attr.setAttributeNode(nameAttr)
const newAttr = document.createAttribute('style');
//스타일 내용을 직접적어줘야하는 귀찮음... 어디 뭐 편한 기능없나? 후..
newAttr.value = "color:#fff; background-color:black;"
//attr 엘리먼트 속성에 newAttr value를 때려 박는다.
attr.setAttributeNode(newAttr)
}
const createText = function(){
//text id를 선택함
const textNode= document.getElementById('text');
//간단하게 Text만 추가할 때 편하겠다!
const newText = document.createTextNode('🎄🎋🎉🎈🎀🎁');
textNode.appendChild(newText);
}
removeChild()
removeAttribute()
<body>
<h2>노드 제거</h2>
<div id="list">
<p>HTML</p>
<p id="item">CSS</p>
<p id="js" style=" width : 100px; background-color: rgb(245, 214, 37); color: white; text-align: center;">Javascript</p>
<p>Typescript</p>
</div>
<button onclick="removeNode()">요소노드삭제</button>
<button onclick="removeAttr()">속성노드삭제</button>
</body>
//removeNode 라는 이름의 함수를 만든다.
const removeNode = function(){
// 우리는 부모요소를 선택하고 자식노드 통채로 삭제할 것이다.
const parent = document.getElementById("list") // 얘는 부모요소
const removeItem = document.getElementById("item") // 얘는 자식 요소
//부모요소의 자식 요소를 삭제한다. 가슴이 아픔...
const result = parent.removeChild(removeItem)
//제거된 노드의 마지막을 보고싶다..
console.dir(result)
}
//removeAttr라는 함수를 만든다.
const removeAttr = function(){
// 속성이 잔뜩 들어있는 요소를 선택하고 이 요소 속성을 없앤다.
const js = document.getElementById('js')
//bye bye style..
js.removeAttribute("style")
}
<body>
<h2>노드복제</h2>
<div id="item">
<h3>복제된 아이템</h3>
</div>
<div id="list">
<p>HTML</p>
<p>CSS</p>
<p>Javascript</p>
<p>Typescript</p>
</div>
<button onclick="cloneElementTrue()">노드복제 true</button>
<button onclick="cloneElementFalse()">노드복제 false</button>
</body>
//clone True를 인자로 넘겨주어 복제할 자식까지 모두 가져온다.
const cloneElementTrue = function(){
//복제해서 붙일 부모요소
const parent = document.getElementById("list")
//복제할 요소
const orginItem = document.getElementById("item")
//자식요소까지 모두 복제함
const cloneItem = orginItem.cloneNode(true);
//붙일 요소의 자식요소로 복제된 요소를 붙인다.
parent.appendChild(cloneItem)
}
//false로 복제하면 자식요소를 제외하고 가져온다. 가져오는 대상에 스타일을 설정해서 보기쉽게 했다
const cloneElementFalse = function(){
const parent = document.getElementById("list")
const orginItem = document.getElementById("item")
const cloneItem = orginItem.cloneNode(false);
parent.appendChild(cloneItem)
}
<form id="regForm" name="myForm">
<input type="text" name="userid" id = "id">
</form>
<body>
<h2>폼 객체</h2>
<!-- 폼 객체에는 name으로 접근이 가능하다. -->
<form name="frm1">
<input type="search" name="search" placeholder="검색어를 입력하세요" ><br>
<input type="submit" value="확인">
</form>
<hr>
<form name="frm2">
<input type="text" name="userid" id="id" placeholder="아이디를 입력하세요"><br>
<input type="password" name="userpw" id="pw" placeholder="비밀번호를 입력하세요"><br>
<input type="submit" value="확인">
</form>
</body>
// document에 폼 객체 이름으로 접근한다.
//frm1에 접근한거임
const frm1 = document.frm1;
console.log(frm1)
// frm2에 접근한거임
const frm2 = document.frm2;
//frm1의 하위객체로 또 다른 name에 접근가능하다.
console.log(frm1.search.placeholder)
//이렇게 직접 바꿀 수도 있다.
frm1.search.placeholder = "바꿔주삼"
console.log(frm1.search.placeholder)
//마찬가지로 해당 value를 직접 바꿀수 있다.
frm2.userid.value = "apple"
//document.forms : 문서에 있는 form들을 다 가진 배열
//document.forms[1] : 문서에 있는 form들 중 두번째 form
//document.forms[1][1] : 문서에 있는 form들 중 두번째 form안의 두번째 input
//forms는 document에 생성된 form들을 말한다. forms[1]은 frm2임.
//frm2를 보면 두번째 요소가 input으로 [1][1]로 접근하면 input태그 - 비밀번호에 접근 가능하다!
console.log(document.forms[1][1].placeholder)
//객체로 접근하는 방법으로 키값을 직접 쓰는 것임. 아래처럼 쓸수도 있다. 대신 key값은 문자열로 작성해야함
console.log(document.forms['frm2'].elements['userid'])
//form으로 접근안해도 객체형태로 id에 접근가능
console.log(document.getElementById('id').value)