일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- global scope
- includes
- JavaScript Runtime
- javascript 기초
- Splice
- node 설치
- version control system
- for of
- HTML 태그 모음
- Jest
- TIL
- for in
- indexof
- supertest
- package.json
- foreach
- nvm 설치
- 코드스테이츠 1일차
- 코딩게임
- 2번째 페어
- Bracket Notation
- npm 설치
- 호이스팅
- dot notation
- immutable
- testbuilder
- 스프린트 리뷰
- 코플릿
- local scope
- 슈도코드
- Today
- Total
Honey-Programming
[TIL-018] 20.08.12 본문
1. Summary(3 Line)
프리코스 13일차(3줄 요약)
- DOM은 너무 어려워
- 날씨도 더운데 컴퓨터 열기 때문에 더위 먹은거 같다..
- Twtittler 함수 작성 시작해야되는데... 손도 못댔다.
2. Today's Todo
- 알고있어야 하는 필수 키워드
childNode / firstChild / lastChild / nextSibling / previousSibling / nodeValue / parentNode - DOM 기본 조작(CRUD)
1. CREATE (createElement, createTextNode, createDocumentFragment)
2. READ (querySelector, querySelectorAll)
3. UPDATE (innerHTML, innerText, textContent)
# innerHTML, innerText, textContent 비교
4. DELETE (remove, removeChild, innerHTML = "";, textContext = "";)
5. APPEND (append, appendChild)
6. 아직 노분류()
# 알고있어야 하는 필수 키워드
-
childNode : 현재 요소의 자식을 배열로 표현한다
-
firstChild : 첫 번째 자식 노드
-
lastChild : 마지막 자식 노드
-
nextSibling : 다음 형제 노드
-
previousSibling : 이전 형제 노드
-
nodeValue : 해당 요소의 값을 얻음
-
parentNode : 해당 요소의 부모 노드
# DOM 기본 조작(CRUD)
1. CREATE : createElement / createTextNode / createDocumentFragment
1) document.createElement(tagName); => HTML 태그의 DOM 객체를 생성할 수 있다.
let newDIV = document.createElement("div");
// 위 코드의 결과는 <div></div>
2) document.createTextNode("텍스트"); => 선택한 요소에 텍스트를 추가한다.
let newtext = document.createTextNode(" 동적으로 추가되는 텍스트. ");
let h = document.createElement("H1") // Create a <h1> element
let t = document.createTextNode("Hello World"); // Create a text node
h.appendChild(t); // Append the text to <h1>
3) document.createDocumentFragment(); => DocumentFragment를 생성하고, 추가한다.
좀더 설명하자면 가짜 document를 만든다고 한다.
왜 이게 중요하냐면 자바스크립트로 document의 태그를 조작하는 것은 매우 성능이 떨어집니다.
특히 여러 태그를 반복문을 통해 동시에 추가 할때입니다.
이럴 때 미리 가짜 document를 만들어서 여기에 추가를 한 후, 한 번에 document에 추가합니다.
이러면 진짜 document는 한 번만 조작하면 돼서 성능에 부담이 덜합니다.
let docFrag = document.createDocumentFragment();
let colors = ['blue', 'red', 'green'];
colors.forEach(function(color) {
let li = document.createElement('li');
li.textContent = color;
docFrag.appendChild(li);
});
console.log(docFrag.textContent); // blueredgreen
let div = document.createElement('div');
let text = document.createTextNode('텍스트');
let fragment = document.createDocumentFragment();
div.appendChild(text); // 1) div에 text를 담고,
fragment.appendChild(div); // 2) 그것을 fragment에 담은 후
document.body.appendChild(fragment);// 3) 최종적으로 body에는 fragment를 담았습니다.
// 직접적으로 body에 영향을 주는 것은 fragment를 추가할 때, 단 한 번입니다.
// 만약 appendChild같은 조작을 많이 해야할 경우, fragment에다가 한 후에
// 마지막에 fragment를 추가하면 됩니다.
2. READ : querySelector / querySelectorAll
1) document.querySelector('선택자') => CSS 선택자로 요소를 선택하게 해준다.
선택자와 일치하는 첫 번째 자식 요소를 반환
document.querySelector( '.xyz' ) // 클래스 값이 xyz인 첫번째 요소에 접근
let el = document.querySelector(".myclass"); // 문서에서 "myclass"라는 클래스를 사용하는 첫 번째 요소를 반환
// abc를 갖는 요소 중 첫 번째 요소의 색을 빨간색으로 바꾼다.
<p class="abc">Lorem Ipsum Dolor</p>
<p class="abc">Lorem Ipsum Dolor</p>
<p class="abc">Lorem Ipsum Dolor</p>
<script>
document.querySelector( '.abc' ).style.color = 'red';
</script>
2) document.querySelectorAll('선택자명') => DOM을 순회하며 선택자에 해당하는 요소들을 리스트 형태로 반환
let x = document.querySelectorAll(".example");
<h2 class="example">A heading with class="example"</h2>
<p class="example">A paragraph with class="example".</p>
<button onclick="myFunction()">Try it</button>
<script>
function myFunction() {
var x, i;
x = document.querySelectorAll(".example");
for (i = 0; i < x.length; i++) {
x[i].style.backgroundColor = "red";
}
}
</script>
3. UPDATE : innerHTML / innerText / textContent / classList / setAttribute
1) element.innerHTML => html 태그(<div>, <p> 등)의 내부 문자를 가져올 때 사용합니다
<div id="test">사과</div>
<script>
document.querySelector("#test").innerHTML = "<h1>수박</h1>";
</script>
// document에서 id가 'test'인 선택자를 찾아 그 요소에 "<h1>태그로 감싼 '수박'을 출력한다.
// 결과값 예시) 안녕하세요 <span>ㅎㅎ</span>
2) node.innerText => innerText는 태그(<h1>)또한 문자로 인식하여 출력하는것을 확인할 수 있습니다.
<div id="test">사과</div>
<script>
document.querySelector("#test").innerText = "<h1>복숭아</h1>";
</script>
// document에서 id가 'test'인 선택자를 찾아 그 요소에 "<h1>복숭아</h1>" 를 있는 그대로 출력한다.
// 결과값 예시) 안녕하세요 ㅎㅎ
3) element.textContent = '내용' => 모든 자식 텍스트 노드를 가져온다. 텍스트를 엘리먼트에 추가할 경우 쓰인다.
<p id="demo" onclick="myFunction()">Click me to change my textual content.</p>
<script>
function myFunction() {
document.getElementById("demo").textContent = "Paragraph changed!";
}
</script>
// Click me to change my textual content. => Paragraph changed! 로 바꾼다.
<ul id="myList">
<li>Coffee</li>
<li>Tea</li>
</ul>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
function myFunction() {
var x = document.getElementById("myList").textContent;
document.getElementById("demo").innerHTML = x;
}
</script>
// Coffee
// Tea
// Try it(버튼)
// Coffee Tea
# innerHTML vs innerText 차이
- innerHTML은 보안에 취약하므로 잘 쓰지 않는다.
- innerHTML은 태그를 적용하여, 즉 html로 인식하여 리턴한다.
- innerText는 있는 그대로 출력한다.
# innerText vs textContent차이
- textContent가 브라우저 호환성이 조금 더 높고, 가볍다고 한다.
- innerText에 CSS가 반영된다.
- textContent는 태그를 문자로 인식하여 가져온다.
- innerText는 불필요한 공백을 제거하고 텍스트로 반환하지만,
textContent는 모든 텍스트를 그대로 가져온다.
<p> Hi Webisfree.com Web Development </p>
// # innerText를 사용한 경우
var msg = document.querySelector('p').innerText;
console.log(msg);
Hi Webisfree.com Web Development // 출력 결과
// # textContent를 사용한 경우
var msg = document.querySelector('p').textContent;
console.log(msg);
Hi Webisfree.com Web Development // 출력 결과
4) element.classList => 해당 Element의 클래스목록에 접근하는 간편한 방법
[1] add : Element에 클래스를 추가
Ex) element.classList.add('open')
[2] remove : Element에 클래스를 제거
Ex) element.classList.remove('open')
[3] length : <div> 요소에있는 클래스 이름 수를 확인
Ex) document.getElementById("myDIV").classList.length;
[3] item : Element에 클래스에서 0번째 항목을 찾아온다.
Ex) element.classList.item(0)
[4] toggle : Element에 클래스가 존재하면 제거하고 없으면 추가
Ex) element.classList.toggle('open')
[5] contains : Element에 클래스가 존재하는지 확인 (값은 true / false)
Ex) element.classList.contains('open')
[6] replace : Element에 클래스(open)를 새로운 클래스(close)로 교체
Ex) element.classList.replace('open', 'close')
5) element.setAttribute(attribute_name, attribute_value) => 지정된 요소의 속성 값을 설정한다.
속성이 이미 있으면 값이 업데이트, 그렇지 않으면 지정된 이름과 값으로 새 속성이 추가된다.
<button>Hello World</button>
var b = document.querySelector("button");
b.setAttribute("name", "helloButton");
b.setAttribute("disabled", "");
document.getElementById( 'xyz' ).setAttribute( 'title', 'This is title' )
// id 값이 xyz인 요소의 title 속성을 This is title로 정합니다.
// 만약 이미 속성값이 존재한다면 그 값을 지우고 새 값을 적용
<p><a id="abc" href="#">CODING FACTORY</a></p>
document.getElementById('abc').setAttribute('href', 'https://www.codingfactory.net');
// id 값이 abc인 요소의 href 속성값을 변경
4. DELETE(remove / removeChild / innerHTML = ""; / textContent = "";)
1) childNode.remove() => 메소드는 이를 포함하는 트리로부터 객체를 제거합니다.
<div id="div-01">div-01 입니다</div>
<div id="div-02">div-02 입니다</div>
<div id="div-03">div-03 입니다</div>
var el = document.getElementById('div-02');
el.remove(); // id가 'div-02' 인 div를 제거합니다
<p id="demo">Click the button, and this paragraph will be removed from the DOM.</p>
// 문서에서 선택한 요소를 제거한다.
let myobj = document.getElementById("demo");
myobj.remove();
2) node.removeChild() => DOM에서 자식 노드를 제거하고 제거 된 노드를 반환
Ex1) 상위 노드를 알 때 지정된 요소를 제거
<div id="top">
<div id="nested"></div>
</div>
let d = document.getElementById("top");
let d_nested = document.getElementById("nested");
let throwawayNode = d.removeChild(d_nested);
Ex2) 목록에서 첫 번째 <li> 요소를 제거합니다.
<ul id="myList">
<li>Coffee</li>
<li>Tea</li>
<li>Milk</li>
</ul>
let list = document.getElementById("myList");
list.removeChild(list.childNodes[0]);
Ex3) 목록에 자식 노드가 있는지 확인한다. 있다면 첫 번째 자식 노드 (인덱스 0)를 제거
let list = document.getElementById("myList");
if (list.hasChildNodes()) {
list.removeChild(list.childNodes[0]);
}
Ex4) 목록의 모든 자식 노드를 제거합니다.
let list = document.getElementById("myList");
if (list.hasChildNodes()) {
list.removeChild(list.childNodes[0]);
}
Ex5) 부모 노드를 지정하지 않고 id = "myLI"인 <li> 요소를 부모 요소에서 제거합니다.
<ul id="myList">
<li>Coffee</li>
<li id="myLI">Tea</li>
<li>Milk</li>
</ul>
let item = document.getElementById("myLI");
item.parentNode.removeChild(item);
# remove vs removeChild 비교
- remove()는 Internet Exploer에는 지원 X / 부모 엘리먼트 불필요 /
- remove()는 노드를 메모리에서 삭제하고 종료 But, removeChild()는 노드를 삭제하는 것이 아니라
해당 노드는 그대로 존재하며, 부모-자식관계를 끊어놓은 것이고, 최종적으로 관계를 끊은 해당 노드의 참조를 반환
3) document.body.innerHTML = "";
4) document.body.textContent = "";
5. APPEND (append, appendChild)
1) parentnode.append() => parentNode의 마지막 자식 뒤에 Node 객체 또는 DOMString 객체를 삽입
Ex1) 요소(element) 추가하기
let parent = document.createElement("div");
let p = document.createElement("p");
parent.append(p);
console.log(parent.childNodes);
Ex2) 문자(text) 추가하기
let parent = document.createElement("div");
parent.append("Some text");
console.log(parent.textContent); // "Some text"
Ex3) 요소(element)와 문자(text) 함께 추가하기
let parent = document.createElement("div");
let p = document.createElement("p");
parent.append("Some text", p);
console.log(parent.childNodes); // NodeList [ #text "Some text", <p> ]
2) node.appendChild(aChild); => 자식 노드의 마지막에 노드가 삽입된다.
let aChild = element.appendChild(aChild);
// // 새로운 단락 요소를 생성하고 문서에 있는 바디 요소의 끝에 붙입
var p = document.createElement("p");
document.body.appendChild(p);
let parent = document.getElementById("list"); // 아이디가 "list"인 요소를 선택함.
let newItem = document.getElementById("item"); // 아이디가 "item"인 요소를 선택함.
parent.appendChild(newItem); // 해당 요소의 맨 마지막 자식 노드로 추가함.
# append() 와 appendChild()의 차이점
- append() DOMString 객체 추가 가능 / appendChild() 오직 Node 객체만 가능
- append() 반환값 없음 / appendChild() 반환값 있음
- append() 여러 개 노드와 문자 추가 가능 / appendChild() 오직 노드 하나만 추가 가능
- append() 익스플로러 미지원 / appendChild() 익스플로러 지원
let li = document.createElement('li');
li.append('무지');
let targetul = document.getElementById('friends');
targetul.append(li);
let li = document.createElement('li');
let litext = document.createTextNode('무지');
li.appendChild(litext);
let targetul = document.getElementById('friends');
targetul.appendChild(li);
6. 그 외(아직분류안됨) (append, appendChild)
1) document.getElementById('id명') => id로부터 요소를 선택합니다. 결과는 단수
<p id="para">어떤 글</p>
<button onclick="changeColor('blue');">blue</button>
<button onclick="changeColor('red');">red</button>
function changeColor(newColor) {
let elem = document.getElementById('para');
elem.style.color = newColor;
}
<p id="demo">Click the button to change the text in this paragraph.</p>
function myFunction() {
document.getElementById("demo").innerHTML = "Hello World";
}
2) document.getElementsByName('name') => name으로부터 요소를 선택합니다. 결과는 복수
<p id="demo">Click the button to change the text in this paragraph.</p>
function myFunction() {
var x = document.getElementsByName("fname")[0].tagName;
document.getElementById("demo").innerHTML = x;
}
3) document.getElementsByTagName('태그명') => tag name으로부터 요소를 선택합니다. 결과는 복수
4) document.getElementsByClassName('class명') => class로부터 요소를 선택합니다. 결과는 복수
5) element.attributes() => 주어진 요소의 속성 모음을 반환
6) element.getAttribute(name) => 속성값을 가져옴
7) element.removeAttribute(name) => 속성값을 제거함
8) element.hasAttribute(name) => 속성의 존재 확인
9) insertBefore(newNode, targetNode)
10) hasChildNodes()
'코드스테이츠 > Today I Learned' 카테고리의 다른 글
Immersive 2일차 [2020.09.01 (화)] (0) | 2020.09.01 |
---|---|
Immersive 1일차 [2020.08.31 (월)] (0) | 2020.08.31 |
[TIL-016] 20.08.10 (0) | 2020.08.10 |
[TIL-015] 20.08.07 (0) | 2020.08.07 |
[TIL-014] 20.08.06 (0) | 2020.08.06 |