TIL/JavaScript

[JavaScript] 요소 검색

yndev 2022. 2. 21. 03:55

원하는 요소 노드에 접근하기

 

document.getElementById

- 요소에 id 속성이 있으면 위치에 상관 없이 (부모, 자식, 형제 등의 상대적 위치와 관계 없이) document.getElementById(id) 메소드를 통해 접근할 수 있다.
- id 속성 값을 그대로 딴 전역 변수를 이용한 접근도 가능하지만 해당 id 값과 동일한 변수가 생기는 이름 충돌 가능성이 있어 지양하는 것이 좋다.
- 문서 내의 id 속성 값을 중복 되어서는 안되며 중복 된다면 document.getElementById 메소드 동작에 문제가 발생한다.

    <div id="area1" class="area">
        div 영역
        <p id="area2">p 영역</p>
    </div>
    <script>
        // 요소 접근
        let elem = document.getElementById('area1');
        // 요소의 스타일 속성을 이용하여 배경색 변경
        elem.style.backgroundColor = 'skyblue';

        //let area2 = 10;
        area2.style.backgroundColor = 'blue';
    </script>

 

    <div id="area3" class="area"></div>
    <button onclick="accessId();">클릭 할 때 마다 색상 변경</button>

    <script>
        function accessId(){
            let area3 = document.getElementById('area3');
            let bgColor = area3.style.backgroundColor;
            console.log(bgColor);

            if(bgColor == 'red') {
                area3.style.backgroundColor = 'yellow';
            } else {
                area3.style.backgroundColor = 'red';
            }
        }

클릭할 때 마다 빨간색 노란색 바뀐다.

 

querySelector

document.querySelector('선택자') : 제공한 선택자와 일치하는 문서 내 첫 번째 element를 반환
document.querySelectorAll('선택자') : 제공한 선택자와 일치하는 문서 내 모든 element를 반환

    <div class="test">
        <h1>first</h1>
    </div>
    <div class="test">
        <h1>second</h1>
    </div>

 

    <script>
        let myDiv = document.querySelector(".test");
        console.log(myDiv);
        let myDivs = document.querySelectorAll(".test");
        console.log(myDivs);
        myDivs[0].style.color = 'red';
        myDivs[1].style.color = 'green';
    </script>

 

element.querySelector('선택자') : 제공한 선택자와 일치하는 element 내의 첫 번째 element를 반환
element.querySelectorAll('선택자') : 제공한 선택자와 일치하는 element 내의 모든 element들을 반환

    <div class="first">
        <div class="second">
            <ul>
                <li>test1</li>
                <li>test2</li>
                <li>test3</li>
                <li>test4</li>
            </ul>
        </div>
    </div>
    <script>
        let first = document.querySelector(".first");
        let myLi = first.querySelector(".second li:nth-child(3)");
        let myLis = first.querySelectorAll("li");
        console.log(myLi);
        console.log(myLis);
        myLi.style.color = 'red';
        myLis[0].style.backgroundColor = 'gray';
    </script>

 

closest

element.closest('선택자') : element 자기 자신을 포함하여 제공한 선택자와 일치하는 가장 가까운 조상 요소를 반환

    <div class="area">
        <ul class="korean-food">
            <li class="menu">제육볶음</li>
            <li class="menu">된장찌개</li>
            <li class="menu">김치찌개</li>
        </ul>
    </div>
    <script>
        let menu = document.querySelector('.menu');
        console.log(menu);
        console.log(menu.closest('.korean-food'));
        //null -> h3은 li의 조상 요소가 아니므로
        console.log(menu.closest('h3'));
    </script>

 

matches

element.matches('선택자') : element가 선택자와 일치하는지 여부 반환
요소가 담겨있는 배열 등을 순회해 원하는 요소만 걸러내고자 할 때 유용하게 사용할 수 있다.

    <script>
        for(let elem of document.body.children) {
            if(elem.matches('.area')){
                console.log(elem);
            }
        }
    </script>

 

getElementsByTagName(tag), getElementsByClassName(className), getElementsByName(name)

getElementsByTagName('태그명') : 주어진 태그에 해당하는 요소들의 컬렉션을 반환
getElementsByClassName('클래스명') : 주어진 클래스 속성 값에 해당하는 요소들의 컬렉션을 반환
getElementsByName('name명') : 주어진 name 속성 값에 해당하는 요소들의 컬렉션을 반환

 

- 태그명으로 접근

    <ol>
        <li><a href="#">목록 1</a></li>
        <li><a href="#">목록 2</a></li>
        <li><a href="#">목록 3</a></li>
        <li><a href="#">목록 4</a></li>
        <li><a href="#">목록 5</a></li>
    </ol>
        <button onclick="accessTagName();">태그명으로 접근</button>
    <script>
        function accessTagName(){
            let links = document.getElementsByTagName("a");
            console.log("전달 받은 a 태그의 갯수 : " + links.length);
            let changeColor = 50;
            for(let i = 0; i < links.length; i++) {
                console.log(links[i]);
                links[i].style.backgroundColor = "rgb(130,220," + changeColor + ")";
                changeColor += 50;
            }
        }
    </script>

버튼을 클릭하면 그라데이션으로 적용된 것 확인

 

- 클래스명으로 접근

    <script>
        console.log(document.getElementsByClassName("area"));
    </script>

 

- name으로 접근

    <script>
        function accessName(){
            let hobby = document.getElementsByName("hobby");
            console.log(hobby);
            let checkItem = '';
            hobby.forEach(function(item){
                console.log(item);
                if(item.checked){
                    checkItem += item.value + " 선택함\n";
                }
            });
            alert(checkItem);
        }
    </script>

체크박스 선택한 것들 alert창 출력

 

각 메소드의 반환값의 차이

    <script>
        // Element 1개
        let test1 = document.getElementById('area1');
        // Element 1개
        let test2 = document.querySelector("#area1");
        // NodeList
        let test3 = document.querySelectorAll(".area");
        // HTMLCollection
        let test4 = document.getElementsByTagName("a");
        // HTMLCollection
        let test5 = document.getElementsByClassName("area");
        // NodeList
        let test6 = document.getElementsByName("hobby");
    </script>

 

- HTMLCollection과 NodeList는 문서 내의 노드들을 가지고 있는 컬렉션이며, 유사 배열이다.
- HTMLCollection은 forEach와 같이 편리한 메소드를 제공해주지 않는다.
- 따라서 일반 for문을 사용하여 배열의 각 요소에 접근해야한다.
- NodeList는 forEach 메소드를 사용할 수 있다.
- 단, HTMLCollection과 NodeList는 유사 배열이므로 배열 메소드를 사용하기 위해서는 Array.from() 메소드를 통해 배열로 바꾼 뒤에 사용할 수 있다.

    <script>
        // HTMLCollection은 forEach 사용 불가
        // test4.forEach(item => console.log(item));
        // NodeList는 forEach 사용 가능
        test6.forEach(item => console.log(item));
        // NodeList는 유사 배열이므로 배열 메소드 사용 불가
        // console.log(test6.indexOf(test6[0]));
        // Array.from()으로 배열로 변환하면 배열 메소드 사용 가능
        console.log(Array.from(test6).indexOf(test6[4]));
    </script>