본문 바로가기
프로그래밍/jQuery

jQuery API 정복 - 선택 요소 집합에서 추출하기, filter()

by zoo10 2011. 5. 12.

.filter()

원문 링크 http://api.jquery.com/filter/

.attr( attributeName )Returns : String

개요 - 선택된 요소 집합에서 선택자를 추가하여 집합을 축소시키거나 함수의 테스트를 위해 인자를 전달합니다.(ㅡㅡ;; 당췌 뭔소린지 모르겠습니다. 아마 아래 예제를 쭈욱 보셔야 할 듯해요.)

  • .filter( selector )
  • selector 현재 선택된 요소들의 집합 안에서 재추출(filter)를 위한 선택자를 표현하는 문자열
  • .filter( function(index) )
  • function(index) 집합에 속한 요소들을 테스트 할 함수. this 키워드는 현재 요소를 지칭함
  • .filter( element )
  • element 선택된 요소들 중에서 찾을 요소(태그)
  • .filter( jQuery object )
  • jQuery object 선택된 요소들 중에 찾을 존재하는 jQuery 객체

ㅠㅠ 이번장에서 발번역의 한계를 느낍니다. ;;; 감안해서 보시고 아래 예제로 이해하시는 편이 신상에 좋으실 듯 합니다.

jQuery 객체를 이용해서 표현된 DOM 요소 집합에 .filter() 함수를 사용하면 선택된 요소들의 일부부을 추출하여 새로운 jQuery 객체를 생성합니다. 각 요소들에 대해 주어진 선택자에 일치하는지 테스트를 하고 일치하는 또는 합당한 모든 요소들을 결과에 포함시킵니다. 쉽게 말씀드리면 이미 선택된 요소 집합들에서 새로운 추출을 하여 나온 요소들의 집합이 생성된다는 것입니다. 헉~ 전혀 쉽지 않네요. ==3

간단한 리스트를 구성하는 마크업을 예로 들어 보겠습니다. 우리는 가상의 리스트 마크업에 이런 식의 스크립트를 적용해 볼 수 있습니다.

$('li').filter(':even').css('background-color', 'red');

위 스크립트는 $(li)로 인해 선택된 li 요소들 중에 인덱스 번호 기준으로 짝수번째(눈으로 보기에는 1, 3, 5 번째이지만)의 li의 배경색을 빨간색으로 바꾸게 됩니다. 즉 재주출이라는 얘기입니다.

추출용 함수 사용

filter()함수를 사용하는 두번째 방법은 추출을 위한 함수를 사용하는 것입니다. 이 방법은 선택자(selector)를 사용하는 것보다 좋습니다. 각 요소들에 대해 함수의 결과가 true라면 새로운 결과 집합에 포함시키고 false 라면 제외시켜 버립니다. 아래와 같은 html을 예로 들어 보겠습니다.

<ul>
  <li><strong>list</strong> item 1 -
    one strong tag</li>
  <li><strong>list</strong> item <strong>2</strong> -
    two <span>strong tags</span></li>
  <li>list item 3</li>
  <li>list item 4</li>
  <li>list item 5</li>
  <li>list item 6</li>
</ul>

추출된 리스트 요소를 기반으로 재추출을 위한 함수를 사용하는 스크립트의 예는 아래와 같습니다.

$('li').filter(function(index) {
  return $('strong', this).length == 1;
}).css('background-color', 'red');

위 스크립트는 리스트(li) 안에 단 하나의 <strong>태그만 가진 리스트를 찾아 하나의 결과 집합을 구성하는 스크립트입니다. 위에서 사용된 this 키워드는 리스트(li)들을 의미합니다. 즉 모든 li 들이 this에 한번씩 해당하게 되는 것입니다. 인자로 넘겨진 index 는 각 li들의 인덱스를 뜻합니다.

우리는 이 index 인자를 사용하여 좀 더 나은 함수를 구성할 수 있습니다. 인덱스는 0을 초기값으로 하고 li들의 모든 인덱스를 가집니다.

$('li').filter(function(index) {
  return index % 3 == 2;
}).css('background-color', 'red');

이 코드는 세번째, 여섯번째 리스트의 배경색을 바꾸게 됩니다. 여기서 사용된 (%) 연산자는 나머지 연산자입니다. 위의 예제에서는 3으로 나누고 남은 나머지가 2인지 확인하는 것입니다.그러니까 눈으로 볼때 3번째 리스트 즉 인덱스 기준으로 2인 리스트가 3으로 나눈 나머지가 2가 되는 것입니다. 와우 쉽죠~~.

예 제  
모든 div 들의 배경색을 바꾸고 클래스가 middle인 div의 테두리를 빨간색으로 바꿔줍니다.

<!DOCTYPE html>
<html>
<head>
  <style>
  div { width:60px; height:60px; margin:5px; float:left; 
        border:2px white solid;}
  </style>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
  <div></div>

  <div class="middle"></div>
  <div class="middle"></div>
  <div class="middle"></div>
  <div class="middle"></div>

  <div></div>
<script>

    $("div").css("background", "#c8ebcc")
            .filter(".middle")
            .css("border-color", "red");
</script>

</body>
</html>

미리보기

결과만 보셔도 딱 아시겠죠?? 하하

 

예 제  
div들의 배경색을 바꾸고 함수를 사용해 재추출(filter)하여 추가적인 효과를 줍니다.

<!DOCTYPE html>
<html>
<head>
  <style>
  div { width:60px; height:60px; margin:5px; float:left; 
        border:3px white solid; }
  </style>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
  <div id="first"></div>
  <div id="second"></div>
  <div id="third"></div>

  <div id="fourth"></div>
  <div id="fifth"></div>
  <div id="sixth"></div>
<script>
    $("div").css("background", "#b4b0da")
            .filter(function (index) {
                  return index == 1 || $(this).attr("id") == "fourth";
                })
            .css("border", "3px double red");

</script>

</body>
</html>

미리보기

이번 예제는 첫번째 예제와 비슷하지만 함수를 사용하고 있습니다. 잘 보시면 인덱스가 1인 div(눈으로 보기엔 두번째가 됩니다. 왠지 이제는 아시죠?)와 id값이 fourth 인 div의 테두리가 바뀐것을 보실 수 있습니다.

 

부왁~ 이번 포스팅은 쓰고 봤더니 진짜 발번역에 오역, 제 마음대로 해석이네요. ㅜㅜ 아마 심도있게 보실 분은 원문을 한번 더 보심이 좋을실 듯 합니다. 하시는 일 잘 되세요.

그럼 즐프하세요.

※ 본 예제는 http://www.jquery.com 에 있는 내용임을 밝힙니다.