jQuery 선택자(자식, 부모, 형제)
jQuery 선택자(자식, 부모, 형제)
jQuery의 자식 노드 선택하기
자식 노드란 특정 노드의 바로 아래에 위치하고 있는 노드를 말합니다. 하위 노드의 하위 노드는 자식 노드가 아닌 자손 노드라고 할 수 있습니다. 아래 예제를 보면 아이디 sample 의 자식 노드는 header, content, footer이 됩니다. header, content, footer 안에 자식 들은 sample의 자식이라고 할 수 없으며, 자손 노드라고 할 수 있습니다.
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 | <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> </head> <script> $(document).ready(function() { }); </script> <body> <div id="page"/> <div id="header"> <h1>header 영역</h1> </div> <div id="content"> <h1>content 영역</h1> <ul> <li> ktko1 </li> <li> ktko2 </li> <li> ktko3 </li> <li> ktko4 </li> </ul> </div> <div id="footer"> <h1>footer 영역</h1> </div> </div> </body> </html> |
자식 노드를 찾는 방법은 children() 메서드를 사용하며 children()으로 여러 자식들을 선택할 수 있습니다.
모든 자식 노드 찾기 : children()
특정 자식 노드만 찾기 : children("선택자")
첫 번째 자식 노드 찾기 : children().first()
마지막 자식 노드 찾기 : children.last()
n번째 자식 노드 찾기 : children.eq(index)
모든 자식 노드 찾기 : children()
특정 노드의 바로 하위에 위치한 모든 자식 노드를 찾고 싶을 때 children() 메서드를 사용합니다.
children() 메서드는 모든 자손 노드가 아니라 바로 하위에 위치하는 자식 노드만을 구하는데 사용합니다. 예를 들어 page의 자식 노드를 구한다면 결과는 header, content, footer이 나옵니다.
1 | $("#page").children() |
특정 자식 노드만 찾기 : children("선택자")
children("선택자) 메서드를 사용하면 특정 자식 노드만을 찾을 수 있습니다.
예를 들어 page의 바로 하위자식 노드 중 test1 클래스가 적용된 노드를 찾아 css를 변경하려면 아래와 같습니다.
1 | $("#page").children(".test").css("border", "4px solid"); |
첫 번째 자식 노드 찾기
children().first()
children().eq(0)
children()(":first")
children()(":eq(0")
첫 번째 자식 노드를 찾는 방법은 위와 같이 4가지 방법이 있습니다. 예제는 생략하겠습니다.
마지막 노드 찾기
children().last()
children(":last")
children().eq($대상.children().length-1)
children(":eq("+$대상.children().length-1+")")
children().eq(-1)
children(":eq(-1)")
마지막 번째 자식 노드 찾는 방법 역시 위와 같은 여러가지 방법이 있고 주로 첫 번째, 두 번째 방법을 많이 사용하고 세 번째 네번째 방법은 이렇게도 접근할 수 있다는 걸 보여주기 위해 만든 것일 뿐 거의 사용하지 않습니다.
n번째 자식 노드 찾기 : children.eq(index), children(":eq(" + index + ")")
자식 노드 중 n 번째 자식 노드에 접근하는 방법 역시 위 2가지 방법이 있습니다.
jQuery의 부모(조상) 노드 선택하기
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 | <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> </head> <script> $(document).ready(function() { }); </script> <body> <div id="page"/> <div id="header"> <h1>header 영역</h1> </div> <div id="content"> <h1>content 영역</h1> <ul> <li> ktko1 </li> <li> ktko2 </li> <li> ktko3 </li> <li> ktko4 </li> </ul> </div> <div id="footer"> <h1>footer 영역</h1> </div> </div> </body> </html> |
위의 예제에서 content의 부모를 찾아 css를 변경하려면 아래와 같이 사용 가능합니다.
1 | $("#content").parent().css("border", "4px solid"); |
조상 노드를 찾을 수 있는 방법이 있는데 parents()를 사용하면 됩니다. (parent() 에서 끝에 s가 더 들어가네요)
ul tag의 조상인 id가 page인 div의 css를 변경하려면 아래와 같습니다.
1 | $("ul").parents("#page").css("border", "4px solid"); |
jQuery의 형제 노드 선택하기
먼저 메서드를 설명드리자면 아래와 같습니다.
prev() : 이전 형제 노드 찾기
prevAll() : 모든 이전 형제 노드 찾기
next() : 다음 형제 노드 찾기
nextAll() : 다음 형제 노드 찾기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <div id="page"/> <div id="header"> <h1>header 영역</h1> </div> <div id="content"> <h1>content 영역</h1> <ul> <li id="ktko1"> ktko1 </li> <li id="ktko2"> ktko2 </li> <li id="ktko3"> ktko3 </li> <li id="ktko4"> ktko4 </li> </ul> </div> <div id="footer"> <h1>footer 영역</h1> <ul> <li id="ktko1"> ktko1 </li> <li id="ktko2"> ktko2 </li> <li id="ktko3"> ktko3 </li> <li id="ktko4"> ktko4 </li> </ul> </div> </div> |
예제는 이전 노드를 찾는 것으로 끝내겠습니다. 이전이나 다음이나.. 똑같습니다..
아래 두 예제는 이전노드, 그리고 모든 이전노드를 찾는 것을 가리키는 예제입니다.
1 | $("#ktko3").prev().css("border", "4px solid"); |
1 | $("#ktko3").prevAll().css("border", "4px solid"); |
추가 예제
jQuery는 메서드를 실행하면 jQuery 객체가 리턴되는데 체이닝을 통해 아래와 같이 사용할 수 있습니다.
1 | $("#content").next().children().css("border", "4px solid") |
content의 다음 형제를 찾아 형제의 차식의 css를 변경하는 것입니다.
추가 정리
선택자를 이용하는 방법 중 첫 번째 자식 노드의 css를 변경할 때 아래와 같은 두 가지 방법이 있습니다. 어느 방법이 더 효율 적일까요?
1 2 3 | $("#page").children(":first").css("border", "4px solid"); $("#page").children().first().css("border", "4px solid"); |
위에 두가지 경우만 놓고 비교하면 선택자를 이용한 풀이 방법이 효율적입니다. 왜냐하면 2번째 방법은 children()과 first() 두 가지 메서드를 이용하여 jQuery 객체를 리턴 받는 경우 이고, 첫 번째는 children() 메서드만 호출했기 때문입니다. jQuery 코드를 최적화하는 가장 쉽고 효과적인 방법은 jQuery 메서드를 사용할 때 가급적 적게 호출해주는 것입니다.