본문 바로가기

Development/JavaScript

[jQuery] 기본 필터 선택자(Basic Filter)

728x90

jquery 이미지

 

안녕하세요.

빅한입니다.

 

이번에는 선택자(selector) 중에서 필터 선택자에 대해서 알아보겠습니다.

대략적인 선택자의 기능에 대해서는 여기서 확인해 주세요!

글에 내용에 있어서 수정할 부분이나 궁금한 부분이 있으면 공유해서 서로 win-win할수 있는 공간이 되었으면 합니다

그럼 본격적으로 서술하도록 하겠습니다.

 

먼저 이번 선택자인 기본 필터에 관한 내용은 간단히 서술 하면 다음과 같습니다.

  • :animated - 선택자를 실행할 때 애니메이션 진행 상태에 있는 모든 요소를 선택
  • :even - 일치하는 집합 내의 인덱스가 0을 포함한 짝수인 요소를 선택
  • :odd - 일치하는 집합내의 인덱스의 홀수 번째 요소를 선택
  • :focus - 현재 포커스가 있는 요소를 선택
  • :eq(n) - 일치하는 집합 내의 인덱스 n에 있는 요소를 선택
  • :gt(n) - 일치하는 세트 내의 인덱스 보다 큰 인덱스에서 모든 요소를 선택
  • :lt(n) - 일치하는 집합 내의 인덱스보다 작은 인덱스의 모든 요소를 선택
  • :first -  첫 번째로 일치하는 DOM 요소를 선택
  • :last - 마지막으로 일치하는 요소 선택
  • :root - document의 루트 요소 선택
  • :header - h1, h2, h3 등과 같이 헤더인 모든 요소를 선택
  • :lang(language) - 지정된 언어의 모든 요소를 선택
  • :not(selector) - 지정된 선택자와 일치하지 않는 모든 요소를 선택
  • :target - document의 URL의 flagment 식별자로 지정된 대상 요소를 선택

그럼 예제를 따라서 한번 따라가도록 해볼까요?

허접하지만 천천히 이해하기 쉽도록 진행하도록 하겠습니다.

 

   폴더 구성

폴더 구성은 다음과 같습니다.

├ root

│   lib

│  │ ├ jquery-3.4.1.min.js

   selector 

  │  selctor_basic_filter.html

폴더 구성

폴더 구성에서 보시는 봐와 같이 jQuery는 3.4.1 버전을 사용하였습니다.

jQuery 다운로드는 여기를 참고하시고 소스는 아래와 같습니다.

selector_basic_filter.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="../lib/jquery-3.4.1.min.js"></script>
    <style>
        td{
            height: 400px;
        }
    </style>
</head>
<body>
    <table>
        <tr>
            <td>
                <ul>
                    <li id="move">0번째 노드<input type="text" name="node0" value="0번째 노드"></li>
                    <li>1번째 노드<input type="text" name="node1" value="1번째 노드"></li>
                    <li>2번쨰 노드<input type="text" name="node2" value="2번째 노드"></li>
                    <li>3번째 노드<input type="text" name="node3" value="3번째 노드"></li>
                    <li>4번째 노드<input type="text" name="node4" value="4번째 노드"></li>
                    <li>5번째 노드<input type="text" name="node5" value="5번째 노드"></li>
                    <li>6번째 노드<input type="text" name="node6" value="6번째 노드"></li>
                    <li>7번째 노드<input type="radio" name="radio" value="7번째 노드"></li>
                    <li>8번째 노드<input type="radio" name="radio" value="8번째 노드"></li>
                    <li>9번째 노드<input type="radio" name="radio" value="9번째 노드"></li>
                    <li>10번째 노드<input type="checkbox" name="node10" value="10번째 노드"></li>
                    <li>11번째 노드<input type="checkbox" name="node11" value="11번째 노드"></li>
                    <li>12번째 노드<input type="checkbox" name="node12" value="12번째 노드"></li>
                    <li><h3>13번째 노드</h3></li>
                    <li lang="en-us">14번째 노드</li>
                    <li lang="euc-kr">15번째 노드</li>
                    <li>16번째 노드</li>
                    <li id="move">17번째 노드</li>
                </ul>
            </td>
            <td>
                <button id="example1">1(:animated)</button><br>
                <button id="example2">2(:even)</button><br>
                <button id="example3">3(:odd)</button><br>
                <button id="example4">4(:focus)</button><br>
                <button id="example5">5(:eq(1))</button><br>
                <button id="example6">6(:gt(6))</button><br>
                <button id="example7">7(:lt(4))</button><br>
                <button id="example8">8(:first)</button><br>
                <button id="example9">9(:last)</button><br>
                <button id="example10">10(:root)</button><br>
                <button id="example11">11(:header)</button><br>
                <button id="example12">12(:lang(euc-kr))</button><br>
                <button id="example13">13(:not(:eq(3)))</button><br>
            </td>
        </tr>
    </table>
<script>
    (function fnAnimation(){
        $("#move").slideToggle("slow",fnAnimation);
    })()
    $(function(){
        $("#example1").click(function(e){
            $("*").css("background-color","");
            $("li:animated").css("background-color","skyblue");
        })
       
        $("#example2").click(function(e){
            $("*").css("background-color","");
            $("li:even").css("background-color","skyblue");
        })
        $("#example3").click(function(e){
            $("*").css("background-color","");
            $("li:odd").css("background-color","skyblue");
        })
        $("#example4").click(function(e){
            $("*").css("background-color","");
            $('li:eq(5) input').focus();
            $(":focus").css("color","red");
        })
        $("#example5").click(function(e){
            $("*").css("background-color","");
            $("li:eq(1)").css("background-color","skyblue");
        })
        $("#example6").click(function(e){
            $("*").css("background-color","");
            $("li:gt(6)").css("background-color","skyblue");
        })
        $("#example7").click(function(e){
            $("*").css("background-color","");
            $("li:lt(4)").css("background-color","skyblue");
        })
        $("#example8").click(function(e){
            $("*").css("background-color","");
            $("li:first").css("background-color","skyblue");
        })
        $("#example9").click(function(e){
            $("*").css("background-color","");
            $("li:last").css("background-color","skyblue");
        })
        $("#example10").click(function(e){
            $("*").css("background-color","");
            $(":root").css("background-color","skyblue");
        })
        $("#example11").click(function(e){
            $("*").css("background-color","");
            $(":header").css("background-color","skyblue");
        })
        $("#example12").click(function(e){
            $("*").css("background-color","");
            $("li:lang(euc-kr)").css("background-color","skyblue");
        })
        $("#example13").click(function(e){
            $("*").css("background-color","");
            $("input:not(:eq(3))").css("background-color","skyblue");
        })
        
       
    })
</script>
</body>
</html>

다들 아시겠지만 허접한 샘플입니다.

예제가 간단하게 제작되어서 실제로 여러방법으로 진행해 보시면더 좋을듯 싶습니다.

우선 html으로 작성된 내용은 <li>를 중점으로 예제를 구성해보았고

해당 선택자의 기능을 알아보고자 <button>의 이벤트로 구성해 보았습니다.

script의 버튼 이벤트와 관련된 내용들은 직접 브라우저의 console에서 진행하셔도 무방합니다.

console은 크롬을 예를 들면 윈도우에선 "F12"를 누르면 나오는 창을 말합니다.
맥에서는 "options+command+i" 입니다.
메뉴에서는 "설정 > 도구 더보기 > 개발자 도구"를 선택하시면 
console을 이용할 수 있습니다.

 

   :animated

현재 애니메이션 진행중인 상태의 요소를 선택하는 필터입니다.

예제에서 0번째 노드는 지속적으로 slideToggle을 호출하고 있습니다.

즉 애니메이션 효과가 지속적으로 진행함을 알수 있습니다.

버튼 "1(:animated)"를 클릭하시거나 console에 이렇게 입력하시면

$("li:animated").css("background-color","skyblue");

0~17번째 노드중 애니메이션이 진행중인 0번째만 선택된것을 확인할수 있습니다.

:animated

 

선택한 후 '.css("background-color", "skyblue");'이 구문은

$(selector)가 선택한 요소의 CSS(style)의 속성중 배경색을 하늘색으로 변경한다는 의미 입니다.

이후 동일한 css 속성을 사용하므로 내용은 생략하도록 하겠습니다.

$(selector).css("background-color","skyblue");

   :even

일치하는 집합 내의 인덱스가 0을 포함한 짝수인 요소를 선택을 합니다.

짝수인지 쉽게 알기 위하여 순서를 0~17까지 표시해 두었습니다.

$("li:even").css("background-color","skyblue");

버튼 "2(:even)" 클릭 또는 console에 입력 하시면 <li>의 0번째 노드를 포함한 짝수번째 노도의 배경이 하늘색으로 변경된 것을 확인 할 수 있습니다.

:even

   :odd

일치하는 집합 내의 인덱스가 홀수인 요소를 선택합니다.

$("li:odd").css("background-color","skyblue");

버튼 "2(:odd)" 클릭 또는 console에 입력하시면 <li>중 홀수번째 노드의 배경만이 하늘색으로 변경된 것을 볼수 있습니다.

:odd

   :focus

현재 포커스가 있는 요소를 선택합니다.

$(":focus").css("color","red");

버튼 "4(:focus)"을 클릭하면 포커스를 5번째 노드안에 있는 <input>에 두고 포커스가 활성화되어있는 곳의 글자색을 적색으로 변경되어지는것을 볼 수 있습니다.

:focus

console에서는 focus이벤트를 사용하더라도 console창에 포커스가 유지되어서 확인하기가 쉽지 않습니다. 따라서 이벤트를 통하여 확인하는 것이 쉬워보입니다.

   :eq(n)

일치하는 집합 내의 인덱스 n에 있는 요소를 선택합니다.

$("li:eq(1)").css("background-color","skyblue");

버튼 "5(:eq(1))"를 클릭 하거나 콘솔창에 위의 명령어를 입력하시면 선택된 <li>들중에 1번째 <li>를 선택하여 배경을 하늘색으로 변경된 것을 확인 하실수 있습니다.

:eq(n)

   :gt(n)

일치하는 세트 내의 인덱스 보다 큰 인덱스에서 모든 요소를 선택합니다.

즉 선택되어진 요소들에서 "n<인덱스"조건에 맞는 요소를 필터링 합니다.

주의할점은 기준점인 n은 포함되지 않는 것을 알아두세요!

$("li:gt(6)").css("background-color","skyblue");

버튼 "6:(gt(6))"을 클릭하거나 콘솔에 입력하게 되면 6번째 노드보다 높은 노드들을 선택하여 배경을 하늘색으로 변경하게 됩니다.

gt(n)

   :lt(n)

일치하는 집합 내의 인덱스보다 작은 인덱스의 모든 요소를 선택합니다.

즉 선택된 요소들중에서 "n<인덱스"조건에 해당되는 요소들을 필터링 합니다.

":gt(n)"과 동일하게 해당 기준인 "n"번째 노드는 선택되지 않습니다.

$("li:lt(4)").css("background-color","skyblue");

버튼 "7:(:lt(4))"를 클릭하시거나 콘솔에 입력을 하면 선택된 <li>들 중 4번째 인덱스보다 낮은 노드들을 선택하여 하늘색 배경으로 변경되어 지는 것을 확인할 수 있습니다.

lt(n)

   :first

첫 번째로 일치하는 DOM 요소를 선택합니다.

선택되어진 요소들중에서 가장 첫번째(0번째) 요소를 선택하게 됩니다.

이는 마치 eq(0)와 같을 것이고 단 한개의 요소만을 반환하는 것이 특징입니다.

$("li:first").css("background-color","skyblue");

버튼 "8(:last)"을 클릭 하시거나 console에 입력해 보시면 선택한 <li>요소들 중에서 가장 첫번째가 하늘색 배경으로 변경됨을 확인 하실수 있습니다.

:first

   :last

마지막으로 일치하는 요소 선택합니다.

":first"필터와는 반대로 선택된 요소들중 가장 마지막에 있는 요소 한개를 선택하게 됩니다.

$("li:last").css("background-color","skyblue");

버튼 "9(:last)"을 클릭하시거나 console에 입력하시면 <li>요소들 중 가장 마지막에 위치한 요소만 배경이 하늘색으로 변경된 것을 확인 할수 있습니다.

:last

   :root

document의 루트 요소 선택합니다.

$(":root").css("background-color","skyblue");

버튼 "10(:root)"를 클릭거나 console에 입력하면 문서의 배경이 하늘색으로 변경됨을 확인할수 있습니다.

:root

사실 이 필터는 제대로 사용하는 방법을 테스트 해보진 못하였습니다.

api 문서 자체가 document를 찾는다고 써있는데요. 아마도 HTML을 찾는다는 내용인것 같습니다.

팝업이나 inculude를 사용함에 따라서 사용할수 있을 것 같지만 이건 저만의 추측이고 추후에 테스트 해보고 확실해 지면 다시 올려보도록 하겠습니다.(__);;

   :header

h1, h2, h3 등과 같이 헤더인 모든 요소를 선택합니니다.

$(":header").css("background-color","skyblue");

버튼 "11(:header)"을 선택하거나 console에 입력하시면 <h3>의 태그를 가진 요소들이 하늘색 배경으로 바뀌는 것을 확인 하실수 있습니다.

:header

<li>태그 안에 있는 header를 선택하고 싶다면 $("li :header")로 <li>태그의 하위 노드 모두 중에 header요소를 가진 아이를 선택하라는 뜻입니다.

   :lang(language)

지정된 언어의 모든 요소를 선택합니다.

$("li:lang(euc-kr)").css("background-color","skyblue");

버튼을 "12(:lang(euc-kr)"를 선택하시거나 console에 입력하시면 태그의 속성 "lang='euc-kr'"인 요소들이 선택된 것을 확인하실수 있습니다.

lang(language)

15번째 노드의 내용은 [<li lang="euc-kr">15번째 노드</li>] 입니다.

   :not(selector)

지정된 선택자와 일치하지 않는 모든 요소를 선택합니다.

즉 선택된 요소중에 선택자에 해당되는 요소들을 제외시키는 것을 말합니다.

$("input:not(:eq(3))").css("background-color","skyblue");

버튼 "13(:not(:eq(3)))"을 클릭하거나 console에 입력해보면 선택되어진 <input> 요소들 중에서 eq(3)에 해당되는 <input> 요소만 제외하고 배경이 하늘색으로 변경된것을 확인하실수 있습니다.

:not(selector)

   :target

document의 URL의 flagment 식별자로 지정된 대상 요소를 선택합니다.

사실 이 필터에 관하여는 이해하지 못하여 테스트를 하지 못했습니다.

알고 있으신 분은 댓글로 알려주시면 감사하겠습니다.

 

 

지금 까지 "기본 필터 선택자"에 관하여 알아보았는데요.

혹시 궁금한 내용이나 더 깊이 알고 싶으신 분들은 댓글에 남겨놓으시면

최대한 성심성의것 답변하겠습니다.

이글의 목적은 느낌만이라도 가져가시고 이러한 기능들이 있구나 라는 느낌만이라도 알아가셨으면 좋겠습니다.

앞으로 이 글을 읽고 참여하시는 분들과 함께 교감하며 성장하는 제가 되었으면 좋겠습니다.

감사합니다.

 

728x90
반응형