요소들이 가까이 붙어있다면 앞서 학습한 DOM 탐색 프로퍼티를 사용해 목표 요소에 쉽게 접근할 수 있다.
하지만 그렇지 않은 경우에 원하는 요소 노드에 접근하는 방법은?
1. document.getElementById 혹은 id를 사용해 요소 검색하기
요소에 id 속성이 있으면 위치에 상관없이 메서드 document.getElementById(id)를 이용해 접근할 수 있다.
<div id="elem">
<div id="elem-content">Element</div>
</div>
<script>
// 요소 얻기
let elem = document.getElementById('elem');
// 배경색 변경하기
elem.style.background = 'red';
</script>
id 속성값을 그대로 딴 전역 변수를 이용해 접근할 수도 있다.
<div id="elem">
<div id="elem-content">Element</div>
</div>
<script>
// 변수 elem은 id가 'elem'인 요소를 참조한다.
elem.style.background = 'red';
// id가 elem-content인 요소는 중간에 하이픈(-)이 있기 때문에 변수 이름으로 쓸 수 없다.
// 이럴 땐 대괄호(`[...]`)를 사용해서 window['elem-content']로 접근하면 된다.
</script>
하지만 이렇게 요소 id를 따서 자동으로 선언된 전역변수는 동일한 이름을 가진 변수가 선언되면 무용지물이 된다.
<div id="elem"></div>
<script>
let elem = 5; // elem은 더이상 <div id="elem">를 참조하지 않고 5가 된다.
alert(elem); // 5
</script>
2. querySelectorAll
elem.querySelectorAll(css)
이 메서드는 elem의 자식 요소 중 주어진 CSS 선택자에 대응하는 요소 모두를 반환한다.
<ul>
<li>1-1</li>
<li>1-2</li>
</ul>
<ul>
<li>2-1</li>
<li>2-2</li>
</ul>
<script>
let elements = document.querySelectorAll('ul > li:last-child');
for (let elem of elements) {
alert(elem.innerHTML); // "1-2", "2-2"
}
</script>
//마지막 <li>요소 모두를 반환한다.
querySelectorAll은 CSS 선택자를 활용할 수 있다는 점에서 아주 유용하다.
3. querySelector
elem.querySelector(css)는 주어진 CSS 선택자에 대응하는 요소 중 첫 번째 요소를 반환한다(elem.querySelectorAll(css)[0]과 동일)
4. matches
위의메서드들은 DOM 검색에 쓰인다.
하지만 elem.matches(css)는 DOM을 검색하는 일이 아닌 요소 elem이 주어진 css 선택자와 일치하는지 여부를 판단해준다.
요소가 담겨있는 배열 등을 순회해 원하는 요소만 걸러내고자 할 때 유용하다.
<a href="http://example.com/file.zip">...</a>
<a href="http://ya.ru">...</a>
<script>
for (let elem of document.body.children) {
if (elem.matches('a[href$="zip"]')) {
alert("주어진 CSS 선택자와 일치하는 요소: " + elem.href );
}
}
</script>
5. closet
부모 요소, 부모 요소의 부모 요소 등 DOM 트리에서 특정 요소의 상위에 있는 요소들은 조상(ancestor) 요소라고 한다.
메서드 elem.closest(css)는 elem 자기 자신을 포함하여 CSS 선택자와 일치하는 가장 가까운 조상 요소를 찾을 수 있게 도와준다.closest메서드는 해당 요소부터 시작해 DOM 트리를 한 단계씩 거슬러 올라가면서 원하는 요소를 찾는데, CSS 선택자와 일치하는 요소를 찾으면, 검색을 중단하고 해당 요소를 반환한다.
<h1>목차</h1>
<div class="contents">
<ul class="book">
<li class="chapter">1장</li>
<li class="chapter">2장</li>
</ul>
</div>
<script>
let chapter = document.querySelector('.chapter'); // LI
alert(chapter.closest('.book')); // UL
alert(chapter.closest('.contents')); // DIV
alert(chapter.closest('h1')); // null(h1은 li의 조상 요소가 아님)
</script>
'Front-end > JavaScript' 카테고리의 다른 글
[JavaScript] 속성과 프로퍼티 (0) | 2022.06.19 |
---|---|
[JavaScript] 주요 노드 프로퍼티 (0) | 2022.06.19 |
[JavaScript] DOM트리 (0) | 2022.06.18 |
[JavaScript] 브라우저 환경과 다양한 명세서 (DOM과 BOM) (0) | 2022.06.18 |
[JavaScript] async 이터레이터와 제너레이터 (0) | 2022.05.31 |