트리 탐색(tree traversing)
트리 탐색(tree traversing)이란 특정 요소로부터 다른 요소들과의 관계를 통해 선택하길 원하는 요소까지 DOM 트리를 검색해 나아가는 과정을 의미합니다.
이러한 트리 탐색은 다음과 같이 세 영역으로 나눌 수 있습니다.
1. 조상(ancestor) 요소 탐색
2. 형제(sibling) 요소 탐색
3. 자손(descendant) 요소 탐색
조상(ancestor) 요소의 탐색
DOM 트리에서 특정 요소의 부모(parent) 요소를 포함한 상위의 요소를 탐색하기 위한 메소드는 다음과 같습니다.
1. .parent()
2. .parents()
3. .parentsUntil()
4. .closest()
.parent() 메소드
.parent() 메소드는 선택한 요소의 부모(parent) 요소를 선택합니다.
이때 선택자를 인수로 전달하여, 전달받은 선택자에 해당하는 부모 요소만을 선택할 수도 있습니다.
예제
$(function() {
$("button").on("click", function() {
$("p").parent() // <p>요소의 부모 요소를 선택함.
.css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
.css() 메소드는 선택한 요소에 인수로 전달받은 스타일을 설정합니다.
.parents() 메소드
.parents() 메소드는 선택한 요소의 조상(ancestor) 요소를 모두 선택합니다.
이때 선택자를 인수로 전달하여, 전달받은 선택자에 해당하는 조상 요소만을 선택할 수도 있습니다.
예제
$(function() {
$("button").on("click", function() {
$("p").parents("div") // <p>요소의 조상 요소 중에서 <div>요소를 모두 선택함.
.css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
.parentsUntil() 메소드
.parentsUntil() 메소드는 선택한 요소의 조상 요소 중에서 전달받은 선택자에 해당하는 요소 바로 이전까지의 요소만을 모두 선택합니다.
이때 선택자를 인수로 전달하지 않으면, .parent() 메소드와 같이 선택한 요소의 조상 요소를 모두 선택합니다.
예제
$(function() {
$("button").on("click", function() {
// <p>요소의 조상 요소 중에서 첫 번째 <div>요소의 바로 이전까지의 요소를 모두 선택함.
$("p").parentsUntil("div")
.css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
.closest() 메소드는 자신을 포함한 조상 요소 중에서 전달받은 선택자에 해당하는 요소의 집합에서 가장 첫 번째 요소를 선택합니다.
이 메소드가 요소의 집합을 구하는 방식은 .parents() 메소드와 비슷하지만, 해당 요소의 조상 요소뿐만 아니라 해당 요소 자신까지도 검사하는 점이 다릅니다.
예제
$(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"});
});
});
형제(sibling) 요소의 탐색
DOM 트리에서 특정 요소의 형제(sibling) 요소를 탐색하기 위한 메소드는 다음과 같습니다.
1. .siblings()
2. .next()
3. .nextAll()
4. .nextUntil()
5. .prev()
6. .prevAll()
7. .prevUntil()
.siblings() 메소드
.siblings() 메소드는 선택한 요소의 형제(sibling) 요소 중에서 지정한 선택자에 해당하는 요소를 모두 선택합니다.
예제
$(function() {
$("button").on("click", function() {
$("h4").siblings() // <h4>요소의 형제 요소를 모두 선택함.
.css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
.next() 메소드
.next() 메소드는 선택한 요소의 바로 다음에 위치한 형제 요소를 선택합니다.
예제
$(function() {
$("button").on("click", function() {
$("h4").next() // <h4>요소의 바로 다음 형제 요소를 선택함.
.css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함.
}); });
.nextAll() 메소드
.nextAll() 메소드는 선택한 요소의 다음에 위치한 형제 요소를 모두 선택합니다.
이때 선택자를 인수로 전달하여, 전달받은 선택자에 해당하는 형제 요소만을 선택할 수도 있습니다.
예제
$(function() {
$("button").on("click", function() {
$("h4").nextAll() // <h4>요소의 다음에 있는 형제 요소를 모두 선택함.
.css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
.nextUntil() 메소드
.nextUntil() 메소드는 선택한 요소의 형제 요소 중에서 전달받은 선택자에 해당하는 요소 바로 이전까지의 요소만을 모두 선택합니다.
이때 선택자를 인수로 전달하지 않으면, .nextAll() 메소드와 같이 선택한 요소의 다음에 위치한 형제 요소를 모두 선택합니다.
예제
$(function() {
$("button").on("click", function() {
// <h4>요소의 형제 요소 중에서 첫 번째 <p>요소의 바로 이전까지의 모든 요소를 선택함.
$("h4").nextUntil("p")
.css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
.prev(), .prevAll(), .prevUntil() 메소드
이 메소드들은 각각 .next(), .nextAll(), .nextUntil() 메소드와 정반대로 동작하여 요소들을 선택해 줍니다.
자손(descendant) 요소의 탐색
DOM 트리에서 특정 요소의 자손(descendant) 요소를 탐색하기 위한 메소드는 다음과 같습니다.
1. .children()
2. .find()
.children() 메소드
.children() 메소드는 선택한 요소의 자식(child) 요소를 모두 선택합니다.
이때 선택자를 인수로 전달하여, 전달받은 선택자에 해당하는 자식 요소만을 선택할 수도 있습니다.
예제
$(function() {
$("button").on("click", function() {
$("ul").children() // <ul>요소의 자식 요소를 모두 선택함.
.css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
.find() 메소드
.find() 메소드는 선택한 요소의 자손(descendant) 요소 중에서 전달받은 선택자에 해당하는 자손 요소를 모두 선택합니다.
이때 별표("*")를 인수로 전달하여, 선택한 요소의 자손 요소를 모두 선택할 수도 있습니다.
예제
$(function() {
$("button").on("click", function() {
$("li").find("*") // 각 <li>요소의 자손 요소을 모두 선택함.
.css({"border": "2px solid red"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
기타 탐색 메소드
DOM 트리에서 요소의 탐색을 위해 사용되는 기타 메소드는 다음과 같습니다.
1. .add()
2. .each()
3. .end()
4. .offsetParent()
5. .contents()
.add() 메소드
.add() 메소드는 선택한 요소의 집합에 전달받은 요소를 추가합니다.
예제
$(function() {
$("button").on("click", function() {
$("li").add("p") // 선택한 <li>요소의 집합에 <p>요소를 추가함.
.css({"border": "2px solid green"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
다음 예제는 앞서 살펴본 .append() 메소드의 예제입니다.
예제
$(function() {
$("button").on("click", function() {
$("#list").append("<li>새로 추가된 아이템이에요!</li>");
});
});
위의 예제에서 알 수 있듯이 .add() 메소드는 선택한 '요소의 집합'에 인수로 전달받은 요소를 추가하는 메소드입니다.
하지반 .append() 메소드는 선택한 '요소'의 마지막에 새로운 요소나 콘텐츠를 추가하는 메소드입니다.
.each() 메소드
.each() 메소드는 선택한 요소 집합의 요소마다 전달받은 콜백 함수를 실행합니다.
예제
$(function() {
$("button").on("click", function() {
$("li").each(function() { // 선택한 <li>요소 집합의 각 <li>요소를 선택함.
$(this).toggleClass("boldFont"); // 각 <li>요소마다 클래스를 추가하거나 제거함.
});
});
});
위의 예제는 선택한 <li>요소 집합의 각 <li>요소에 .each() 메소드를 사용하여 클래스를 추가하거나 제거하는 예제입니다.
이처럼 .each() 메소드를 사용하면, 선택한 요소 집합의 각 요소마다 콜백 함수를 따로 실행시킬 수 있습니다.
.end() 메소드
.end() 메소드는 마지막으로 실행한 메소드의 실행 전 상태로 선택한 요소의 집합을 복원해 줍니다.
예제
$(function() {
$("button").on("click", function() {
$("#divBox") // id가 "divBox"인 요소의
.find("p") // 자손 요소 중에서 <p>요소를 모두 선택하고,
.end() // 선택된 요소의 집합을 find() 메소드의 실행 전으로 복원함.
.css("border", "2px solid green"); // 따라서 id가 "divBox"인 요소의 CSS 스타일을 설정함.
});
});
위의 예제에서 만약 .end() 메소드가 없다면, 아이디가 "divBox"인 요소의 자손 요소 중에서 모든 <p>요소에 스타일을 설정하게 될 것입니다.
.offsetParent() 메소드
.offsetParent() 메소드는 선택한 요소를 위치시킬 때 기준으로 사용된 조상 요소를 선택할 수 있습니다.
예제
$(function() {
$("button").on("click", function() {
// id가 "para"인 요소가 위치할 때 기준이 된 조상 요소를 선택함.
$("#para").offsetParent()
.css("border", "1px solid red"); // 해당 요소의 CSS 스타일을 변경함.
});
});
위의 예제에서 아이디가 "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>요소의 배경색만이 변경될 것입니다.
이처럼 제이쿼리의 .contents() 메소드를 사용하면, <iframe>요소의 내용에도 직접 접근할 수 있습니다.
필터링(filtering) 메소드
DOM 트리에서 선택한 요소를 필터링하기 위한 메소드는 다음과 같습니다.
1. .first()
2. .last()
3. .eq()
4. .filter()
5. .not()
.first() 메소드와 last() 메소드
.first() 메소드는 선택한 요소 중에서 첫 번째 요소를 선택하고, .last() 메소드는 마지막 요소를 선택합니다.
예제
$(function() {
$("#firstBtn").on("click", function() {
$("li").first() // 선택한 <li>요소 중에서 첫 번째 요소만을 선택함.
.css({"border": "2px solid green"}); // 해당 요소의 CSS 스타일을 변경함.
});
$("#lastBtn").on("click", function() {
$("li").last() // 선택한 <li>요소 중에서 마지막 요소만을 선택함.
.css({"border": "2px solid orange"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
.eq() 메소드
.eq() 메소드는 선택한 요소 중에서 전달받은 인덱스에 해당하는 요소를 선택합니다.
이때 선택한 요소 집합의 맨 처음 요소를 인덱스 0으로 놓고, 앞에서부터 검색합니다.
예제
$(function() {
$("#clockwiseBtn").on("click", function() {
$("li").eq(1) // 선택한 <li>요소 중에서 두 번째 요소만을 선택함.
.css({"border": "2px solid green"}); // 해당 요소의 CSS 스타일을 변경함.
});
$("#counterBtn").on("click", function() {
$("li").eq(-1) // 선택한 <li>요소 중에서 뒤에서부터 첫 번째 요소만을 선택함.
.css({"border": "2px solid orange"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
위의 예제처럼 .eq() 메소드는 음의 정수도 인수로 전달받을 수 있습니다.
이때는 선택한 요소 집합의 맨 마지막 요소를 인덱스 -1로 놓고, 뒤에서부터 검색합니다.
.filter() 메소드
.filter() 메소드는 선택한 요소 중에서 전달받은 선택자에 해당하거나, 함수 호출의 결과가 참(true)인 요소를 모두 선택합니다.
이 메소드는 인수로 선택자나 제이쿼리 객체, HTML DOM 요소 등을 전달받을 수 있습니다.
또한, 요소 집합의 각 요소를 검사할 수 있는 함수를 전달할 수도 있습니다.
예제
$(function() {
$("button").on("click", function() {
$("li").filter(":odd") // 선택한 <li>요소 중에서 인덱스가 홀수인 요소만을 선택함.
.css({"border": "2px solid green"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
:odd 선택자는 인덱스가 홀수인 요소를 모두 선택하는 선택자입니다.
하지만 위의 예제에서 :odd 선택자는 두 번째와 네 번째 요소를 선택해 줍니다.
이것은 제이쿼리의 인덱스가 언제나 0부터 시작하기 때문입니다.
따라서 :odd나 :even 선택자를 사용할 때는 언제나 인덱스가 0부터 시작한다는 사실을 염두에 두고 사용해야 합니다.
.not() 메소드
.not() 메소드는 선택한 요소 중에서 전달받은 선택자에 해당하거나, 함수 호출의 결과가 참(true)인 요소를 제외한 나머지 요소를 모두 선택합니다.
즉, .filter() 메소드와는 정반대로 동작하여 요소를 선택합니다.
예제
$(function() {
$("button").on("click", function() {
// 선택한 <li>요소 중에서 인덱스가 2보다 작지 않은 요소만을 선택함.
$("li").not(":lt(2)")
.css({"border": "2px solid green"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
위의 예제에서 .not() 메소드에 인수로 전달된 식별자는 '인덱스가 2보다 작은'이라는 의미를 가지는 식별자입니다.
따라서 .not() 메소드는 인덱스가 2보다 작지 않은, 즉 인덱스가 2인 요소와 2보다 큰 요소를 모두 선택해 줍니다.
.has() 메소드
.has() 메소드는 선택한 요소 중에서 전달받은 선택자에 해당하는 요소를 자손 요소로 가지고 있는 요소를 모두 선택합니다.
다음 예제는 선택한 <li>요소 중에서 자손 요소로 <span>요소를 가지고 있는 요소만의 스타일을 변경하는 예제입니다.
예제
$(function() {
$("button").on("click", function() {
// 선택한 <li>요소 중에서 자손 요소로 <span>요소를 가지고 있는 요소만을 선택함.
$("li").has("span")
.css({"border": "2px solid green"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
.is() 메소드
.is() 메소드는 선택한 요소 중에서 전달받은 선택자에 해당하는 요소가 하나라도 존재하면 참을 반환합니다.
예제
$(function() {
$("button").on("click", function() {
// 선택한 <span>요소의 조상 요소 중에서 <ul>요소가 하나라도 존재하면 true를 반환함.
if ($("span").parents().is("ul")) {
$("#text").html("span 요소의 조상 요소에는 ul 요소도 존재합니다.");
}
});
});
위의 예제에서는 우선 선택한 <span>요소의 모든 조상 요소를 다시 선택합니다.
그리고서 선택된 모든 조상 요소 중에 <ul>요소가 존재하는지 여부를 .is() 메소드를 통해 검사하고 있습니다.
.map() 메소드
.map() 메소드는 선택한 요소 집합의 각 요소마다 지정된 콜백 함수를 실행하고, 그 반환값으로 구성된 제이쿼리 객체를 반환합니다.
예제
$(function() {
$("button").on("click", function() {
// 선택한 <li>요소마다 콜백함수를 실행하여 각 <li>요소의 id 값을 반환함.
var ids = $("li").map(function() {
return this.id;
})
.get() // 반환된 모든 id 값을 하나의 배열로 반환함.
.join(); // 배열의 모든 요소를 쉼표(,)로 구분하는 하나의 문자열로 반환함.
$("#text").html(ids);
});
});
위의 예제는 선택한 <li>요소 집합의 각 요소마다 해당 요소의 id 값을 반환하는 콜백함수를 실행합니다.
콜백함수의 실행으로 반환되는 값들은 .get() 메소드를 통해 하나의 배열로 반환되며, 다시 .join() 메소드를 통해 하나의 문자열로 변환되어 반환됩니다.
.slice() 메소드
.slice() 메소드는 선택한 요소 중에서 전달받은 인덱스 범위에 해당하는 요소만을 선택합니다.
다음 예제는 선택한 <li>요소 중에서 인덱스가 1과 같거나 그 이상인 요소만의 스타일을 변경하는 예제입니다.
예제
$(function() {
$("button").on("click", function() {
// 선택한 <li>요소 중에서 인덱스가 1과 같거나 그 이상인 요소만을 선택함.
$("li").slice(1)
.css({"border": "2px solid green"}); // 해당 요소의 CSS 스타일을 변경함.
});
});
'jQuery' 카테고리의 다른 글
jQuery 스타일설정 (0) | 2020.07.03 |
---|---|
jQuery 요소의영역 (0) | 2020.07.03 |
jQuery 요소의조작 (0) | 2020.07.03 |
jQuery 요소의선택 (0) | 2020.07.03 |
jQuery 기본 (0) | 2020.07.03 |
댓글