본문으로 바로가기

DOM 조작

category JavaScript 2020. 10. 8. 01:49

DOM이란?

DOM(Document Object Model) 문서 객체 모델은 웹 페이지에 대한 인터페이스다

HTML을 파싱해서 노드 트리 구조로 만든 것을 DOM이라고 한다

자바스크립트는 이 DOM을 이용해서 작동한다

조작 방법

말했듯 우리는 자바스크립트를 이용해 DOM을 조작해서 시각적 효과나, 우리가 원하는 동작들을 구현할 수 있다

언제나 그렇듯 기본 CSS는 생략

<body>
    <h1>JS DOM</h1>

    <div class="container">
        <div class="test a">A</div>
        <div class="test b">B</div>
        <div class="test c">C</div>
    </div>
    <div class="test d">D</div>
</body>

엘리먼트 가져오기

자바스크립트로 B상자의 색을 바꾸고 싶다면 어떻게 해야할까?

우선 html의 test b클래스인 div를 자바스크립트 속으로 가져와야한다

html 조작하기 위한 여러 메소드를 제공해주는 document객체를 사용해야한다

const b = document.querySelector('.b');
console.log(b);

가져온 엘리먼트는 자바스크립트에서 조작하기위해 변수에 담아두고 사용한다

querySelector는 css선택자를 인자로 넘겨 받아 html에서 첫번째 엘리멘트를 가져오는 메소드이다

말 그대로다 우리가 css에서 b박스를 꾸밀 때 .b나 .container.b로 가져와서 꾸며주듯

그 선택자로 우리가 원하는 엘리멘트를 들고올 수 있다

선택된 박스
출력된 엘리먼트

css로 첫번째 엘리멘트를 가져온다고 했다

그렇다면 4박스 모두 공통적으로 가지고 있는 test를 선택자로 사용한다면?

const test = document.querySelector('.test');
console.log(test);

말 한대로 첫번째 엘리먼트인 A만을 가져왔다

test 클래스를 모두 가져오려면

const test = document.querySelectorAll('.test');
console.log(test);

뒤에 All을 붙여주면된다

위와 다르게 모두 들고왔다

그럼 노드 리스트 형태로 4가지를 다 가져오게되며 배열과 비슷하게 test[index]를 이용해서 각각 요소에 접근할 수 있다

data-

html에도 따로 커스텀 데이터 값을 저장할 수 있다

내가 저장할 데이터의 이름 앞에 data-만 붙여주면되는데 data-age, data-value등으로 넣어주면 된다

이렇게 넣은 커스텀 데이터들은 자바스크립트으로도 조작이 가능하다

const cont = document.querySelector('.container');

우선 아까와 같이 쿼리셀렉터로 엘리먼트를 가져온 뒤

cont.setAttribute('data-name','boxes');

data-name이라는 데이터 이름으로 boxes를 넣었다

커스텀 데이터값이 들어간 모습

넣은 데이터 값을 확인할 수도 있다

console.log(cont.getAtrribute('data-name'));

들어간 값을 출력

dataset명령어를 통해서도 조회가 가능하다

<div class="test a" data-name="A" data-value="11">A</div>

이렇게 데이터를 가졌다고 한다면

const test = document.querySelector('.a');

console.log(test.dataset);

스트링맵 형태로 출력

조회가 가능하다

엘리먼트 추가/제거

추가

엘리먼트를 추가하고 제거할 수도 있다

가져온 엘리먼트를 변수에 넣어 사용했듯이

추가할 엘리먼트 또한 변수에 넣어야한다

const creElem = document.createElement('div');

creElem.innerHTML = 'test create<p>element</p>';

createElement에는 내가 만들 엘리먼트의 태그 값을 넣는다 p, div, span등등

그렇게 만든 변수에 innerHTML로 내용을 넣을 수 있는데

여긴 html 작성하듯이 쓸 수 있다

이렇게 만든 엘리먼트를 c박스 밑에 추가하려고 하는데 어떻게 해야할까?

c박스는 container박스 안에 있는 요소다 그렇다면 container안에 넣어야하는데

거기에 접근하기 위해서는 역시나 container를 가져와서 추가해줘야한다

const appendElem = document.querySelector('.container');

appendElem.appendChild(creElem);

appendElem이 추가된 모습

제거

const cont = document.querySelector('.container');
cont.removeChild(document.querySelector('.b'));

appendChild와 같이 제거하려는 엘리먼트의 부모를 찾아서 삭제해 주면 된다

b클래스를 가진 B박스가 삭제된 모습

class,id 변경/추가/제거

class와 id는 별 다를게 없어서 class로만 설명

.apply {
    width: 30vw;
    padding: 10px;
    margin: 10px;
    border: red solid 10px;
}

css에 apply클래스를 꾸미는 코드를 추가했다

하지만 현재 html에는 apply클래스를 가진 엘리먼트가 없다

변경

const cont = document.querySelector('.container');
cont.className = 'apply';

container를 가져와서 클래스 이름을 apply로 변경

cotainer가 해제되고 apply만 적용된 모습
코드의 모습

기존에 적용되어있던 .container가 해제되고 apply의 속성만 적용된 것을 볼 수 있다

추가

하지만 위와 같이 변경을 쓰기보다 추가하는 경우가 많다

const cont = document.querySelector('.container');
cont.classList.add('apply');

위와 다르게 cotainer 뒤에 apply가 추가되었다

제거

추가와 삭제는 매우 유사하다

const cont = document.querySelector('.container');
cont.classList.remove('container');

container가 삭제된 모습

toggle

추가 변경 제거 말고 toggle이라는 게 있는데

말 그대로 on/off하는 것

cont.classList.toggle('apply');

apply가 없을 때는 추가되었지만

cont.classList.toggle('apply');
cont.classList.toggle('apply');

apply가 있을 땐 삭제되었다

없으면 추가하고 있으면 삭제한다

'JavaScript' 카테고리의 다른 글

공 움직이기  (0) 2020.10.13
scroll event  (0) 2020.10.12
이벤트 위임  (0) 2020.10.12
전역 변수 줄이기  (0) 2020.10.11
이벤트  (0) 2020.10.10