본문 바로가기
JavaScript/JavaScript

Javascript) DOM (getElementById, getElementsByTagName, getElementsByClassName, getElementsByName, querySelector, querySelectorAll)

by 박채니 2022. 5. 17.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


DOM (Document Object Model)

- document 객체 하위에 html 문서의 태그가 가진 계층구조 그대로 javascript 객체로 변환

- 각각의 tag는 객체(속성)로써 관리됨

 

HTML 코드

<body>
    <h1>DOM에 접근하기</h1>

    <div>
        <ul>
            <li class="group1" id="hw1" title="Helloworld1">Helloworld1</li>
            <li class="group1" id="hw2">Helloworld2</li>
            <li class="group2" id="hw3" title="Helloworld3">Helloworld3</li>
            <li class="group2" id="hw4">Helloworld4</li>
            <li class="group1 group2" id="hw5">Helloworld5</li>
        </ul>
    </div>

    <button onclick="test1()">getElementById</button>
</body>
</html>

 

Javascript 코드

<script>
    function test1() {
        console.dir(document);  // 객체를 계층형으로 열람  
    }
</script>

이렇게 객체를 계층형으로 열람할 수 있으며, children 객체를 타고 가서 확인해보면 현재 작성했던 코드들을 계층형으로 확인할 수 있습니다.


getElementById

- document 하위에 특정 태그 객체를 ID값을 가지고 찾는 방법

function test1() {
    // console.dir(document);  // 객체를 계층형으로 열람

    const hw3 = document.getElementById("hw3");
    console.dir(hw3);
    console.log(hw3.style.color)    // getter
    hw3.style.color = 'hotpink';    // setter
    console.log(hw3.style.color);   // getter
}

hw3의 계층 구조를 출력해주었으며, hw3의 color값을 가져왔습니다. (getter)

하지만, 현재 color값이 미설정 되어 있으므로 "" 공백이 출력 되었고, 속성에 직접 접근하여 hw3의 color값을 'hotpink'로 세팅해주었습니다.

그 후 color값을 가져오니 'hotpink'가 출력 되었습니다.

 

존재하지 않는 ID값 

const noElem = document.getElementById("aaaa");
console.log(typeof noElem, noElem);

object 타입의 값 없음 키워드인 'null'이 리턴 되었습니다.

 


getElementsByTagName

 

HTML 코드

<button onclick="test2()">getElementsByTagName</button>

 

Javascript 코드

function test2() {
    const list = document.getElementsByTagName("li");   // 요소가 하나여도 배열에 담아 리턴
    //console.log(list);

    for(let i = 0; i < list.length; i++) {
        console.log(list[i]);
        list[i].style.background = 'green';
        list[i].style.color = '#fff'   // 컬러명, rgb함수, 16진수 모두 작성 가능
    }
}

getElementsByTagName은 배열에 담아 리턴해주는데, 요소가 단 하나여도 배열에 담아서 리턴해줍니다.

for문을 이용하여 li 태그에 background-color와 color 값을 set해주었습니다.

 


getElementsByClassName

 

HTML 코드

<button onclick="test3()">getElementsByClassName</button>

 

Javascript 코드

function test3() {
    const group1 = document.getElementsByClassName("group1");
    console.log(group1);

    for(let i = 0; i < group1.length; i++) {
        const content = group1[i].innerHTML;
        group1[i].innerHTML = content.replace("Helloworld", "안녕세계");
    }
}

group1을 가져와 실제 내용에 접근 (innerHTML)하여 "Helloworld"를 "안녕세계"로 replace하였습니다.

 


getElementsByName

 

HTML 코드

<button onclick="test4()">getElementsByName</button>

<div>
    <input type="checkbox" name="fruit" id="fruit1" value="사과"><label for="fruit1">사과</label>
    <input type="checkbox" name="fruit" id="fruit2" value="바나나"><label for="fruit2">바나나</label>
    <input type="checkbox" name="fruit" id="fruit3" value="아보카도"><label for="fruit3">아보카도</label>
</div>

 

Javascript 코드

function test4() {
    const fruits = document.getElementsByName("fruit");
    console.log(fruits);

    // 체크된 요소의 값 출력하기
    const arr = [];

    for(let i = 0; i < fruits.length; i++) {
        const chk = fruits[i];
        // console.dir(chk);
        if(chk.checked) {
            // arr[i] = chk.value;
            arr.push(chk.value);    // 배열의 마지막 요소로 추가
        }
    }
    console.log(arr);
    alert(arr + '을 선택하셨습니다.');
}

chk에 fruits의 요소들을 담은 후, chk.checked가 true라면 배열에 chk.value(선택값)을 추가하여 출력하였습니다.

 


전체 선택/해제

HTML 코드

<div>
    <input type="checkbox" name="fruit" id="fruit1" value="사과"><label for="fruit1">사과</label>
    <input type="checkbox" name="fruit" id="fruit2" value="바나나"><label for="fruit2">바나나</label>
    <input type="checkbox" name="fruit" id="fruit3" value="아보카도"><label for="fruit3">아보카도</label>
    &nbsp;&nbsp;
    <input type="checkbox" id="fruitCheckAll" onchange="test5();"><label for="fruitCheckAll">전체선택/해제</label>
</div>

onchange 속성을 통하여 해당 타입에 변화가 발생하면 test5() 함수를 실행하도록 하였습니다.

 

Javascript 코드

//전체 선택/해제
function test5() {
    const fruitCheckAll = document.getElementById("fruitCheckAll");
    console.log(fruitCheckAll.checked);

    const fruits = document.getElementsByName("fruit");
    for(let i = 0; i < fruits.length; i++) {
        fruits[i].checked = fruitCheckAll.checked;
    }
}

fruitCheckAll의 check 속성을 가져온 후, fruit 이름을 가진 객체를 다 가져온 후 해당 객체의 checked 속성에 fruitCheckAll의 checked 속성을 대입해주었습니다.

 


사용자 입력 값 가져오기

HTML 코드

<button onclick="test6()">@실습문제 - #username 값 출력</button>

<div>
    <input type="text" id="username" name="username" placeholder="username">
</div>

 

Javascript 코드

function test6() {
    const username = document.getElementById("username");
    // const username = document.getElementsByName("username")[0];
    alert("사용자 이름 : " + username.value);
    username.value = '';    // 초기화
}

 

function test6() {
    // const username = document.getElementById("username");
    const username = document.getElementsByName("username")[0];
    alert("사용자 이름 : " + username.value);
    username.value = '';    // 초기화
}


input:range 값 시각화 하기

HTML 코드

<div>
    <input type="checkbox" name="fruit" id="fruit1" value="사과"><label for="fruit1">사과</label>
    <input type="checkbox" name="fruit" id="fruit2" value="바나나"><label for="fruit2">바나나</label>
    <input type="checkbox" name="fruit" id="fruit3" value="아보카도"><label for="fruit3">아보카도</label>
    &nbsp;&nbsp;
    <input type="checkbox" id="fruitCheckAll" onchange="test5();"><label for="fruitCheckAll">전체선택/해제</label>
    <br>
    <input type="text" id="username" name="username" placeholder="username">
    <br>
    <input type="range" name="point" id="point" min="0" max="100" value="0" oninput="test7();">
    <span id="pointView">0</span>점
</div>

oninput 속성을 통해 해당 요소에 값이 대입되면 test7() 함수가 실행되도록 하였습니다.

 

Javascript 코드

function test7() {
    // const point = document.getElementById("point");
    // console.log(point.value);
    // const pointView = document.getElementById("pointView");
    pointView.innerHTML = point.value;
}

document.getElementById에 한하여 id와 동일한 이름의 변수를 선언없이 해당 객체에 접근할 수 있습니다.

(id값은 고유하기 때문에 가능!)

 


querySelector

- css 선택자를 사용해서 하나의 (첫번째) 요소만 반환

 

전체 HTML 코드

<div>
    <ul>
        <li class="group1" id="hw1" title="Helloworld1">Helloworld1</li>
        <li class="group1" id="hw2">Helloworld2</li>
        <li class="group2" id="hw3" title="Helloworld3">Helloworld3</li>
        <li class="group2" id="hw4">Helloworld4</li>
        <li class="group1 group2" id="hw5">Helloworld5</li>
    </ul>
</div>

<div>
    <input type="checkbox" name="fruit" id="fruit1" value="사과"><label for="fruit1">사과</label>
    <input type="checkbox" name="fruit" id="fruit2" value="바나나"><label for="fruit2">바나나</label>
    <input type="checkbox" name="fruit" id="fruit3" value="아보카도"><label for="fruit3">아보카도</label>
    &nbsp;&nbsp;
    <input type="checkbox" id="fruitCheckAll" onchange="test5();"><label for="fruitCheckAll">전체선택/해제</label>
    <br>
    <input type="text" id="username" name="username" placeholder="username">
    <br>
    <input type="range" name="point" id="point" min="0" max="100" value="0" oninput="test7();">
    <span id="pointView">0</span>점
</div>

<button onclick="test1()">getElementById</button>
<button onclick="test2()">getElementsByTagName</button>
<button onclick="test3()">getElementsByClassName</button>
<button onclick="test4()">getElementsByName</button>
<button onclick="test6()">@실습문제 - #username 값 출력</button>
<br>
<button onclick="test8()">querySelector</button>
<button onclick="test9()">querySelectorAll</button>

 

Javascript 코드

function test8() {
    const username = document.querySelector("#username");
    console.log(username);

    const group1 = document.querySelector(".group1");
    console.log(group1);

    const li = document.querySelector("ul li");
    console.log(li);
}

css 선택자를 사용하여 첫번째 단 하나의 요소만을 반환한 것을 확인할 수 있습니다.

 

 

querySelectAll

- css 선택자와 매칭되는 요소를 모두 유사배열에 담아 반환

function test9() {
    const group1 = document.querySelectorAll(".group1");
    console.log(group1);

    const list = document.querySelectorAll("ul li");
    console.log(list);
}

querySelector에 반면, 모든 요소를 가져온 것을 확인할 수 있습니다.