DOM (Document Object Model)
HTML 요소를 Object(JavaScript Object)처럼 조작할 수 있는 Model
DOM을 이용해서 HTML로 구성된 웹 페이지를 동적으로 만들 수 있음
<script src="index.js"></script>
const tweetDiv = document.createElement('div') // 생성한 div 요소를 변수에 할당
document.body.append(tweetDiv)
const oneTweet = document.querySelector('.tweet'); // 변수에 할당된 요소가 하나임
const tweets = document.querySelectorAll('.tweet') // 변수에 할당된 요소가 여러개
// 조회한 여러개의 요소들을 배열처럼(배열X) for문을 사용할 수 있음
// 유사배열, 배열형 객체라고 표현함 (Array-like Object)
const getOneTweet = document.getElementById('container')
const queryOneTweet = document.querySelector('#container')
console.log(getOneTweet === queryOneTweet) // true (실제 동작, 접근하는 대상이 동일함)
// 우선 div 요소를 하나 만들고 변수에 할당
const oneDiv = document.createElement('div')
console.log(oneDiv) // <div></div>
// 기존에 생성한 빈 div 태그에 문자열(텍스트) 입력(추가)
oneDiv.textContent = 'dev'; // textContent 를 사용해서 빈 div 요소에 문자열을 입력
console.log(oneDiv) // <div>dev</div>
// div 요소에 class를 추가
oneDiv.classList.add('tweet')
console.log(oneDiv) // <div class = "tweet">dev</div>
// container의 자식 요소가 되도록 추가(넣기)
const container = document.querySelector('#container');
container.append(oneDiv)
element.setAttribute('attribuename', 'attributevalue')
// attributename 에는 속성 이름을 넣는다
// attributevalue 에는 속성값을 넣는다
document.querySelector('h2').setAttribute('title', 'This is title');
// h2 요소를 찾아서 title 속성을 만들고 그 값은 This is title 을 넣어줘
// 참고 : 만약 이미 속성값이 존재하는 경우 그 값을 지우고 새 값을 적용하게 됨
// 클래스가 tweet인 요소를 모두 찾아줘
const setTitle = document.querySelectorAll('.tweet')
// 조회되는 객체의 형태 확인 (NodeList DOM 컬렉션이라고 함)
console.log(setTitle);
console.log(typeof setTitle); // object
Array.isArray(setTitle); // false 배열이 아니고 유사배열
// 예시1) 그 요소 각각에게(배열같은 것의 각 아이템들) title 속성을 만들고 그 값은 This is title 을 넣어줘
for (let item of setTitle) {
item.setAttribute('title', 'This is title');
}
// 예시2) 그 요소 각각에게 test 라는 클래스를 추가해줘 (배열 요소 순회 for of 활용))
for (let item of setTitle) {
item.classList.add('test');
}
// 예시3) 배열 요소 순회를 위해 반복문의 알반 형태 활용
for (let i = 0; i < setTitle.length; i++) {
setTitle[i].classList.add('test2');
}
// 예시4) for 반복문을 forEach()로 바꿔서 적용해보기
setTitle.forEach((item) => item.classList.add('test3')); // NodeList는 forEach 메서드는 있지만
// setTitle.map((item) => item.classList.add('test4')) // map, filter 메서드는 없어서 다른방식으로 접근해야함
const container = document.querySelector('#container');
const tweetDiv = document.createElement('div');
container.append(tweetDiv);
tweetDiv.remove() // append 했던 요소를 삭제
// h2 요소를 지워줘
document.querySelector('h2').remove();
다만, 보안 측면에서 문제를 가지고 있다고 함
참고 : innterHTML 사용 주의해야 하는 이유 : https://til-devsong.tistory.com/m/101
// id가 container인 요소의 모든 자식 요소를 지우는 경우
document.querySelector('#container').innerHTML = '';
const container = document.querySelector('#container');
// container 에 첫번째 자식 요소가 있으면 container의 첫번째 자식 요소를 삭제해줘
while (container.firstChild) {
container.removeChild(container.firstChild)
}
// container 하위에 있는 모든 자식 요소들이 모두 날라가버림
// container 의 자식 요소가 1개만 남을 때까지, 마지막 자식 요소 제거를 반복
const container = document.querySelector('#container');
while (container.children.length > 1) {
container.removeChild(container.lastChild);
}
// 직접 클래스 이름이 tweet 인 요소만 찾아서 지우는 방법
const tweets = document.querySelectorAll('.tweet');
tweets.forEach(function(tweet) {
tweet.remove();
}
// or
for (let tweet of tweets) {
tweet.remove()
}