조상 요소의 탐색 / 형제 요소의 탐색 / 자손 요소의 탐색
트리 탐색(tree traversing)
트리 탐색(tree traversing)이란 특정 요소로부터 다른 요소들과의 관계를 통해 선택하길 원하는 요소까지 DOM 트리를 검색해 나아가는 과정을 의미한다.
이러한 트리 탐색은 다음과 같이 세 영역으로 나눌 수 있다.
조상(ancestor) 요소의 탐색
DOM 트리에서 특정 요소의 부모(parent) 요소를 포함한 상위의 요소를 탐색하기 위한 메소드는 다음과 같다.
.parent( ) 메소드
.parent( ) 메소드는 선택한 요소의 부모(parent) 요소를 선택한다.
이때 선택자를 인수로 전달하여, 전달받은 선택자에 해당하는 부모 요소만을 선택할 수 도 있다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>jQuery Element Traversing</title> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <style> .container * { display: block; border: 1px solid lightgray; padding: 5px; margin: 15px; } </style> <script> $(function() { $("button").on("click", function() { $("p").parent() // <p>요소의 부모 요소를 선택함. .css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함. }); }); </script> </head> <body> <h1>.parent() 메소드</h1> <div class="container"> <div>div 요소 <ul>ul 요소 <li>li 요소</li> <li>li 요소 <p>p 요소 (기준) <span>span 요소</span> </p> </li> <li>li 요소</li> </ul> </div> </div> <button>p 요소의 부모 요소</button> </body> </html> | cs |
실행결과 :
p 요소 (기준) span 요소
Tip : .css( ) 메소드는 선택한 요소에 인수로 전달받은 스타일을 설정한다.
.parents( ) 메소드
.parents( ) 메소드는 선택한 요소의 조상(ancestor) 요소를 모두 선택한다.
이때 선택자를 인수로 전달하여, 전달받은 선택자에 해당하는 조상 요소만을 선택할 수도 있다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>jQuery Element Traversing</title> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <style> .container * { display: block; border: 1px solid lightgray; padding: 5px; margin: 15px; } </style> <script> $(function() { $("button").on("click", function() { $("p").parents("div") // <p>요소의 조상 요소 중에서 <div>요소를 모두 선택함. .css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함. }); }); </script> </head> <body> <h1>.parents() 메소드</h1> <div class="container"> <div>div 요소 <div>div 요소 <ul>ul 요소 <li>li 요소</li> <li>li 요소 <p>p 요소 (기준) <span>span 요소</span> </p> </li> <li>li 요소</li> </ul> </div> </div> </div> <button>p 요소의 조상 요소</button> </body> </html> | cs |
실행결과 :
p 요소 (기준) span 요소
.parentsUntil( ) 메소드
.parentsUntil( ) 메소드는 선택한 요소의 조상 요소 중에서 전달받은 선택자에 해당하는 요소 바로 이전까지의 요소만을 모두 선택한다.
이때 선택자를 인수로 전달하지 않으면, .parent( ) 메소드와 같이 선택한 요소의 조상 요소를 모두 선택한다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>jQuery Element Traversing</title> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <style> .container * { display: block; border: 1px solid lightgray; padding: 5px; margin: 15px; } </style> <script> $(function() { $("button").on("click", function() { // <p>요소의 조상 요소 중에서 첫 번째 <div>요소의 바로 이전까지의 요소를 모두 선택함. $("p").parentsUntil("div") .css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함. }); }); </script> </head> <body> <h1>.parentsUntil() 메소드</h1> <div class="container"> <div>div 요소 <ul>ul 요소 <li>li 요소</li> <li>li 요소 <p>p 요소 (기준) <span>span 요소</span> </p> </li> <li>li 요소</li> </ul> </div> </div> <button>p 요소의 조상 요소</button> </body> </html> | cs |
실행결과 :
p 요소 (기준) span 요소
.closest( ) 메소드
이 메소드가 요소의 집합을 구하는 방식은 .parents( ) 메소드와 비슷하지만, 해당 요소의 조상 요소뿐만 아니라 해당 요소 자신까지도 검사하는 점이 다르다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>jQuery Element Traversing</title> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <style> .container * { display: block; border: 1px solid lightgray; padding: 5px; margin: 15px; } </style> <script> $(function() { $("#parents").on("click", function() { // 아이디가 "origin"인 요소의 조상 요소 중에서 <div>요소를 모두 선택함. $("#origin").parents("div") .css({"border": "2px solid red"}); }); $("#closest").on("click", function() { // 아이디가 "origin"인 요소 자신과 조상 요소 중에서 첫 번째 <div>요소를 선택함. $("#origin").closest("div") .css({"border": "2px solid green"}); }); }); </script> </head> <body> <h1>.parents() 메소드</h1> <div class="container"> <div>div 요소 <div>div 요소 <ul>ul 요소 <li>li 요소</li> <li>li 요소 <div id="origin">div 요소 (기준) <span>span 요소</span> </div> </li> <li>li 요소</li> </ul> </div> </div> </div> <button id="parents">parents() 메소드</button> <button id="closest">closest() 메소드</button> </body> </html> | cs |
실행결과 :
조상 요소를 탐색하는 메소드
메소드 |
설명 |
.parent( ) |
선택한 요소의 부모(parent) 요소를 선택함. |
.parents( ) | 선택한 요소의 조상(ancestor) 요소를 모두 선택함. |
.parentsUntil( ) | 선택한 요소의 조상 요소 중에서 지정한 선택자에 해당하는 요소 바로 이전까지의 요소를 모두 선택함. |
형제(sibling) 요소의 탐색
.siblings( ) 메소드
.siblings( ) 메소드는 선택한 요소의 형제(sibling) 요소 중에서 지정한 선택자에 해당하는 요소를 모두 선택한다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>jQuery Sibling Element Traversing</title> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <style> .container * { display: block; border: 1px solid lightgray; padding: 5px; margin: 15px; } </style> <script> $(function() { $("button").on("click", function() { $("h4").siblings() // <h4>요소의 형제 요소를 모두 선택함. .css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함. }); }); </script> </head> <body> <h1>.siblings() 메소드</h1> <div class="container"> <div>div 요소</div> <h2>h2 요소</h2> <h3>h3 요소</h3> <h4>h4 요소 (기준)</h4> <h5>h5 요소</h5> <h6>h6 요소</h6> <p>p 요소</p> </div> <button>h4 요소의 형제 요소</button> </body> </html> | cs |
실행결과 :
p 요소
.next( ) 메소드
.next( ) 메소드는 선택한 요소의 바로 다음에 위치한 형제 요소를 선택한다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>jQuery Sibling Element Traversing</title> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <style> .container * { display: block; border: 1px solid lightgray; padding: 5px; margin: 15px; } </style> <script> $(function() { $("button").on("click", function() { $("h4").next() // <h4>요소의 바로 다음 형제 요소를 선택함. .css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함. }); }); </script> </head> <body> <h1>.next() 메소드</h1> <div class="container"> <div>div 요소</div> <h2>h2 요소</h2> <h3>h3 요소</h3> <h4>h4 요소 (기준)</h4> <h5>h5 요소</h5> <h6>h6 요소</h6> <p>p 요소</p> </div> <button>h4 요소의 형제 요소</button> </body> </html> | cs |
실행결과 :
p 요소
.nextAll( ) 메소드
이때 선택자를 인수로 전달하여, 전달받은 선택자에 해당하는 형제 요소만을 선택할 수도 있다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>jQuery Sibling Element Traversing</title> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <style> .container * { display: block; border: 1px solid lightgray; padding: 5px; margin: 15px; } </style> <script> $(function() { $("button").on("click", function() { $("h4").nextAll() // <h4> 요소의 다음에 있는 형제 요소를 모두 선택함. .css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함. }); }); </script> </head> <body> <h1>.nextAll() 메소드</h1> <div class="container"> <div>div 요소</div> <h2>h2 요소</h2> <h3>h3 요소</h3> <h4>h4 요소 (기준)</h4> <h5>h5 요소</h5> <h6>h6 요소</h6> <p>p 요소</p> </div> <button>h4 요소의 형제 요소</button> </body> </html> | cs |
실행결과 :
p 요소
.prev( ), .prevAll( ), .prevUntil( ) 메소드
이 메소드들은 각각 .next( ), nextAll( ), .nextUntil( ) 메소드와 정반대로 동작하여 요소들을 선택해 준다.
형제 요소를 탐색하는 메소드
메소드 |
설명 |
.siblings( ) |
선택한 요소의 형제(sibling) 요소 중에서 지정한 선택자에 해당하는 요소를 모두 선택함. |
.next( ) | 선택한 요소의 바로 다음에 위치한 형제 요소를 선택함. |
.nextAll( ) | 선택한 요소의 다음에 위치한 형제 요소를 모두 선택함. |
.nextUtil( ) | 선택한 요소의 형제 요소 중에서 지정한 선택자에 해당하는 요소 바로 이전까지의 요소를 모두 선택함. |
.prev( ) | 선택한 요소의 바로 이전에 위치한 형제 요소를 선택함. |
.prevAll( ) | 선택한 요소의 이전에 위치한 형제 요소를 모두 선택함. |
prevUntil( ) | 선택한 요소의 형제 요소 중에서 지정한 선택자에 해당하는 요소 바로 다음까지의 요소를 모두 선택함. |
자손(descendant) 요소의 탐색
DOM 트리에서 특정 요소의 자손(descendant) 요소를 탐색하기 위한 메소드는 다음과 같다.
.children( ) 메소드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>jQuery Descendant Element Traversing</title> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <style> .container * { display: block; border: 1px solid lightgray; padding: 5px; margin: 15px; } </style> <script> $(function() { $("button").on("click", function() { $("ul").children() // <p>요소의 자식 요소를 모두 선택함. .css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함. }); }); </script> </head> <body> <h1>.children() 메소드</h1> <div class="container"> <div>div 요소 <ul>ul 요소 (기준) <li>li 요소</li> <li>li 요소 <p>p 요소 <span>span 요소</span> </p> </li> <li>li 요소 <p>p 요소</p> </li> </ul> </div> </div> <button>ul 요소의 자식 요소</button> </body> </html> | cs |
실행결과 :
p 요소 span 요소
p 요소
.find( ) 메소드
.find( ) 메소드는 선택한 요소의 자손(descendant) 요소 중에서 전달받은 선택자에 해당하는 자손 요소를 모두 선택한다.
이때 별표("*")를 인수로 전달하여, 선택한 요소의 자손 요소를 모두 선택할 수도 있다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>jQuery Descendant Element Traversing</title> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <style> .container * { display: block; border: 1px solid lightgray; padding: 5px; margin: 15px; } </style> <script> $(function() { $("button").on("click", function() { $("li").find("*") // 각 <li>요소의 자손 요소을 모두 선택함. .css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함. }); }); </script> </head> <body> <h1>.find() 메소드</h1> <div class="container"> <div>div 요소 <ul>ul 요소 (기준) <li>li 요소</li> <li>li 요소 <p>p 요소 <span>span 요소</span> </p> </li> <li>li 요소 <p>p 요소</p> </li> </ul> </div> </div> <button>ul 요소의 자손 요소</button> </body> </html> | cs |
실행결과 :
p 요소 span 요소
p 요소
자손 요소를 탐색하는 메소드
메소드 |
설명 |
.children( ) |
선택한 요소의 자식(child) 요소를 모두 선택함. |
.find( ) | 선택한 요소의 자손(descendant) 요소 중에서 전달받은 선택자에 해당하는 요소를 모두 선택함. |
기타 탐색 메소드
DOM 트리에서 요소의 탐색을 위해 사용되는 기타 메소드는 다음과 같다.
.add( ) 메소드
.add( ) 메소드는 선택한 요소의 집합에 전달받은 요소를 추가한다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>jQuery Etc Traversing</title> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <script> $(function() { $("button").on("click", function() { $("li").add("p") // 선택한 <li>요소의 집합에 <p>요소를 추가함. .css({"border": "2px solid green"}); // 해당 요소의 CSS 스타일을 변경함. }); }); </script> </head> <body> <h1>.add() 메소드</h1> <ul> <li>첫 번째 아이템이에요!</li> <li>두 번째 아이템이에요!</li> <li>세 번째 아이템이에요!</li> </ul> <p>첫 번째 단락이에요!</p> <button>li 요소 집합에 p 요소를 추가</button> </body> </html> | cs |
실행결과 :
첫 번째 단락이에요!
다음 예제는 앞서 살펴본 .append( ) 메소드의 예제이다.
예제
$(function() {
$("button").on("click", function() {
$("#list").append("<li>새로 추가된 아이템이에요!</li>");
});
});
위의 예제에서 알 수 있듯이 .add( ) 메소드는 선택한 '요소의 집합'에 인수로 전달받은 요소를 추가하는 메소드 이다.
하지만 .append( ) 메소드는 선택한 '요소'의 마지막에 새로운 요소나 콘텐츠를 추가하는 메소드이다.
.each( ) 메소드
.each( ) 메소드는 선택한 요소 집합의 요소마다 전달받은 콜백 함수를 실행한다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>jQuery Etc Traversing</title> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <style> .boldFont { color: green; font-weight: bold; } </style> <script> $(function() { $("button").on("click", function() { $("li").each(function() { // 선택한 <li>요소 집합의 각 <li>요소를 선택함. $(this).toggleClass("boldFont"); // 각 <li>요소마다 클래스를 추가하거나 제거함. }); }); }); </script> </head> <body> <h1>.each() 메소드</h1> <ul> <li>첫 번째 아이템이에요!</li> <li>두 번째 아이템이에요!</li> <li>세 번째 아이템이에요!</li> </ul> <button>클래스 추가 및 제거</button> </body> </html> | cs |
실행결과 :
위의 예제는 선택한 <li> 요소 집합의 각<li> 요소에 .each( ) 메소드를 사용하여 클래스를 추가하거나 제거하는 예제이다.
이처럼 .each( ) 메소드를 사용하면, 선택한 요소 집합의 각 요소마다 콜백 함수를 따로 실행시킬 수 있다.
.end( ) 메소드
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>jQuery Etc Traversing</title> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <style> .container * { display: block; border: 1px solid lightgray; padding: 5px; margin: 15px; } </style> <script> $(function() { $("button").on("click", function() { $("#divBox") // id가 "divBox"인 요소의 .find("p") // 자손 요소 중에서 <p>요소를 모두 선택하고, .end() // 선택된 요소의 집합을 find() 메소드의 실행 전으로 복원함. .css("border", "2px solid green"); // 따라서 id가 "divBox"인 요소의 CSS 스타일을 설정함. }); }); </script> </head> <body> <h1>.end() 메소드</h1> <div class="container"> <div id="divBox">div 요소 <p>p 요소</p> </div> </div> <button>div 요소 선택</button> </body> </html> | cs |
실행결과 :
p 요소
위의 예제에서 만약 .end( ) 메소드가 없다면, 아이디가 "divBox"인 요소의 자손 요소 중에서 모든 <p> 요소에 스타일을 설정하게 될 것이다.
.offsetParent( ) 메소드
.offsetParent( ) 메소드는 선택한 요소를 위치시킬 때 기준으로 사용된 조상 요소를 선택할 수 있다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>jQuery Element Position</title> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <style> .container * { display: block; border: 1px solid lightgray; padding: 5px; margin: 15px; } </style> <script> $(function() { $("button").on("click", function() { // id가 "para"인 요소가 위치할 때 기준이 된 조상 요소를 선택함. $("#para").offsetParent() .css("border", "2px solid red"); // 해당 요소의 CSS 스타일을 변경함. }); }); </script> </head> <body> <h1>.offsetParent() 메소드</h1> <div class="container"> <div>div 요소 <ul style="position: relative">ul 요소 <li>li 요소</li> <li>li 요소 <p id="para">p 요소 (기준) <span>span 요소</span> </p> </li> <li>li 요소</li> </ul> </div> </div> <button>요소의 위치 정보</button> </body> </html> | cs |
실행결과 :
p 요소 (기준) span 요소
위의 예제에서 아이디가 "para"인 요소를 웹 페이지에 위치시킬 때 기준이 되는 부모 요소는 position 속성값이 relative로 설정된 <ul>요소 이다.
이렇게 정적 위치(static position) 지정 방식을 제외한 다른 방식(relative, fixed, absolute)으로 위치가 설정된 요소가 위치를 정할 때 기준이 될 수있다.
만약 위와 같은 위치가 설정된 요소가 존재하지 않으면, <html> 요소를 기준으로 삼게 된다.
.contents( ) 메소드
.contents( ) 메소드는 선택한 요소의 자식(child) 요소를 텍스트 노드와 주석 노드까지 모두 포함하여 선택해 준다.
예제
$(function() {
$("button").on("click", function() {
$("iframe") // <iframe>요소의
.contents() // 자식 요소를 모두 선택한 후,
.find("a") // 그 중에서 <a>요소를 모두 선택하고,
.css("backgroundColor", "aqua"); // 선택된 모든 <a>요소의 CSS 스타일을 설정함.
});
});
위의 예제는 <iframe> 요소의 모든 자식 요소를 선택한 후, 그 중에서 <a> 요소만의 CSS 스타일을 변경하는 예제이다.
버튼을 누르면, <iframe>요소에 로드된 모든 자식 요소 중 <a> 요소의 배경색만이 변경될 것이다.
이처럼 제이쿼리의 .cnontents( ) 메소드를 사용하면, <iframe> 요소의 내용에도 직접 접근할 수 있다.
기타 탐색 메소드
메소드 |
설명 |
.add( ) |
선택한 요소의 집합에 전달받은 요소를 추가함. |
.addBack( ) | 선택한 요소의 집합에 바로 전에 선택했던 요소를 추가함. |
.each( ) | 선택한 요소 집합의 요소마다 전달받은 콜백 함수를 실행함. |
.end( ) | 마지막으로 실행한 메소드의 실행 전 상태로 선택한 요소의 집합을 복원함. |
.offsetParent( ) | 선택한 요소를 위치시킬 때 기준이 되었던 조상 요소를 선택함. |
contents( ) | 선택한 요소의 자식(child) 요소를 모두 선택함. (텍스트 노드와 주석 노드까지 모두 포함) |
요소의 영역(크기/위치) (0) | 2018.10.24 |
---|---|
필터링 메소드 (0) | 2018.10.24 |
요소의 추가 / 복사 및 삭제 (0) | 2018.10.24 |
요소의 선택 (CSS/제이쿼리 선택자) (0) | 2018.10.23 |
jQuery 로드 / 문법 (0) | 2018.10.23 |