스크립트 라이브러리의 시대 그리고 jQuery

필자의 잡담~

이번엔 빠르게 마무리 해보리라 맘 먹고 써보는 jQuery 강좌입니다.
무엇보다 제 자신에게 자극이 되는 강좌이기를 바라고 있어요.

jQuery는 최근 각광을 받고 있는 경량의 오픈 소스 자바스크립트 라이브러리의 이름입니다. 물론, 최근에 한번씩은 들어보셨죠? 지난 1월에 있었던 태오 사이트 신년 세미나(비정기)에서도 정석모 시삽이 이에 대한 이야기를 발표해서 저는 능가하는 인기를 끌었던 바로 그 소재이기도 합니다.

기존에 Ajax를 해 보신 분은 익히(?) 들어보셨을 것이라 예상되는 이 라이브러리는 prototype이나 ExtJs, Dojo 등과 유사한 스크립트 라이브러리 혹은 스크립트 프레임워크라고 보시면 됩니다. 이는 리치 웹, Ajax의 진화와 함께 요즘의 트렌드에 맞춰 개량된 신예 라이브러리인데요. 업계 선두이자 전설인 prototype 라이브러리를 제치고 세계적으로 가장 많이 사용되는 라이브러리로 자리를 잡고 있습니다. 2008년 후반에 이미 사용률이 60%에 가까웠죠. http://www.rubyrailways.com/rails-rumble-observations-part-i-jquery-on-the-heels-of-prototype/가 보시면 그 내용을 확인하실 수 있습니다. 더 최근의 자료는 제 검색 능력이 후덜덜이라 찾을 수가 없었습니다만, 이미 70%를 넘어섰다는 이야기도 얼마 전에 들었습니다.

사실, prototype도 여전히 괜찮은 라이브러리이긴 합니다만, 최근의 추세는 jQuery쪽 손을 들어주고 있는 편입니다. 이에 관해서는 다음 글을 한번 읽어보시기 바랍니다. http://www.quarkruby.com/2007/11/6/why-i-moved-from-prototype-to-jquery. 물론, 이러한 스크립트 라이브러리 혹은 프레임워크는 지극히 개발자의 개인 취향이나 팀 취향에 따라 호감도가 다르기에 이견이 있을 수 있습니다만, 요즘의 추세가 확실히 jQuery인 것은 분명해 보입니다. 수 많은 사이트에서 [소스 보기]를 해보면 jQuery 코드를 쉽게 볼 수 있기 때문이지요. 그리고, 실제로 이를 써 보면 그 매력에 반하게 되기도 하고요. 아참. 방금 위의 링크는 영어 원문인데요. “Why I moved from Prototype to jQuery”라는 제목으로 구글 검색을 해보면, 이 글을 번역해 놓은 블로그 글도 보실 수 있습니다.

게다가, 2008년 9월에는 Microsoft가 공식적으로 JQuery의 유용성을 인정하고, 차기 Visual Studio에서는 jQuery를 MIT 라이선스(http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt)인 상태로 포함시킬 것임을 발표하기도 했습니다. 게다가, jQuery에 대한 인텔리센스도 제공할 것이며 ASP.NET AJAX에서도 긴밀하게 사용될 것임을 발표하여 jQuery에 더욱 큰 힘을 실어주기도 했죠.

그래서인지, 최근의 외국 웹 사이트를 보면 대부분의 스크립트들이 jQuery로 구현되어 있는 것을 심심찮게 볼 수 있습니다. 이 말은 결국 앞으로 웹 개발을 하는 개발자들은 jQuery에 대한 지식을 미리 갖출 경우, 더욱 경쟁력 있는 개발자로 설 수 있을 것임을 의미하기도 합니다. jQuery를 다룰 줄 안다면 경쟁력이 있다는 이야기는 제 개인적인 생각이 아니라 실제로 외국 구직 사이트에 올라온 통계를 토대로 드린 말씀입니다. 다음 그림을 살펴보시기 바랍니다. 출처는 http://www.indeed.com/jobtrends?q=jquery%2C+dojo%2C+yui 입니다.

네. 뭐 일단 떡밥은 충분히 던져진 것 같다는 생각이 듭니다(최근의 온라인 유머 스타일을 따라한 것이니 ‘떡밥’이라는 단어에 오해하시고 기분 나빠하지 않으셨으면 합니다).

jQuery의 위상 및 사용율이 크게 올라감에 따라, 차기 웹 애플리케이션의 개발 구도도 아마 ASP.NET MVC + jQuery의 조합 형태가 되지 않을까 하는 생각을 해 봅니다. 물론, WebForm 기반의 개발이 아예 사라질 것은 아니기에, 그러한 경우에는 ASP.NET이 기본적인 UI 골격을 렌더링하는 역할을 담당하면서 jQuery와 WCF(혹은 웹 서비스)로 연동되는 아키텍처도 고려해 볼만 합니다. 이는 기존 개발 스타일을 유지하면서 점진적으로 MVC로 옮겨갈 수 있다는 장점이 있겠죠(사실, Ajax가 일반화되고, jQuery가 득세하면서 ASP.NET 서버 컨트롤의 필요성은 갈수록 줄어들고 있는 것이 사실이니까요).


Case 1. jQuery + ASP.NET MVC


Case 2. jQuery + ASP.NET WebForm(UI 렌더링) + WCF(혹은 웹 서비스)

서론이 길었는데요. 그래서 하고 싶은 말은 이러한 jQuery에 대해서 작게나마 강좌를 진행해볼까 한다는 것입니다. 아주 상세한 내용은 IT의 경기를 살리기 위해서라도 “책을 사서” 보실 것을 권장하고요. 제 강좌는 jQuery의 유용함과 초급 사용법 정도에 초점을 두고 2~3회 정도로 진행을 해볼까 합니다. 아직 이전 강좌인 예외처리 기법에 대한 강좌도 마무리를 못한 상태라서요 ^^;

그럼 다음 강좌부터 본격적으로 시작해 봅니다.


authored by Taeyo

Posted by 바람이불면
,

jQuery : 폼 필터 및 조작 메서드(each 등)

필자의 잡담~

강좌가 좀 늦어졌네요.
실은 재미삼아 시작한 게시판 만들기에 뜻밖에 심취하는 바람에 그랬어요.
http://taeyo.net/jQueryBoard ^^;

강좌가 좀 늦어졌네요. 그냥 데모 수준으로 가볍게 만들어 보려 한 게시판에 의외로 몰입하게 되는 바람에 한 10일 정도 jQueryBoard를 만들게 되어서 그리 되었습니다. http://taeyo.net/jQueryBoard 가 그것인데요. 아직 손을 봐야 할 것들이 남아있긴 합니다만, 그런대로 기본 기능들은 다 갖춘 것 같습니다. 습작이니 너무 예리한 눈으로 보진 마시고요. 그냥 이렇게 jQuery를 적용할 수도 있다는 수준으로 봐주시면 감사하겠습니다. 그러면, 이제 강좌로 들어가 볼까요?

이번 강좌는 셀렉터의 마지막 강좌로 폼과 관련된 셀렉터에 대해서 알아볼까 합니다. 사실상, 웹 페이지에서 서버로 데이터를 전송하려면 입력 UI로 다양한 폼 컨트롤들을 사용할 수 밖에 없는데요. 이는 Ajax 기반의 웹 페이지라 해도 다를 것이 없습니다. 해서, 폼 관련 요소들은 다양한 HTML 요소들 중 상당히 중요한 요소라 할 수 있고, 그렇기에, 이와 직접적으로 연관된 폼 필터들도 마찬가지로 매우 중요하다고 우겨볼 수 있을 것 같습니다. 하하. 하지만, 정말로 그럴까요?

이미 이전 강좌를 통해서 필터의 역할이나 사용방법은 알고 계실 테니까요. 폼 필터들에는 어떤 것들이 있는지 일단 정리한 것을 먼저 보고 이야기를 계속해 나가보겠습니다.

:input 모든 input, textarea, select, button요소들과 일치됩니다
:text text 타입의 모든 input 요소들과 일치됩니다.
:password password타입의 모든 input 요소들과 일치됩니다.
:radio radio 타입의 모든 input 요소들과 일치됩니다.
:checkbox checkbox 타입의 모든 input 요소들과 일치됩니다.
:submit submit 타입의 모든 input 요소들과 일치됩니다.
:image image 타입의 모든 input 요소들과 일치됩니다.
:reset reset 타입의 모든 input 요소들과 일치됩니다.
:button 모든 button 요소들 및 button 타입의 input 요소들과 일치됩니다.
:file file 타입의 모든 input 요소들과 일치됩니다.
:hidden hidden 상태인 모든 요소들과 일치됩니다.

이미 필터에 익숙한 여러분이기에 보면서 이해가 되실텐데요. 보이는 것처럼 모든 입력 컨트롤을 선택하고 싶다면 $(":input") 라고 작성하면 되고, 체크박스만 선택하고 싶다면 $(":checkbox")라고 jQuery를 작성하면 됩니다. 히든 필드는 $(":hidden") 이라고 작성해서 선택할 수 있고요. 호오~ 깔끔하네요.

하지만, 생각 외로 이 폼 필터들을 자주 사용할 일은 없는 편인데요(물론, 사용하기 나름이겠지만 저의 경우는 그다지 사용할 일이 많지 않았습니다). 이는 일반적으로 $("input#UserID")이나 $("input.required") 와 같이 특정 목적을 위한 입력 컨트롤들을 콕 찝어서 접근하는 방식을 더 선호하기 때문이 아닐까 합니다. 사실, 모든 입력 컨트롤을 선택한다거나, 모든 라디오 버튼을 선택한다거나 할 일은 그리 많지 않죠.

반면, 체크박스 중 체크된 것들을 모두 알아온다던가, 셀렉트 컨트롤들 중에서 선택된 것들을 알아낸다던가 하는 작업은 상대적으로 자주 요구되는 일 중에 하나입니다. 예를 들어, 사용자가 체크한 값들이나 선택한 값들을 화면에 출력해주는 일을 생각해 볼 수 있습니다. 다음의 코드를 한번 볼까요?

var sports $("input:checkbox");
for 
(var 0i < sports.lengthi++) {
  
if (sports[i].checked == true) {
    
//두 썸띵!
  
}
}

이는 체크박스 필터를 사용해서, 우선 현재 페이지에 있는 모든 체크박스들을 얻어온 뒤, 전체 요소들만큼 for 루프문을 반복하면서 해당 체크박스가 checked 상태인지를 검사하고, 만일, 체크가 된 상태라면 "두 썸띵"을 하는 코드입니다. ^^;

앞서서 설명을 드렸었는지 기억이 가물해서 언급하자면 var sports = $("input:checkbox"); 와 같은 셀렉터 혹은 셀렉터 필터에 의해 반환하는 개체는 Html 요소들의 배열입니다. 즉, sports 라는 변수는 Html 요소들의 배열이지, jQuery 개체의 배열이 아니라는 것이죠.

상기 코드는 현재 페이지에 존재하는 모든 체크박스들을 일일히 확인해가면서 선택된 것을 찾아내는 코드입니다만, jQuery의 필터 중에는 이와 같은 작업을 보다 쉽게 해주는 필터들도 있습니다. 바로 다음과 같은 것들이죠.

:enabled 현재 enable 상태인 모든 요소와 일치됩니다.
:disabled 현재 disable 상태인 모든 요소와 일치됩니다.
:checked 체크된 모든 요소들과 일치됩니다.
:selected 선택된 모든 요소들과 일치됩니다.

예를 들면, :checked 와 같은 필터는 폼에서 체크된 모든 요소들을 선택하게 됩니다. 즉, 이 필터를 사용하면 모든 체크박스를 일일히 확인할 필요없이, 체크가 된 체크박스들만을 얻어올 수 있다는 것이죠. 해서, 이 필터를 사용하면 이전의 체크박스 확인 코드가 다음과 같이 좀 더 간단해 질 수 있습니다.

var sports $("input:checked");
var 
result "";
for 
(var 0i < sports.lengthi++) {
  
//두 썸띵!
}

전과 비교했을 때, if (sports[i].checked == true){ .. } 와 같은 코드를 사용할 필요가 없게 된 것이죠. 이미 필터를 통해서 체크된 요소들만 가져와진 상태니까요 ^^.

자. 그럼 간단한 예제를 통해서 확인을 해볼까요?

<html>
<head>
    
<title></title>
<script src="js/jquery-1.3.2.min.js" type="text/javascript"></script>
    
<script type="text/javascript">
        $(
document).ready(function() {

            $(
"#DoIt").click(function() {
                
var sports $("input:checked");
                var 
result "";
                for 
(var 0i < sports.lengthi++) {
                        result +
$(sports[i]).next().text() + ",";
                
}
                $(
"#result").text(result);
            
});
});
    </
script>
</head>
<body>
    
<p>
        스포츠 :
<input id="c1" type="checkbox" /><label for="c1">농구</label>
        
<input id="c2" type="checkbox" /><label for="c2">배구</label>
        
<input id="c3" type="checkbox" /><label for="c3">축구</label>
        
<input id="c4" type="checkbox" /><label for="c4">야구</label>
    
</p>
<p>
        
<input id="DoIt" type="button" value="선택" />
</
p>
    
<p>
        당신이 선택하신 스포츠는 
<span id="result"></span> 입니다.
    
</p>
</body>
</html>

우선, HTML 코드들부터 살펴보도록 하세요. 화면에는 4개의 체크박스가 존재하고 있고, 1개의 버튼과 1개의 출력용 span 구역이 정의되어 있습니다. 그리고, 구현하려는 기능은 사용자가 몇몇 체크박스에 체크를 하고, "선택" 버튼을 클릭하면, span 영역에 그 선택된 값들을 출력하려는 것입니다. 매우 간단한 예제이긴 하죠?

하지만, 스크립트 구역의 소스는 생각보다 설명을 드릴 것이 조금 많네요. 하지만, 재미있는 내용이니 기쁘게 설명해 보도록 할게요. 우선 이벤트에 관한 것부터 설명 드리겠습니다. 사실, 이벤트에 관한 부분은 추후에 설명드릴 예정인 부분이지만, 예제에서 등장을 했으니 조금쯤은 설명을 드리고 가야 할 듯 합니다.

우선, $(document).ready()라는 이벤트 메서드를 보세요. 이것! 기억하시죠? 그렇습니다. 이는 jQuery가 제공하는 페이지 로드 이벤트 함수(마치, window.load와 유사한)라고 제가 2번째 강좌에서 간략하게 설명을 드렸었습니다. 그리고, 그 메서드 인자로는 함수를 작성한다고 말씀을 드렸었죠. 즉, 다음과 같이 말입니다.

$(document).ready(pageLoad);
function 
pageLoad()
{
   
//.. 페이지 로드시에 할 일
}

하지만, 일반적으로는 저렇게 굳이 함수를 분리해서 작성할 이유가 없어서, pageLoad라는 함수를 별도로 작성하지 않고, 그냥 다음과 같이 익명 함수로 작성하는 편입니다.

$(document).ready(
   
function()
   {
      
//.. 페이지 로드시에 할 일
   
}
)
;

그리고, 대부분은 가독성을 위해서 다음과 같이 붙여서 쓰곤 하는 편이죠.

$(document).ready(function(){
    
//.. 페이지 로드시에 할 일
});

이렇게 말이죠. 해서, 예제에서의 코드도 이러한 코드 내부에 작성된 것을 보실 수 있습니다. 혹시라도, 이전에 이 코드가 왜 이렇게 작성된 것인지 잘 이해가 안되셨던 분들은 이제는 좀 감을 잡으셨을 것이라 생각합니다(그리고, 이와 같은 류의 코드가 jQuery에서는 대단히 자주 등장합니다. 진짜로 100초 안에 다시 등장할 겁니다).

그 이후 등장하는 소스를 계속해서 보시면, 페이지가 준비가 되는대로(즉, ready() 함수 안에서) 다음과 같은 코드를 사용해서 버튼에 click 이벤트를 걸어주는 것을 볼 수 있습니다.

$("#DoIt").click( someFunction );

이는 #DoIt이라는 개체에게 동적으로 클릭 이벤트를 걸어주는 jQuery 코드입니다. 사실, 이는 document.getElementById("DoIt").click = someFunction; 이라는 자바스크립트 함수와 같은 것이라 볼 수 있죠. 하지만, 코드가 간결하고, 메서드 체인을 통해서 여러 작업을 이어서 지정할 수 있다는 장점이 있습니다. 예를 들면, 다음과 같이 말입니다.

$("#DoIt").click( someFunction ).mouseover( otherFunction ).css("color""red");

즉, 이와 같은 식으로 작성해서, 클릭 이벤트와 마우스 오버 이벤트를 걸어줌과 동시에 color 스타일 값도 red로 변경하는 작업을 한번에 할 수 있다는 것이죠.

사실, 오리지날 jQuery에서의 이벤트 설정 작업은 상기와 같은 코드를 사용하는 것이 아니라 다음과 같이 bind 라는 메서드를 통해서 설정해야 합니다.

$("#DoIt").bind("click"someFunction );

하지만, jQuery는 자주 사용하는 몇몇 이벤트(몇몇이라고 하기엔 꽤 많지만)에 대해서는 click과 같이 단축 메서드를 작성해 놓았기에, bind 대신 click과 같이 직관적인 메서드를 사용해서도 이벤트 핸들러를 걸 수가 있는 것입니다. 이러한 부분에 대한 구체적인 이야기는 추후에 다시 하도록 하고요(엉? 근데, 거의 다 이야기했는데..). 다시 예제에 집중하도록 하죠.

해서, 소스를 보시면, DoIt이라는 아이디를 갖는 버튼에게 click 이벤트를 지정하고 있는데요. click() 이라는 메서드도 인자로는 함수(클릭 시에 해야할 작업을 작성하는 함수)를 지정할 수 있게 되어 있습니다. 해서, ready() 메서드에서 했던 것처럼 이도 별도의 함수로 작성하기 보다는 그냥 익명함수로 작성하곤 합니다. 다음과 같이 말이죠(제가 100초 안에 다시 등장할 거라고 말했죠!).

$("#DoIt2").click(function() {
  
//.. 클릭 시 해야할 작업
});

click 메서드의 인자로 지정된 익명함수 내에서는 원래의 개체에 대한 컨텍스트가 유지되기 때문에, 함수 내에서 this라는 키워드를 사용할 수 있으며, 이 this는 Doit이라는 html 요소를 의미합니다. 만일, jQuery 개체로 다시 감싸고 싶다면, 함수 내부에서 $(this)와 같이 작성하시면 되지요.

자. 그럼 이제 클릭 이벤트 핸들러 안에다 어떤 코드를 작성했는지 한번 살펴보도록 하겠습니다. 단, 그 전에 이제부터 작성하는 코드들은 "버튼이 클릭되는 경우"에만 수행된다는 것을 기억하세요. 전체적인 코드 작성이 $(document).ready() 메서드 안에서 작성되고 있기에, 마치 모든 코드가 페이지 로드 시에 동작할 것이라고 오해하실 수 있어서 강조드리는데요. 페이지가 로드될 경우 수행되는 것은 이러한 함수가 click 이벤트에 연결되는 것까지이고요. 실제 click 메서드 안에 작성된 익명 함수(아래의 코드)는 사용자가 실제로 버튼을 클릭하는 경우에만 호출되고, 수행됩니다.

var sports $("input:checked");
var 
result "";
for 
(var 0i < sports.lengthi++) {
   result +
$(sports[i]).next().text() + ",";
}
$(
"#result").text(result);

자. 이 코드는 앞서 설명한 :checked 필터를 사용하여 체크가 된 체크박스들을 얻어오고 있고요. 그를 sports라는 변수에 담고 있습니다. 결국, sports라는 변수는 셀렉터에 의해 필터링된 html 요소들의 배열이라고 볼 수 있죠. 그들을 루프를 돌면서, 각 체크박스의 다음에 있는 html 요소로 접근한 뒤(next() 메서드), 그 요소의 텍스트값을 얻어와서 문자열로 구성하고 있습니다.

여기서 우리가 추가로 배우게 되는 2개의 jQuery 메서드가 있는데요. 하나는 next() 이고, 다른 하나는 text() 입니다.

next()란 메서드는 현재의 개체 요소와 형제 수준인 요소 중 바로 다음에 나오는 개체를 얻어오는 메서드입니다. 이름에서 느껴지듯이 딱 그런 역할을 하는 메서드이죠. 예제를 기준으로 설명드리면, 현재 예제는 각각의 체크박스 바로 옆에 <label> 개체들이 놓여있는 것을 보실 수 있을 겁니다. 고로, $(sports[i]).next() 라는 표현은 현재의 체크박스 바로 옆에 있는 label 개체를 찾아가게 되는 것이죠. 단, 루프 안에서 sports[i].next() 라고 코드를 작성한 것이 아니라, $(sports[i]).next()라고 작성한 것에 주목하셔야 하는데요. sports라는 배열에 들어있는 개체들은 jQuery 개체가 아닌 html 요소일 수 있기 때문입니다. 해서, 이를 $()를 사용하여 확실하게 jQuery 개체로 포장해야만 합니다. jQuery 개체가 아니면 next() 메서드를 사용할 수 없으니까요.

text() 메서드는 해당 개체가 가지고 있는 컨텐트를 텍스트로 반환하는 메서드입니다. 이와 유사한 메서드로는 html()이 있는데요. 이는 개체가 포함하고 있는 html 컨텐트를 반환하는 메서드입니다. 이 메서드들은 인자를 사용하지 않으면 값을 가져오는 역할을 하지만, 인자로 값을 지정하면 그 값으로 원래의 값을 바꾸는 역할을 합니다. text() 메서드의 재미있는 점은 개체의 컨텐트가 html 요소들을 포함하고 있다고 해도, 다 무시하고 텍스트만을 반환한다는 점입니다. 즉, <span><b>taeyo</b></span> 와 같은 span 개체가 있을 때, 이 span 개체에 대해서 text()를 수행하면, 반환값은 내부 html을 제외한 "taeyo"가 되고요. html() 메서드를 사용하면 <b>taeyo</b>를 반환한다는 것이죠.

그리하여, 예제에서의 result += $(sports[i]).next().text() + ","; 라는 구문은 현재 루프 안에서, 체크박스 개체의 바로 옆에 있는 개체(label)의 텍스트를 읽어와서 그 텍스트에 ","라는 문자를 더한 다음, 이를 result 라는 변수에 덧붙이는 역할을 하게 됩니다. 즉, 사용자가 체크한 체크박스의 명칭을 차곡차곡 문자열에 더하는 것이죠.

그 후, 예제는 그렇게 만들어진 문자열 result를 span 요소에 출력하는 것을 볼 수 있습니다. 텍스트 설정을 위해서 text() 메서드를 사용하고 있는 것도 잊지말고 째려봐 주세요. 해서, 결과 화면은 다음과 같죠.

이야기를 진행하다 보니, 원래의 폼 관련 셀렉터에 대한 설명보다는 jQuery 개체가 제공하는 트래버싱(traversing, 탐색) 메서드나 조작(Manipulation) 메서드에 대해 설명을 하게 되었네요. 하긴, 이 이야기가 다음 강좌의 주제이니 지금 이야기하는 것이 부드럽긴 하지만요(그리고, 사실 폼 관련 셀렉터에 대해서는 이번 강좌 초반에 표로 설명한 정도면 충분하다고 봅니다요).

그렇다면, 이야기를 꺼낸 김에 루프를 좀 더 편하게 작성할 수 있는 jQuery의 기본 제공 메서드인 each() 메서드에 대해서도 설명을 좀 드리고 넘어갈까 합니다.

each() 메서드는 jQuery 개체가 제공하는 메서드로서, 모든 일치된 개체들에 대해서 순차적으로 특정 함수를 수행할 수 있게 해주는 메서드입니다. 문법은 다음과 같아요.

jQuery(selector).each( function );

each() 메서드 안에 인자로 사용하는 것은 역시나 또 함수입니다(jQuery는 거의 인자로 함수를 사용합니다). 그리고, 역시나 주로 익명 함수를 사용하게 되죠. 해서, 일반적으로 다음과 같은 구문을 가지게 됩니다.

jQuery(selector).each( function(i) {
    //.. 루프 안에서 할 일을 작성
});

익명 함수의 i 라는 인자는 0부터 시작하는 인덱스 값이 넘어옵니다. 마치 for 문에서의 i와 동일하다고 보시면 됩니다만, 필요치 않다면, 인자를 지정하지 않으셔도 됩니다.

each() 메서드는 상당히 자주 사용하게 되는 메서드입니다. 제가 샘플로 만들어 놓은 jQueryBoard에서도 이는 예외가 아닙니다. 이는 셀렉터에 의해 추출된 개체들에 대해서 각각 지정한 함수를 수행하게 합니다. 해서, 루프를 사용할 때와 마찬가지로 각 요소에 대해 어떤 작업을 하고 싶다면 바로 그 함수 안에다가 수행할 내용을 작성하면 됩니다. 이는 for 루프문을 대체할 수 있을 뿐만 아니라, 상당히 효과적이어서 한번 사용하기 시작하면 다시는 for 문을 거들떠 보지도 않게 만드는 마력이 있더군요. 그러면, 이번 예제의 for 루프문을 each() 메서드를 사용해서 바꾸어 볼까요?

var result "";
$("input:checked").each(function(i) {
   result +
$(this).next().text() + ",";
});
$("#result").text(result);

만일, 2개의 체크박스가 체크되었다면, each() 안의 함수는 그 2개의 체크박스에 대해 각각 호출될 것이고, 구문 내 this는 각각의 호출 시에 그에 해당하는 체크박스가 될 것입니다.

어떻습니까? 기존의 for 문으로 작성한 것보다 훨씬 간단하고 명료합니다. 그리고, 결과는 기존과 아주 확실히 동일하죠. 게다가, each() 메서드를 사용하게 되면, 여전히 jQuery의 장점 중 하나인 메서드 체인도 사용이 가능합니다. 예를 들어, 다음 구문을 보시죠.

$("#DoIt").click(function() {
   
var result "";
   
$("input:checked")
      .each(
function(i) {
         result +
$(this).next().text() + ",";
       
})
      .css(
"background""yellow");

   $(
"#result").text(result);
});

each() 메서드에 이어서 css() 메서드를 체인으로 연결해서 작성하고 있습니다. 이렇게 작성하면, 체크된 모든 체크박스에 대해서 each() 메서드를 사용한 기존 작업을 수행할 뿐 아니라, 배경색을 노란색으로 지정하는 것까지 수행하게 됩니다. 해서, 이렇게 바꿔 작성된 예제는 다음과 같은 결과를 보이게 됩니다.

호~ 쓸만하죠?

어찌하다보니, 이번 강좌에는 다음 번에 다루어야 할 내용까지 들어가 버리게 된 결과가 되었지만, 그래도 독자들은 단순히 셀렉터만을 다루는 것보다는 재미있지 않았을까 생각해 봅니다. 어찌됐건, 이로서 셀렉터에 대한 내용은 거의 모두 다룬 것 같네요.

다음 강좌부터는 UI를 조작하는 메서드들 즉, Manipulation 관련 메서드들을 다룰 예정에 있습니다. 그리고, 그를 통해서 여러분은 동적으로 UI를 보다 쉽게 조정할 수 있게 될 것이라 생각합니다.

그럼 다음 강좌에서 뵈어연~~~ jQueryBoard도 많은 테스트와 조언을 부탁드립니다.


authored by Taeyo

Posted by 바람이불면
,
jQuery : 탐색(Traversing) 메서드

필자의 잡담~

갈수록 인기를 얻어가는 태오의 jQuery 강좌.
7월에는 세미나로도 만나보실 수 있지 않을까 합니다. ㅎㅎ

이번 강좌는 트래버스(Traverse)와 관련된 강좌입니다. 트래버스라는 단어의 의미는 어떤 것을 횡단하거나, 탐색하거나, 검토하거나, 여기 저기 왔다갔다 하는 등의 의미를 갖는 단어입니다. 즉, jQuery의 트래버스 관련 메서드들은 개체들의 집합에서 다시금 특정 개체를 찾거나, 필터하거나, 추가하는 등의 작업을 위해 지원되는 API 메서드들의 그룹이라고 보시면 됩니다. 사실, 개체를 찾거나 필터하는 작업은 대부분 셀렉터를 통해서 이루어지지만, 1차적으로 셀렉터를 통해서 필터링을 하고 난 다음에, 그 결과 집합 내에서 추가적으로 필터링하거나, 추가 탐색하거나, 다른 결과 집합과 합치거나 하는 등의 작업을 하기 위해서는 이러한 메서드가 유용하게 사용됩니다.

트래버스와 관련된 많은 메서드들이 존재합니다만, 이들 전부에 대해서 이야기하는 것은 다소 어려울 것 같고요. 이전 강좌들과 마찬가지로 자주 사용하는 메서드들 중심적으로 설명을 드려볼까 합니다. 전체 트래버스 메서드는 http://docs.jquery.com/Traversing에서 살펴보실 수 있으니 완전한 목록은 정식 문서를 참고하시길 바라며언셔~~ 시작해 보겠습니다.

우선, 추가 필터링 관련 메서드들부터 알아보도록 하겠습니다. 다시 말씀드리지만, 이들은 모두 셀렉터를 통해서 1차적으로 일치되는 집합을 얻어낸 후, 그 집합에 대해서 사용할 수 있는 메서드들입니다.

eq(index) 일치된 요소들 중에서 인덱스와 일치하는 단일 요소를 가져옵니다.
filter(expr) 지정된 표현식과 매치되지 않는 모든 요소들을 제거합니다. 즉, 매치되는 요소들만을 가져옵니다.
filter(func) 지정된 함수와 매치되지 않는 모든 요소들을 제거합니다.
is(expr) 현재 개체와 표현식에 해당한다면 true, 표현식에 여러 개의 조건이 있다면 그 중 한 개만 맞아도 true가 됨
map(callback) jQuery 개체 안에 있는 요소들의 집합을 다른 집합으로 변경해서 옮긴다.
not(expr) 지정된 표현식과 매치되는 모든 요소들을 제거합니다. 즉, 매치되지 않는 요소들만을 가져옵니다.

이 중 특히나, filter 메서드와 is, not 메서드는 활용빈도가 높습니다. 셀렉터에 의해서 1차적으로 걸러낸 데이터를 가지고 작업을 하다가 2차적으로 추가 필터링을 한다거나, 특정 요소가 어떤 조건에 부합하는지를 검사한다거나 하는 작업은 꽤나 자주 하게되는 일이니까요.

메서드의 인자인 expr은 expression을 의미하는 것으로 여기에는 주로 셀렉터를 사용합니다.

그러면, 각각의 항목에 대해서 조금씩만 더 설명을 하고, 예제로 들어가 보도록 하겠습니다.

eq(index)라는 메서드는 사실 :eq(index) 라는 셀렉터 필터와 거의 동일합니다. 하나는 메서드이고 하나는 셀렉터 구문이라는 차이만 있는 것이죠. 다음 예제 코드를 한번 보세요.

$("div:eq(1)").addClass("blue");
$("div").eq(1).addClass("blue");

첫 번째 구문은 이미 익숙한 셀렉터이죠? 다들 아시겠지만, 현재 문서에 있는 div 중 2번째로 등장하는 div를 얻어내는 셀렉터입니다. 그리고, 그 요소에 대해 blue 라는 css 클래스를 적용하고 있습니다.

이는 eq() 메서드를 사용하는 두 번째 구문처럼 작성할 수도 있습니다.일단 모든 div들을 셀렉트한 다음, 그 중 2번째 개체를 얻어내기 위해서 eq(1)이라는 메서드를 사용하는 것이죠. 사실, 이 둘은 결과적으로 동일합니다. 그렇다면, 어떤 방법을 쓰던지는 우리의 맘일까요? 그럼요~ 여러분의 마음입니다. 다만!!!

eq() 메서드를 사용한 경우에는 end()라는 엄청난 초능력자 메서드의 도움을 받아 이전 상태로 돌아갈 수 있다는 장점이 있습니다(eq() 메서드 뿐만 아니라 대부분의 조작 메서드는 end() 메서드를 사용할 수 있습니다).

원래 end() 메서드는 이번 강좌 후반에 설명을 드릴 예정이었던 메서드이긴 합니다만, 말이 나온 김에, 그리고 여기가 보다 적절한 자리인 것 같기에 앞당겨 설명을 드려봅니다.

end() 메서드 :
현재 일치된 개체 집합을 변경하여, 방금 일어난 "파괴적인 작업" 직전의 상태로 되돌린다.

마치 1분 전의 과거로 돌아갈 수 있는 초능력자를 보는 듯한 표정을 지으시면 됩니다. 이 녀석은 그런 능력을 가지고 있으니까요. 대부분의 조작 메서드, 트래버스 메서드에 end()라는 메서드를 적용할 수 있습니다. 이는 자기가 되돌릴 과거 상태가 존재한다면, 현재의 개체집합을 그 상태로 되돌리고, 되돌릴 과거없는 상태라면 단순히 빈 값을 반환합니다.

앞의 예제에 이를 사용해 보기 위해서, 다음과 같은 조건에 맞는 셀렉터를 한번 작성해 보도록 해요.

"모든 짝수 번째 div를 구한 다음, 그 중 첫 번째 div는 orange라는 배경색을 적용하고, 두 번째 div는 blue 배경색을 적용하라"

end() 메서드를 모르는 상황이었다면 여러분은 이를 다음과 같이 작성할 듯 합니다.

$("div:odd").eq(0).css("background""orange");
$("div:odd").eq(1).css("background""blue");

우선, $("div:odd")를 통해서 짝수번째 div들을 구한 다음, eq() 메서드를 사용해서 그 중 첫 번째와 두 번째 요소에 각각 접근하는 것이죠. 코드가 두 줄이라는 것은 그렇다치더라도, 각각에 대해서 동일한 검색을 두번이나 반복하는 부분은 썩 마음에 들지 않습니다.

해서, 이 코드를 다음과 같이 할 수 있으면 좋을 것 같다는 생각이 들지 않나요?

$("div:odd")
            .eq(
0).css("background""orange")
            .eq(
1).css("background""blue");

그러면 참 좋겠습니다만, 안타깝게도 이는 올바로 동작하지 않습니다. 왜냐하면, 이미 $("div:odd").eq(0)으로 인해서 매치되는 집합이 전체 div:odd가 아니라 단일 요소로 줄어든 상황에서는 eq(1)을 해봐야 아무런 대상도 찾을 수 없기 때문이죠. 그렇다면, 최종 요소에 대해 작업을 하고 방금 이전의 상태로 돌아가서 다시 검색할 수 있다면 얼마나 좋을까 하는 생각이 들지 않나요? 들었죠? (그렇다면, 내려 놓으세요~ 아. 몹쓸 개그였습니다)

바로 여기서 end()가 엄청난 능력을 발휘하게 됩니다. 상기 코드는 다음과 같이 작성할 수 있습니다.

$("div:odd")
            .eq(
0).css("background""orange")
            
.end()     // $("div:odd")와 동일
            
.eq(1).css("background""blue");

여기서 end()는 eq(0)을 하기 직전의 상태로 되돌리는 역할을 합니다. 고로, end()를 사용하면 단 한줄의 메서드 체인으로 원하는 작업을 마무리 할 수 있게 되는 것입니다. 멋지죠?

end()는 jQuery에서 대단히 심도있게 사용되므로, 잘 기억을 해두시기 바랍니다. 하긴, 기억을 하고 싶지 않아도 저절로 하실 수 밖에 없게 될 듯 해 보이네요. 하하

그럼, 이제 필터 메서드에 대해서 알아보도록 하죠.

filter(expr)은 결과적으로는 일반 셀렉터를 통한 검색하는 것과 동일하다고 보시면 됩니다. 다만, 셀렉터는 문서상에 존재하는 개체들을 대상으로 검색한다면, 이는 메모리상에 존재하는 개체 집합을 대상으로 필터링을 한다는 부분에서 차이가 있습니다. 즉, 셀렉터에 의한 1차적 검색 집합에 대해서 다시 추가적으로 필터링(걸러냄)을 하고 싶은 경우에 사용하는 API 메서드라는 것이죠. 인자로는 필터링을 위한 표현식을 제공할 수 있고요. 그 표현식과 매치되지 않는 모든 요소들을 개체 집합(메모리)에서 제거하여 필터링된 결과를 얻습니다.

반면, 유사한 API로 Filter(func)도 있는데요. 이는 인자로 표현식이 아닌 함수를 사용하지요. 즉, 필터링(걸러냄)을 함수를 통해서 보다 세밀하게 제어하고 싶은 경우에 사용합니다. 필터링 조건이 일반적인 표현식으로 설명하기 어려운 경우에 별도의 함수로 작성을 해서 그 안에서 어떻게 필터를 수행할 것인지를 지정하는 것이죠.

가장 간단하게 예를 들면, 다음 2개의 표현은 결과적으로는 동일하다고 볼 수 있습니다.

$("div:odd"
$(
"div").filter(":odd")

다만, 앞의 예제와 마찬가지로 filter 메서드를 사용한 경우는 end() 메서드의 도움을 얻어 이전 상태로 되돌릴 수가 있다는 장점이 있죠.

예를 들면, 다음과 같이 말입니다. 다음 코드는 앞선 예제에서 $("div:odd")를 $("div").filter(":odd")로 변경해 본 것입니다.

$("div").filter(":odd")
    .eq(
0).css("background""orange")
    .end()     
// filter(":odd")
    
.eq(1).css("background""blue")
    .end()     
// filter(":odd")
    
.css("color""red");   //이 코드는 odd인 div들의 폰트색상을 red로 적용한다.

이는 셀렉터를 사용하여 전체 div를 1차적 선택한 다음에 filter() 메서드를 사용하여 그 중 짝수번째 인 것들만 다시 필터링을 하고요. 그 짝수번째 div들 중에서 첫 번째 녀석(eq(0))은 오렌지 배경색으로 설정하고, 다시 짝수번째 div들 중 두번째 녀석(eq(1))은 파란 배경색으로 설정하고, 마지막으로 모든 짝수번째 div에 대해서 빨간 폰트를 지정하고 있습니다.

end() 메서드는 한번만 가능한 것이 아니라 메서드 체인 내에서 계속적으로 사용하여 방금 전 상태로 계속 올라갈 수 있습니다. 대단하죠?

또한, filter(expr) 메서드와 반대되는 메서드로 not(expr) 메서드도 있습니다. Filter(expr) 메서드가 현재의 집합에서 expr 표현식과 매치되는 것만을 가져온다면, not(expr) 메서드는 현재의 집합에서 expr 표현식과 매치되지 않는 것들만을 가져옵니다. 그렇기에, 다음 두 표현식은 동일한 개체 집합을 갖게 된다고 볼 수 있습니다.

$("div").filter(":odd")
$(
"div").not(":even")

하하. 재미있네요. 저만 재미있나요?

또한, 중요한 메서드로 is(expr)도 있습니다. 이는 그 이름이 의미하듯이, 개체를 비교하여 true/false를 알려주는 메서드인데요. 예를 들어, 다음의 코드를 한번 살펴보시죠.

var $myDiv $("div").eq(5);
if 
($myDiv.is("div")) 
{
  $myDiv.css(
"border""4px solid yellow");
}

이 코드는 우선 div 중 6번째 요소를 가져와서 $myDiv라는 변수로 참조하고 있습니다. 일단, 요 부분에서도 드릴 말씀이 하나 있는데요. 일반적으로 jQuery에서는 jQuery 개체를 일시적으로 참조하는 변수명에는 $로 시작하는 변수명을 쓰도록 은근히 권유하고 있습니다. 그래야 일반 변수들과 jQuery 개체변수가 쉽게 구분되기 때문이지요. 물론, 꼭 그래야 하는 것은 아니지만 가독성이 좋아지니 가급적 그렇게 하시길 권해봅니다.

어쨌든, 위의 소스는 $myDiv 변수에 6번째 div를 참조한 뒤, is(expr) 메서드를 사용해서 그 개체가 "div" 개체인지를 비교하여, 만일 "div"가 맞다면, 그 div에 대해서는 노란색의 두꺼운 테두리를 갖도록 지정하고 있지요.

expr인자에는 일반적으로 "div"처럼 단일 구문을 작성하곤 하지만, ","를 구분자로 사용하여 여러 개의 표현식을 나열할 수도 있습니다. 다음과 같이 말이죠.

$myDiv.is(".orange, .blue, .lightblue")

이는 $myDiv가 orange나 blue, lightblue css 클래스 중 하나라도 가지고 있으면 true가 됩니다. ^^

그리고, 그리 자주 사용되는 메서드는 아닙니다만 map(callback)라는 것이 있지요. 사실, 이는 생각보다 사용빈도가 적어서 아주 자세하게 설명하지는 않겠지만(자세한 설명은 공식 사이트에서 샘플 코드를 살펴보시면 쉽게 이해가 될 겁니다), jQuery 개체 안에 있는 요소들의 집합을 다른 집합으로 변경해서 옮긴다는 것은 기억해 두시기 바랍니다. 예를 들어, div 안에 각각 a부터 z 까지 소문자 알파벳이 기록 되어 있는 상황에서 다음과 같은 코드를 사용한다면

var arr $("div").map(function() {
   
return $(this).text().toUpperCase();
});

arr 이라는 변수에는 A부터 Z 까지 대문자로 구성된 배열이 채워진다는 것이죠. 셀렉터로 선택된 개체들의 집합에서 원하는 데이터를 별도의 다른 집합으로 옮길 수 있다는 것이 이 메서드의 특징입니다. ^^

자. 그럼 지금까지 설명한 것이 모두 포함된 예제를 한번 같이 해볼까요? 다음은 Traverse.htm 페이지의 소스입니다.

<html xmlns="http://www.w3.org/1999/xhtml" >
  
<head runat="server">
    
<title></title>
    
<script src="jquery-1.3.2.min.js" type="text/javascript"></script>
      
<script>
          $(
document).ready(function() {

              $(
"div").eq(0).addClass("lightblue");

              
$("div").filter(":odd")
                .eq(
0).css("background""orange")
                .end()
                .eq(
1).css("background""blue")
                .end()
                .css(
"color""red");

              var 
$myDiv $("div").eq(5);
              if 
($myDiv.is("div")) $myDiv.css("border""4px solid yellow");
              if 
($myDiv.is(".orange, .blue, .lightblue")) $myDiv.text("칼라");

              var 
arr $("div").map(function() {
                  
return $(this).text().toUpperCase();
              
});
          
});
    </
script>
    
<style>
      div 
{ width:60px; height:60px; margin:10px; float:left; 
           border
:2px solid blue  ; }
      
.blue { bac  kground:blue; }
      
.lightblue { background:lightblue; }
      
.orange { background:orange; }
    </
style>
  
</head>
<body>
  
<div>a</div>
  
<div>b</div>
  
<div>c</div>
  
<div>d</div>
  
<div>e</div>
  
<div class="orange">f</div>
  
<div>g</div>
</body>
</html>

그리고, 다음은 이 페이지의 결과 화면이고요. 이미 앞서서 설명드린 코드들이 들어있는 것이기에 별도의 소스 설명은 필요없을 듯 합니다 ^^

이 부분을 꽤나 길게 설명드린 것은 그만큼 자주 사용하기 때문이니까요. 꼭 각 구문의 역할을 확실히 이해하시기를 부탁드립니다.

그러면, 이번에는 트래버스 관련 메서드들 중 찾기와 관계된 API들을 살펴볼까요?(앞서 말한 바와 같이 이 목록은 전체 목록이 아닙니다. 자주 사용하는 일부만을 담고 있으니 전체 목록은 공식 문서인 http://docs.jquery.com/Traversing에서 확인하세요)

find(expr) 지정된 표현식과 일치하는 요소를 검색한다.
add(expr) 현재 요소에 expr와 일치하는 요소를 추가한다. 즉, 일치되는 요소가 추가 확장되는 의미이다.
next(expr) 현재 요소 바로 다음에 나오는 형제 요소를 선택한다. expr 을 지정하면 그로 필터링을 수행한다
nextAll(expr) 현재 요소 바로 다음에 나오는 모든 형제 요소들을 선택한다. expr 을 지정하면 그로 필터링을 수행한다
parent(expr) 현재 요소의 부모를 선택한다. expr 을 지정하면 그로 필터링을 수행한다
parents(expr) 현재 요소의 고유한 부모 요소들을 선택한다. expr 을 지정하면 그로 필터링을 수행한다
prev(expr) 현재 요소보다 앞서 나오는 형제 요소를 선택한다. expr 을 지정하면 그로 필터링을 수행한다
prevAll(expr) 현재 요소보다 앞서 나오는 모든 형제 요소들을 선택한다. expr 을 지정하면 그로 필터링을 수행한다
siblings(expr) 현재 요소의 모든 형제 요소들(자신은 제외)을 선택한다. expr 을 지정하면 그로 필터링을 수행한다

메서드 명칭이 직관적이어서 각각의 API의 역할이 쉽게 이해가 될 듯 합니다.

가장 재미있는 메서드는 그 이름 때문에 오해하기 쉬운 add(expr)인데요. 이는 셀렉터에 의해 1차적으로 검색된 결과 집합에 추가적인 검색 집합을 합치는(add) 역할을 합니다. 말로 하니 설명이 좀 모호한데요. 다음 코드를 한번 보시죠.

$("div").add("p").css("background""yellow");

add란 이름 때문에 얼핏 보면, 마치 div 요소 안에다가 p 요소를 생성하여 추가하는 것으로 느껴질 수 있는데요. 사실은 검색 결과가 합쳐지는 것입니다. 즉, $("div").add("p") 라는 것은 $("div, p")와 같다고 볼 수 있다는 것이죠. 해서, 다음과 같은 구문은

$("div")
        .css(
"border""1px solid red")
        .add(
"p")
        .css(
"background""yellow");

모든 div에게는 붉은색 테두리를 주고, div에 더하여 모든 p 요소들에게 노란 배경색을 주는 표현이 됩니다. 즉, 모든 div와 p는 노란 배경색을 갖지만, 붉은 테두리는 div만 갖게 되는 것이죠. ㅎㅎ

그 다음으로 이야기할 만한 것은 find(expr) 인데요. 이는 현재 검색된 요소의 자식을 대상으로 추가적인 검색을 수행합니다. 가끔 어떤 분들은 filter()와 find()를 헛갈려 하시더군요. 둘의 차이는 사실 아주 간단합니다. filter()는 검색된 결과 집합에서 그 개체들에 대해서 다시금 필터링을 하는 것이고요. find()는 검색된 결과 집합에서 찾는 것이 아니라, 결과 집합 내의 각 요소의 "자식"에게서 찾는 겁니다. 그래도 어렵다면, 다음의 차이를 구분하실 수 있으면 되는데요.

$("div:odd").filter("p")
$(
"div:odd").find("p")

위의 코드 중 첫번째 구문인 filter 구문의 결과는 "없음" 입니다. 왜냐구요? 셀렉터에 의해서 짝수번째 div 들만 검색한 다음, 그 div들 중에서 p라는 태그를 갖는 놈들을 가져올라고 하니 있을리가 없죠. 모두 div 태그들만 있는 집합에서 뜬금없는 p 태그로의 필터링은 뭔가요? 당황스럽죠? ㅎㅎ. 해서, filter() 메서드에서 인자로 요소명을 주는 경우는 사실 거의 없죠.

반면, find()에 의한 결과는 아주 잘 나올 것입니다(물론, div 요소의 하위로 p요소가 있다고 가정했을 경우에 말이죠). Div들 중에 p 태그를 갖는 놈이 있다면, 그 p 요소들으 find() 명령에 의해서 수루룩 일치대상이 될 것입니다.

알고나니 쉽죠? 항상 모든 일이 그런 것 같습니다. 알기 전에는 대단한 것처럼 보이지만, 막상 알고나면 별 것 아니죠. 하지만, 알고 모름의 작은 차이가 가끔은 차등 대접의 원인이 되기도 합니다요. 그래서, 어릴때 부모님이 공부해라 공부해라 하시는 것인가 봅니다.

그 외의 메서드인 next(), prev(), nextAll() 이런 것들은 굳이 설명을 드릴 필요가 없을 것 같아요. 이름에서도 느껴질 뿐더러, 다른 언어에서도 이런 류의 메서드는 항상 있어왔고, 그 역할도 항상 똑같기 때문이죠 ^^

자. 방금 배운 것들을 그런대로 섞어본 종합 예제 하나 더 나갑니다.

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
  
<title></title>
  
<script src="jquery-1.3.2.min.js" type="text/javascript"></script>
  
<script type="text/javascript">
    $(
document).ready(function() {

      $(
"div:eq(1)")
        .siblings().css(
"border""1px solid blue")
        .end()
        .next().text(
"third")
        .end()
        .nextAll().css(
"background""yellow");
                
      
$("div").find("p").css("color""blue")
        .add(
"span").css("border""1px solid red");
         
    
});
  </
script>
  
<style>
    
* { font-size:12px; font-family:돋움; }
    div 
{ width:60px; height:60px; margin:10px; float:left; 
          border
:1px solid silver; padding: 5px }
  </
style>
</head>
<body>
  
<div><p>p a</p> </div>
  
<div><p>p b</p></div>
  
<div><p>p c</p></div>
  
<div><br /><span>span d</span></div>
  
<div><br /><span>span e</span></div>
</body>
</html>

예제는 siblings()와 next(), nextAll() 그리고 find()와 add()까지 골고루 섞어서 사용하는 대단히 적절하다 못해 아니꼽기까지 한 출중한 예제가 아닐 수 없습니다.

$("div:eq(1)")
  .siblings().css(
"border""1px solid blue")
  .end()    
// $("div:eq(1)")
  
.next().text("third")
  .end()    
// $("div:eq(1)")
  
.nextAll().css("background""yellow");

라는 구문은 문서 상에 존재하는 div 중 두번째 div를 1차적으로 가져온 다음, 그와 친구들인 모든 요소들(siblings())에게 파란색 테두리를 적용하고요. end()를 사용해서 다시 두번째 div로 돌아온 다음, 자신의 바로 뒤에 나오는 요소(next())의 텍스트를 third로 바꾸고 있습니다. 그리고, 또 end()를 사용해서 두번째 div로 되돌아 온다음, 자신의 뒤로 나오는 모든 형제 요소들에게 노란색 배경색을 지정하고 있습니다.

가급적 end() 메서드 뒤에는 // 주석을 사용하여, end()로 인한 대상 집합이 현재 무엇인지를 적어두시는 좋습니다. 그러면, 보다 코드가 직관적이 될테니까요 ^^

그러면, 브라우저로 이를 실행한 결과는 어떨까요? ㅎㅎ

예상한대로의 결과가 나왔나요? 그러길 바랍니다. ^^

트래버스 강좌는 이걸로 마무리가 일단락 되었습니다. 이로써, 대부분의 jQuery의 일반적인 API 메서드들은 대부분 언급을 한 것 같긴 한데요. css 관련 메서드나 어트리뷰트 관련 메서드는 사실 언급을 제대로 하지 않았다는 것을 이제야 깨달았습니다. ㅎㅎ

해서, 다음 강좌는 그에 대한 강좌로 준비할까 생각하는데요. 한편으로는 굳이 그것을 제가 설명드릴 필요가 없어보이기도 해서, 그 부분은 자습에 맡기고 저는 이벤트나 이펙트 쪽의 설명으로 넘어갈까 고민하고 있기도 합니다.

어느쪽으로 방향을 잡을지는 여러분의 리플을 통해서 결정해 보는 것도 좋겠네요.
그러면, 오늘도 좋은 하루 되세요~~

Ps : 아참. 7월에는 jQuery의 기초편 총정리의 의미로 3시간짜리 무료 세미나를 진행할까 고민하고 있기도 합니다. MS에 세미나실을 빌릴 수 있는지 확인을 해봐야겠네요.


authored by Taeyo

Posted by 바람이불면
,