JQuery 정복하기 2 (wrapper, 선택자, chain)

    래퍼(wrapper)란?

    jQuery(엘리먼트 오브젝트 | 'CSS스타일 선택자')
    bold 표시한 부분이 래퍼, 인자로 전달된 요소들에 jQuery의 기능성을 부가해서 반환한다.


    레퍼의 안전한 사용

    $(엘리먼트) 와 jQuery(엘리먼트)는 같은 의미이지만 $를 사용하는 다른 라이브러리들과의 충돌 때문에 다음과 같은 방법을 사용한다.

    <script type="text/javascript">
    //$ 대신 jQuery를 사용
    jQuery('body').html('hello world');
    </script>
    <script type="text/javascript">
    //$를 함수의 지역변수로 선언해서 외부에 있을지 모르는 타 라이브러리의 $와의 충돌을 예방
    (function($){
        $('body').html('hello world');
    })(jQuery)
    </script>

    제어 대상을 지정하는 방법

    jQuery( selector, [context] )
    jQuery( element )

    예제 1. jQuery( selector, [context] )

    <html>
        <body>
            <ul>
                <li>test2</li>
            </ul>
            <ul class="foo">
                <li>test</li>
            </ul>
            <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
            <script type="text/javascript">
                (function($){            
                    $('ul.foo').click( function() {
                        $('li', this).css('background-color','red');
                    });
                })(jQuery)
            </script>
        </body>
    </html>

    예제 2. jQuery( element )

    <html>
        <body>
            <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
            <script type="text/javascript">
                jQuery(document.body).css( "background-color", "black" );
            </script>
        </body>
    </html>



    선택자란?

    jQuery wrapper에는 CSS 선택자가 위치할 수 있는데, 이를 통해서 제어하려는 엘리먼트를 빠르고 정확하게 지정할 수 있다.


    선택자 탐색기

    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <style>
                body{
                    font-size:12px;
                }
                .selected,.selected_parent {
                    background-color: red !important;
                    color:white;
                    border:2px solid red !important;
                }
                input.btn {
                    width:130px;
                }
                ul, .live{
                    float:left;
                    width:150px;
                    padding-left:20px;
                    margin:0;
                }
                textarea{
                    float:left;
                    width: 400px;
                    height:150px;
                    font-size:11px;
                    margin-left:20px;
                }
                .clear{
                    clear: both;
                }
                .sample{
                    margin-bottom: 20px;
                }
            </style>
            <script src="http://code.jquery.com/jquery-latest.js"></script>
        </head>
        <body>
            <fieldset>
                <legend> 기본 </legend>
                <div class="sample">
                    <ul id="tutorials">
                        <li class="tutorial" id="HTML"> HTML </li>
                        <li class="tutorial" id="CSS"> CSS </li>
                        <li class="tutorial" id="javascript"> javascript </li>
                        <li class="tutorial" id="jquery"> jQuery </li>
                        <li class="tutorial" id="PHP"> PHP </li>
                        <li class="tutorial" id="MYSQL"> MYSQL </li>
                    </ul>
    <textarea>
    <ul id="tutorials">
        <li class="tutorial" id="HTML"> HTML </li>
        <li class="tutorial" id="CSS"> CSS </li>
        <li class="tutorial" id="javascript"> javascript </li>
        <li class="tutorial" id="jquery"> jQuery </li>
        <li jclass="tutorial" id="PHP"> PHP </li>
        <li class="tutorial" id="MYSQL"> MYSQL </li>
    </ul>
    </textarea>
                <div class="clear"></div>
                    </div>
                <input class="btn" type="button" id="#jquerybtn" value="#jquery" /> - id 선택자 <br />
                <input class="btn" type="button" id=".tutorial" value=".tutorial" /> - class 선택자 <br />
                <input class="btn" type="button" value="li" /> - 엘리먼트 선택자 <br />
                <input class="btn" type="button" value="#jquery, #MYSQL" /> - 다중 선택자 <br />
            </fieldset>
            
            
            <fieldset>
                <legend> filter </legend>
                <div class="sample">
                    <ul id="list">
                        <li> HTML </li>
                        <li> CSS </li>
                        <li> javascript </li>
                        <li> PHP </li>
                        <li> MYSQL </li>
                    </ul>
    <textarea>
    <ul id="list">
        <li> HTML </li>
        <li> CSS </li>
        <li> javascript </li>
        <li> PHP </li>
        <li> MYSQL </li>
    </ul>    
    </textarea>
                    <div class="clear"></div>
                </div>
                <input class="btn" type="button" value="#list li:eq(2)" /> - 인자와 인덱스가 동일한 엘리먼트를 찾아내는 선택자 <br />
                <input class="btn" type="button" value="#list li:gt(1)" /> - 인자 보다 인덱스가 큰 엘리먼트를 찾아내는 선택자 <br />
                <input class="btn" type="button" value="#list li:lt(2)" /> - 인자 보다 인덱스가 작은 엘리먼트를 찾아내는 선택자 <br />
                <input class="btn" type="button" value="#list li:even" /> - 첫번째, 세번째... 홀 수의 인덱스 값을 가진 엘리먼트에 대한 선택자 <br />
                <input class="btn" type="button" value="#list li:odd" /> - 두번째, 네번째.... 짝 수의 인덱스 값을 가진 엘리먼트에 대한 선택자 <br />
                <input class="btn" type="button" value="#list li:first" /> - 첫번재 인덱스 엘리먼트에 대한 선택자 <br />
                <input class="btn" type="button" value="#list li:last" /> - 마지막 인덱스 엘리먼트에 대한 선택자 <br />
            </fieldset>
            
            
            <fieldset>
                <legend> 속성 </legend>
                <div class="sample">
                    <ul id="attribute">
                        <li target="ABCD">ABCD</li>
                        <li target="BCDE">BCDE</li>
                        <li target="CDEF">CDEF</li>
                        <li target="DEFG">DEFG</li>
                        <li target="EFGH">EFGH</li>
                        <li id="FGHI" target="FGHI">FGHI</li>
                    </ul>
    <textarea>
    <ul id="attribute">
        <li target="ABCD">ABCD</li>
        <li target="BCDE">BCDE</li>
        <li target="CDEF">CDEF</li>
        <li target="DEFG">DEFG</li>
        <li target="EFGH">EFGH</li>
        <li id="FGHI" target="FGHI">FGHI</li>
    </ul>    
    </textarea>
                    <div class="clear"></div>
                </div>
                <input class="btn" type="button" value="[target*=&quot;BC&quot;]" /> - 속성의 값에 주어진 문자열이 포함되는 엘리먼트를 찾아내는 선택자 <br />
                <input class="btn" type="button" value="[target=&quot;DEFG&quot;]" /> - 속성의 값과 주어진 문자열이 일치하는 엘리먼트를 찾아내는 선택자 <br />
                <input class="btn" type="button" value="[target!=&quot;DEFG&quot;]" /> - 속성의 값과 주어진 문자열이 일치하지 않는 엘리먼트를 찾아내는 선택자 <br />
    <input class="btn" type="button" value="[target^=&quot;B&quot;]" /> - 속성의 값으로 주어진 문자열이 처음 등장하는 엘리먼트를 찾아내는 선택자 <br />
    <input class="btn" type="button" value="[target$=&quot;H&quot;]" /> - 속성의 값으로 주어진 문자열이 마지막으로 등장하는 엘리먼트를 찾아내는 선택자 <br />
    <input class="btn" type="button" value="[target]" /> - 속성이 존재하는 엘리먼트를 찾아내는 선택자 <br />
    <input class="btn" type="button" value="[target][id]" /> - 속성들이 존재하는 엘리먼트를 찾아내는 선택자
            </fieldset>
            <fieldset>
                <legend>Form</legend>
                    <div class="live">
                        <div>
                            <input type="text" disabled="disabled" value="disabled" />
                            <input type="text" value="enabled"/>
                        </div>
                        <div><input type="checkbox" checked="checked" /></div>
                        <div><input type="checkbox" /></div>
                    </div>
    <textarea class="sample">
    <div>
        <input type="text" disabled="disabled" value="disabled" />
        <input type="text" value="enabled"/>
    </div>
    <div><input type="checkbox" checked="checked" /></div>
    <div><input type="checkbox" /></div>
    </textarea>
                <div class="clear"></div>
                <input class="btn" type="button" value="[type=&quot;text&quot;]" /> - 폼 엘리먼트를 선택할 때는 속성 셀렉터를 사용한다. <br />
                <input class="btn" type="button" value="[type=&quot;text&quot;]:disabled" /> - disabled 속성의 값이 disabled인 엘리먼트를 찾아내는 선택자<br />
                <input class="btn" type="button" value="[type=&quot;text&quot;]:enabled" /> - disabled 속성의 값이 enabled인 엘리먼트를 찾아내는 선택자<br />
                <input class="btn" type="button" value="input:checked" /> - 체크박스 중 체크가 된 엘리먼트를 찾아내는 선택자 <br />
            </fieldset>
            <script>
                $('input').on('click', function() {
                    $this = $(this);
                    $('*').removeClass('selected');
                    switch($this.attr('value')) {
                        case '#jquery':
                            $('#jquery').addClass('selected');
                            break;
                        case '.tutorial':
                            $('.tutorial').addClass('selected');
                            break;
                        case 'li':
                            $('li').addClass('selected');
                            break;
                        case '#jquery, #MYSQL':
                            $('#jquery, #MYSQL').addClass('selected');    
                            break;
                        case '#list li:eq(2)':
                            $('#list li:eq(2)').addClass('selected');
                            break;
                        case '#list li:gt(1)':
                            $('#list li:gt(1)').addClass('selected');
                            break;
                        case '#list li:lt(2)':
                            $('#list li:lt(2)').addClass('selected');
                            break;
                        case '#list li:even':
                            $('#list li:even').addClass('selected');
                            break;
                        case '#list li:odd':
                            $('#list li:odd').addClass('selected');
                            break;
                        case '#list li:first':
                            $('#list li:first').addClass('selected');
                            break;
                        case '#list li:last':
                            $('#list li:last').addClass('selected');
                            break;
                        case '[target*="BC"]':
                            $('li[target*="BC"]').addClass('selected');
                            break;
                        case '[target="DEFG"]':
                            $('li[target="DEFG"]').addClass('selected');
                            break;
                        case '[target!="DEFG"]':
                            $('li[target!="DEFG"]').addClass('selected');
                            break;
                        case '[target^="B"]':
                            $('li[target^="B"]').addClass('selected');
                            break;
                        case '[target$="H"]':
                            $('li[target$="H"]').addClass('selected');
                            break;
                        case '[target]':
                            $('li[target]').addClass('selected');
                            break;
                        case '[target][id]':
                            $('li[target][id]').addClass('selected');
                            break;
                        case '[type="text"]':
                            $('[type="text"]').addClass('selected');                    
                            break;
                        case '[type="text"]:disabled':
                            $('[type="text"]:disabled').addClass('selected');
                            break;
                        case '[type="text"]:enabled':
                            $('[type="text"]:enabled').addClass('selected');
                            break;
                        case 'input:checked':
                            $('input:checked').parent().addClass('selected');;
                            break;
                        
                    }
                })
            </script>
        </body>
    </html> 
     

    Chain이란?

    jQuery의 메소드들은 반환값으로 자기 자신을 반환해야 한다는 규칙을 가지고 있다.
    이를 이용하면 한번 선택한 대상에 대해서 연속적인 제어를 할 수 있다.

    예제1. jQuery를 이용해서 코딩하는 경우

    <html>
        <body>
            <a id="tutorial" href="http://jquery.com" target="_self">jQuery</a>
            <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
            <script type="text/javascript">
                jQuery('#tutorial').attr('href', 'http://jquery.org').attr('target', '_blank').css('color', 'red');
            </script>
        </body>
    

    예제2. javascript의 DOM을 이용해서 코딩하는 경우

    <html>
         <body>
             <a id="tutorial" href="http://jquery.com" target="_self">jQuery</a>
             <script type="text/javascript">
                 var tutorial = document.getElementById('tutorial');
                 tutorial.setAttribute('href', 'http://jquery.org');
                 tutorial.setAttribute('target', '_blank');
                 tutorial.style.color = 'red';
             </script>
         </body>
     </html>
    

    chain의 장점

    • 코드가 간결해진다.
    • 인간의 언어와 유사해서 사고의 자연스러운 과정과 일치함.

    탐색(traversing)

    예제3. traversing을 이용해서 chain안에서 대상을 움직일 수 있다.

    <html>
        <body>
            <ul class="first">
                <li class="foo"> list item 1 </li>
                <li> list item 2 </li>
                <li class="bar"> list item 3 </li>
            </ul>
            <ul class="second">
                <li class="foo"> list item 1 </li>
                <li> list item 2 </li>
                <li class="bar"> list item 3 </li>
            </ul>
            <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
            <script type="text/javascript">$('ul.first').find('.foo').css('background-color', 'red').end().find('.bar').css('background-color', 'green');</script>
        </body>
    </html>
    반응형

    댓글