객체구조분해에서는 콜론을 사용하여 사용하고자 하는 이름을 바꿀 수 있는데, import에서는 as키워드를 대신 쓴다.
import {named1 as hun, named2} from './test.js'
console.log(hun, named2)
export const named1 = {
a: 1,
b: 2
}
export const named2 = 123
export default function() {
return 'abc'
}
// node.js는 local을 제어하는 환경이라 생각
// node.jssms Common.js지원, Common.js는 기본 내보내기가 없다
// ESM
const path = require('path')
const _ = require('lodash')
module.exports = {
a: 1,
b: 2
}
setTimeout(() => {
console.log('Timeout!')
}, 1000)
function a() {
console.log('A')
function b() {
console.log('B')
}
b()
}
a()
// 1000 => A B Timeout!
// 0 => A B Timeout!
// setTimeout이 먼저 실행하는 것은 맞지만 web api를 통해 브라우저를 통해 돌리기 때문에(브라우저의 도움을 받아야하기 때문에) 이를 하는 동안 a와 b가 먼저 실행된다.
document.querySelector('input')
.addEventListener('keydown', () => {
})
<div>
123
<span>abc</span>
</div>
<div></div>
<div></div>
const divEl = document.querySelector('div')
console.log('Element: ', divEl)
const divEls = document.querySelectorAll('div')
console.log('찾은 태그들, NodeLsit(개체): ', divEls)
// node구조 표시
console.log('Node 구조: 'divEl.childNodes)
// 각각의 div 반복
divEls.forEach(el => {
console.log(el)
})
for (const el of divEls) {
console.log(el)
}
<div id="abc xyz">
123
<span>abc</span>
</div>
// id가 하나 일 때
const divEl = document.querySelector('div').id
console.log(divEl) // abc xyz
// id가 여러개 일 때 구분하기 위해 split을 사용
console.log(divEl.split(' ')) /// ['abc', 'xyz']
<div id="abc xyz" class="btn btn-xs btn-primary">
123
<span>abc</span>
</div>
console.log(divEl.classList)
// 클래스 추가(add) / 제거(remove) / 확인(contains)
// 클래스 이름만 기입해야한다
console.log(divEl.classList.contains()); // 해당 class가 있는지 없는지true, false로 반환
divEl.classList.add('heropy')
divEl.classList.remove('btn-xs')
<div class="parent">
<div id="abc" class="btn btn-xs btn-primary">
<h1>123</h1>
<span>abc</span>
</div>
<div></div>
<div></div>
</div>
<section></section>
const divEl = document.querySelector('div')
const divElId = document.getElementById('abc')
console.log(divElId)
// 부모 요소
console.log(divEl.parentNode)
// 이전 형제 요소, 다음 형제 요소
console.log(divEl.previousElementSibling)
console.log(divEl.nextElementSibling)
// 체이닝 형태로 작성해도 된다.
divEl.parentNode.previousElementSibling
divEl.parentNode.nextElementSibling
<div class="btn">
123
<span>abc</span>
</div>
const divEl = document.querySelector('div')
// getter
console.log(divEl.innerHTML)
console.log(divEl.textContent)
// setter
divEl.innerHTML = '<h1 style="color: red;">Hello!</h1>' // html구조로 출력
divEl.textContent = '<h1 style="color: red;">Hello!</h1>' // 글자 그대로 출력
<div class="btn">
123
<span>abc</span>
</div>
const divEl = document.querySelector('div')
divEl.innerHTML = /* html */
<h1 style="color: red">
Hello!
<div style="color: blue;">Good!</div>
</h1>;
divEl.append('<h2>Hi</h2>');
// 요소 생성
const h2El = document.createElement('h2')
divEl.prepend(h2El)
// 1. for 반복문 방법1
for(let i = 0; i< 10; i += 1) {
const h2El = document.createElement('h2')
h2El.textContent = i + 1
divEl.append(h2El);
}
// 2. for 반복문 방법2
let h2Els = []
for(let i = 0; i< 10; i += 1) {
const h2El = document.createElement('h2')
h2El.push(h2El)
}
divEl.append(...h2Els)
<div class="btn" title="asfwqdsa">
123
<span>abc</span>
</div>
const divEl = document.querySelector('div')
// attributes: 속성들
console.log(divEl.getAttribute('title'))
console.log(divEl.setAttribute('title', 'abcdefg'))
<div class="btn" data-user="{
name: 'Hun',
age: 27
}"></div>
123
<span>abc</span>
</div>
const divEl = document.querySelector('div')
const user = {
name: 'Hun',
age: 27
}
// dataset, getter
console.log(divEl.dataset.user) // 문자데이터로 출력, get
//
divEl.dataset.user = JSON.stringfy(user); // JSON문법에 맞게 문자화, 데이터 할당 setter
// data-user
console.log(JSON.parse(divEl.dataset.user)) // 객체로 출력하려면 JSON이용
<div class="btn" data-user="{
name: 'Hun',
age: 27
}"></div>
123
<span>abc</span>
</div>
div {
width: 200px;
height: 100px;
border: 2px solid;
top: 200px;
left: 10px;
}
const divEl = document.querySelector('div')
// 요소 크기
console.log(divEl.clientWidth)
console.log(divEl.clientHeight)
// 요소 렌더링 정보, 주의해서 써야한다, 함수 호출시 그때 그때 계산하기 때문이다.
console.log(divEl.getBoundingClientRect())
// 추가 내용
const h1El = document.createElement('h1');
// 둘 다 같다.
h1E1.id = 'abc'
h1El.setAttribute('id', 'abc')
h1El.classList.add('btn')
document.body.append(h1El)
Event handler(Callback): addEventListener부분을 의미한다.
아래의 예시를 보자
<div class="btn" data-user="Hun">
123
<span>abc</span>
</div>
<input />
const divEl = document.querySelector('div')
const inpuEl = document.querySelector('input')
// Event handler == Callback
divEl.addEventListener('click', e => { // e는 매개변수
console.log(e);
})
// 입력이 될 때의 정보
// input, keydown
// inpuEl.addEventListener('input', e => {
inpuEl.addEventListener('keydown', e => {
if(e.isComposing) return // ★한글이 2번 이상 입력될 시 이 코드를 사용해라!
console.log(event.target.value);
})
// prevent default: 기본 동작 방지
// stop propagtion: 이벤트 버블링 정지(방지)
// 이벤트 버블링 vs 이벤트 캡처링
// currentTarget vs target
, { capture: true })
// 이벤트 종류
// click, input, keydown, mousemove, mouseenter, mouseleave, scroll, resize..