핵심인물
생겨난 이유
파편화 및 표준화
수 많은 브라우저에서 자체 자바스크립트 언어를 사용하여 생긴 서로 다른 모습의 자바스크립가 크로스 브라우징 이슈를 만들어냄 -> 웹 표준 만들게 됨
Ecma 인터내셔널(정보와 통신 시스템을 위한 국제적 표준화 기구)
2015년 ES6 (ES2015) 탄생
'Next-gen of JS' 라고 불릴정도로 JS의 많은 고질적 문제들을 해결
Vanilla JavaScript
하지만, querySelector(), querySelectorAll()이
id, tag, class 선택자 등을 모두 사용가능하기 때문에 더 구체적이고 유연하게 선택 가능
//1. Selection - querySelector / querySelectorAll
//1-1. window & document
// console.log(window)
// console.log(document)
// console.log(window.document)
//1-2. querySelector
const mainHeader = document.querySelector('h1') // <h1 id="header">DOM Manipulation</h1>
const langHeader = document.querySelector('#lang-header') // <h2 id="lang-header">Programming Languages</h2>
const frameHeader = document.querySelector('#frame-header') // <h2 id="frame-header">Frameworks</h2>
// console.log(mainHeader, langHeader, frameHeader)
//1-3. querySelectorAll
const langLi = document.querySelectorAll('.lang')
const frameworkLi = document.querySelectorAll('.framework')
// console.log(langLi, frameworkLi)
//1-4. 여러 개의 요소 -> 첫 번째로 일치하는 요소
const selectOne = document.querySelector('.lang')
// console.log(selectOne)
//1-5. 복합 선택자
const selectDescendant = document.querySelector('body li')
// const selectDescendant = document.querySelectorAll('body li')
const selectChild = document.querySelector('body > li')
// console.log(selectDescendant)
// console.log(selectChild)
//1-6. getElementById, getElementByClassName
const selectSepcialLang = document.getElementById('special-lang')
const selectAllLangs = document.getElementsByClassName('framework')
const selectAllLiTags = document.getElementsByTagName('li')
// console.log(selectSepcialLang, selectAllLangs, selectAllLiTags)
공통점
차이점
HTMLCollection
NodeList
둘다 Live Collection
으로 DOM의 변경사항을 실시간으로 반영하지만,
querySelectorAll()에 의해 반환되는 NodeList는 Static collection
//2-1. Creation
const browserHeader = document.createElement('h2')
const ul = document.createElement('ul')
const li1 = document.createElement('li')
const li2 = document.createElement('li')
const li3 = document.createElement('li')
// console.log(browserHeader, li1, li2, li3)
//2-3. append DOM
const body = document.querySelector('body')
body.appendChild(browserHeader) // const browserHeader = document.createElement('h2')
body.appendChild(ul) // const ul = document.createElement('ul')
ul.append(li1, li2, li3)
// ul.appendChild(li1, li2, li3)
append | appendChild | |
---|---|---|
노드 객체(Node object) | o | o |
문자열(DOMString) | o | x |
반환값(return) | x | o |
다중 값 허용 | o | x |
childNode.remove()
이를 포함하는 트리로부터 특정 객체를 제거
let el = document.querySelelctor('#content')
el.remove
Node.removeChild()
// 부모 노드를 알 때 지정된 자식 요소를 제거(부모, 지울 자식 다 필요)
let parent = document.querySelector('#parent')
let child = document.querySelector('#child')
let oldChild = parent.removeChild(child) // 지워진것
Node.textContent
Node.innerText
<h1>내용</h1>
으로 보임Element.innerHTML
요소(element) 내에 포함된 HTML 마크업을 반환
XSS공격에 취약점이 있으므로 사용시 주의
Cross-site Scripting
공격자가 웹 사이트 클라이언트 측 코드에 악성 스크립트를 삽입해 공격하는 방법
화면에 <h1>내용</h1>
이 적용되어 내용
만 보임
//2-2. innerText & innerHTML / append & appendChild
browserHeader.innerText = 'Browsers'
li1.innerText = 'IE'
li2.innerText = '<strong>FireFox</strong>'
li3.innerHTML = '<strong>Chrome</strong>'
// console.log(browserHeader, li1, li2, li3)
//2-5. Element Styling
li1.style.cursor = 'pointer'
li2.style.color = 'blue'
li3.style.background = 'red'
// setAttribute 속성부여
li3.setAttribute('id', 'king')
// getAttribute 속성조회
const getAttr = li1.getAttribute('style')
const getAttr2 = li3.getAttribute('style')
console.log(getAttr)
console.log(getAttr2)
EventTarget.addEventListener()
EventTarget.addEventListener()
지정한 이벤트가 대상에 전달될 때마다 호출할 함수를 설정
이벤트를 지원하는 모든 객체(Element, Document, Winodw 등)을 대상으로 지정가능
target.addEventListener(type, listener[, options])
type : 반응할 이벤트 유형(대소문자 구분 문자열)
listener : 지정된 타입의 이벤트가 발생 했을 때 알림을 받는 객체
EventListener 인터페이스 혹은 JS function 객체(콜백함수)여야 함
const btn = document.querySelector('button')
btn.addEventListener('click', function (event){
alert('버튼이 클릭되었습니다')
})
<input type="checkbox" id="my-checkbox">
<script>
const checkBox = document.querySelector("my-checkbox");
checkBox.addEventListener('click', function(event){
event.preventDefault() // 더이상 선택이 안됨
});
</script>