HTMLCollection은 NodeList와 달리 수정하는 대로 바로 업데이트 되는 live 객체이다.
Create & Insert
// .insertAdjacentHTML
const message = document.createElement('div');
message.classList.add('cookie-message');
// message.textContent = 'We use cookies for improved functionality and analytics.';
message.innerHTML = 'We use cookies for improved functionality and analytics. <button class="btn btn--close-cookie">Got It!</button>';
header.prepend(message); // 내부 가장 위에 삽입됨
header.append(message); // 내부 가장 아래에 삽입됨
// header.append(message.cloneNode(true)); // 똑같은 것을 사용하려면 복제해서 사용
header.before(message);
header.after(message);
DOM Element는 unique한 특성이 있기 때문에 같은 요소를 여러번 삽입한다고 해도 한 번만 삽입된다.
똑같은 것을 반복적으로 사용해야할 경우 cloneNode 메소드를 사용해야 한다.
Delete
document.querySelector('.btn--close-cookie').addEventListener('click', function () {
// message.remove();
message.parentElement.removeChild(message);
});
getComputedStyle을 사용하면 CSS sheet에서 설정한 값들도 가져올 수 있다.
Attributes
const logo = documnt.querySelector('.nav__logo');
console.log(logo.alt);
console.log(logo.src);
console.log(logo.className);
logo.alt = 'Beautiful minimalist logo';
logo.setAttribute('company', 'Bankist');
console.log(logo.designer); // 이 방식은 standard attribute 지원한다.
console.log(logo.getAttribute('designer'));
const link = document.querySelector('.twitter-link');
console.log(link.href); // 절대 경로를 출력 http://127.0.0.1:8080/#
console.log(link.getAttribute('href')); // 실제 설정된 값을 출력
// Data attributes: data로 시작하는 속성 값
console.log(logo.dataset.versionNumber); // .data-version-number 클래스는 dataset 객체에 저장되어 있다.
Classes
logo.classList.add('c', 'j');
logo.classList.remove('c');
logo.classList.toggle('c');
logo.classList.contains('c'); // not includes
// Don't use - override 되기 때문에
logo.className = 'jonas'
addEventListener 세번째 인자로 true를 전달하게 되면, capturing phase에 이벤트가 전달되게 된다. 그래서 가장 상위 요소인 .nav의 이벤트 리스너 코드가 먼저 동작한다.
이 방식은 이제는 거의 사용하지 않는다.
Event Delegation(이벤트 위임)
document.querySelectorAll('.nav__link').forEach(
function (el) {
el.addEventListener('click', function (e) {
e.preventDefault();
const id = this.getAttribute('href');
console.log(id);
document.querySelector(id).scrollIntoView({ behavior: 'smooth' });
});
});
똑같은 이벤트 리스너 함수를 forEach로 수십개를 붙이게 된다면 성능이 저하될 수 있다.
이럴때는 아래와 같이 버블링을 이용해 이벤트 위임을 활용할 수 있다.
// 1. Add event listener to common parent element
// 2. Determine what element originated the event
document.querySelector('.nav__links')
.addEventListener('click', function (e) {
e.preventDefault();
// matching strategy
if (e.target.classList.contains('nav__link')) {
const id = e.target.getAttribute('href');
console.log(id);
document.querySelector(id).scrollIntoView({ behavior: 'smooth' });
}
});