jQuery選擇器


  jquery中的選擇器共分為四大類。其簡單結構如下:

  基本選擇器

        |-----ID選擇器

        |-----類選擇器

        |-----元素選擇器

        |-----*選擇器

        |-----聯合選擇器

  層級選擇器

        |-----祖先-后代選擇器

        |-----父輩-字輩選擇器

        |-----同輩選擇器

  過濾選擇器

        |-----基本過濾選擇器

        |-----內容過濾選擇器

        |-----可見性過濾選擇器

        |-----屬性過濾選擇器

        |-----子元素過濾選擇器

        |-----表單對象屬性過濾選擇器

  表單選擇器

 


  對於jquery選擇器的詳細描述如下:

  一.  基本選擇器

  1.  ID選擇器

  $('#idName'):返回一個封裝了指定id的dom元素的jQuery對象。

  注:如果有多個相同的id值,則以第一個id為准。若沒有這個id,則返回空的jquery對象

 

  2.  類選擇器(class)

  $('.className'):返回封裝了帶有指定css類名的所有DOM元素的jQuery對象,可能有一個或多個。若沒有這個class則返回空jquery對象。

 

  3.  元素選擇器(element)

  $('span'):返回封裝了指定標簽名稱的DOM元素的jQuery對象。若沒有這個標簽名稱則返回空jquery對象。

 

  4.  *選擇器

  $('*'):選擇文檔中的所有元素。

 

  5.聯合選擇器

  (div,p,span):div,p,span(′div,p,span′):選擇div,p,span標簽的元素。在這種選擇器中,可以在()中添加多個選擇器,而每個選擇器也可以很復雜,比如:

  $('div p:first-child,p>span:nth-child(3),span:not(.one,.two)')等。

 

  二.  層級選擇器

  1.  祖先-后代選擇器

  $('div p'):查找div中所有后代中的p元素 

 

  2.  父輩-子輩選擇器

  $('div>p'):查找div中所有的子代中的p元素

 

  3.  同輩選擇器

  a.  $('h2 + p'):查找和h2相鄰的p元素,並且h2和p必須是同級元素且相鄰的,如

復制代碼
<div>
    <h2>title</h2>
    <p>content</p>
</div>
<p>outer</p>
<script>
    alert($('div+p').text());
</script>
復制代碼

  這段代碼的結果是content。

 

  b.  $('h2~p'):查找h2后面的所有的p元素,並且h2和p必須是同級元素,但是不需要是相鄰的,如

復制代碼
<div>
    <p class = 'a'>p1</p>
    <span>span1</span>
    <p>p2</p>
    <span>span2</span>
    <p>p3</p>
    <span>span3</span>
</div>
<script>
    $(function(){
        $('.a+span').text('11111');
    });
</script>
復制代碼

   這段代碼中查找的是class為a的后面所有的同級的span元素,將其內容改為11111,可見結果是三個span的內容都為11111。

 

  三.  過濾選擇器

  1.  基本過濾選擇器

  a.  首尾元素選擇器

  $('div:first'):查找第一個div元素

  $('div:last'):查找最后一個div元素
  注:這兩個選擇器值選擇一個元素,因此從上到下只要找到一個符合條件的元素就立即返回

復制代碼
<div>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <ul>
        <li>4</li>
        <li>5</li>
        <li>6</li>
    </ul>
</div>
<script>
    $(function(){
        alert($('ul li:first').html());
    });
</script>
復制代碼

  上述代碼的結果是第一個ul的第一個li中的1。

  

  b.  非選擇器

  $('span:not(#d)'):選擇ID不是d的span元素

  注::not()括號內也為選擇器,比如:not(ul li:first-child))或者更加復雜的選擇器都可以組合。

復制代碼
<ul>
    <li class = 'd'>222</li>
    <li class = 'd'>222</li>
    <li class = 'd'>222</li>
    <li>222</li>
    <li>222</li>
    <li class = 'd'>222</li>
</ul>
<script>
    $(function(){
        $('.d:not(ul>li:first-child):not(ul>li:last-child)').text('111');
    });
</script>
復制代碼

  這段代碼的結果是第2,3的text為111。

 

  c.  奇偶選擇器

  $('div:even'):查找dom中索引值為基數的div元素

  注:對於$('div:even')來說,這種選擇方式是不區分父輩還是字輩的,是統一進行索引編號的。但是這種情況基本使用不到的。另外索引值使用0開始的,因為0也算偶數,所以第一個都是被選擇的。

復制代碼
<div class = 'one'>0                    -------index = 0 even
    <div class = 'two'>1                -------index = 1
        <div class = 'three'>1.1</div>  -------index = 2 even
    </div>
    <div class = 'four'>2</div>         -------index = 3
</div>
<div class = 'five'>3</div>             -------index = 4 even
<script>
    $(function(){
        $('div:even').each(function(){
            alert($(this).text());
        });
    });
</script>
復制代碼

  這段代碼就說明了當出現使用(div:even)classone,three,fivedivtestdiv):(′div:even′)時的情況,其結果是將class為one,three,five的div的test輸出。但是倘若我們不希望將子類的子類中的元素也進行編碼,只對最外圍的div進行選取,那么選擇器就要改成為父輩−子輩選擇器(當前是祖先−后代選擇器):('document>div:even'),那么此時的輸出結果就是將class為one的div元素中的內容輸出。

  $('div:odd'):查找dom中索引值為偶數的div元素。

 

  d.  范圍選擇器

  $('li:eq(0)'):選取索引值為0的li元素。

  這種選擇器和奇偶選擇器一樣,是不區分父輩還是子輩的,都是統一進行索引編號。如下:

復制代碼
<ul class = 'list'>
    <li>
        <ul>
            <li>1.1</li>
            <li>1.2</li>
            <li>1.3</li>
            <li>1.4</li>
        </ul>
    </li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
</ul>
<script>
    $(function(){
        alert($('ul.list li:eq(1)').html());
    });
</script>
復制代碼

  上述的代碼中尋找的是class為list的ul中的第2個li(因為索引是從0開始),由於第一個li中嵌套了一個ul,這個ul中又有四個li,那么最終的結果就將是1.1。倘若不希望將li的子代的ul中的li也進行編碼索引,就將其改為父輩-子輩選擇器:$('ul.list>li:eq(1)'),那么此時的結果就是2了。

  $('ul li:gt(3)):在ul中查找索引值大於3的li。

  $('ul li:lt(4)):在ul中查找索引值小於4的li。

 

  e.  標題元素選擇器

  $(':header'):查找h1-h6的元素。

 

  2.  內容過濾選擇器

  $('p:contains("text")'):選擇p標簽中包含‘text'字符串的元素。

復制代碼
<p>1111</p>
<p>2222</p>
<p>1122</p>
<p>3333</p>
<p>4444</p>
<p>3344</p>
<script>
    $(function(){
        $('p:contains("22")').text("5555");
    });
</script>
復制代碼

  這段代碼選擇內部文本包含’22‘的p標簽元素,並將其文本設置為’5555‘。結果是第2、3個p標簽元素被選擇。

  $('.p:empty'):選擇不包含文本並且不包含子元素的元素;

  $('div:has(p:contains("text")'):選擇包含p標簽且這個p含有’text字符串的div元素。

  一開始我把這個形式的選擇器和祖先-后代選擇器弄混了,但二者的區別是祖先-后代選擇器的返回結果是后代元素,而:has返回的是祖先元素

復制代碼
<div>
    <p>
        <span class = 'one'>123</span>
    </p>
</div>
<script>
    $(function(){
        alert($("div:has(.one)").html());
    });
</script>
復制代碼

  在這段代碼中,(div:has(.one))div(′div:has(.one)′)最終選擇的就是div,但是倘若寫成這樣的話:('div :has(.one)'),最終選擇的就是p了,因為中間加了空格之后就變成了選擇div中其后代元素class為one的元素,那么可想而知最終選擇結果可以為多個。

  $('div:parent'):選擇div中有內容的元素,就是包含子元素或文本內容的元素。(一開始以為是父元素......)。

復制代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src = 'zhongjian/js/jquery-1.11.2.min.js' type = 'text/javascript'>1</script>
</head>
<body>
    <div class = 'two'>
        <div>
            <p>
                <span class = 'one'>123</span>
            </p>
        </div>
    </div>
    <script>
        $(function(){
            alert($(':parent').html());
        });
    </script>
</body>
</html>
復制代碼

  上面的代碼是完整的html代碼,那么使用了$(':parent')之后,共有9個元素被選擇:html,head,title,body,div(class=two),div,p,span,script。注意這個選擇器和:has選擇器的空格問題。這個和:empty選擇器是相反的。

  

  3.  可見性過濾選擇器

  $(':hidden'):匹配不可見元素。

  $(':visible'): 匹配可見元素。

  對於隱藏元素,這里要提到display:none 和 visibility:hidden。而要理解這兩個的區別從三個方面考慮:

    空間占據:設置隱藏后受否還占據空間;

    回流與渲染:這部分知識在http://www.cnblogs.com/jyybeam/p/5776667.html

    株連性 :若祖先元素發生改變,后代元素是否也會發生改變。

  對於display:none,由於被設置為這一樣式的容器不會占據空間,因此會發生重繪,而且其后代元素也會被設置為display:none,被株連。

  而visibility:hidden,容器依舊會占據空間,因此不會發生重繪,而對於后代元素如果應用了visibility:visible,則依舊會顯示出來,不會被株連。如下:

復制代碼
<div class = 'two' style = 'visibility:hidden'>
    <div>
        <p>
            <span class = 'one' style = 'visibility:visible'>123</span>
        </p>
    </div>
</div>
復制代碼

  此時雖然span的祖先元素div被設置為visibility:hidden,但是由於span本身被設置為visibility:visible,所以span依舊會顯示出來。

  那么,言歸正傳。這個:hidden,到底指的是哪個呢?看下面的代碼:

復制代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src = 'zhongjian/js/jquery-1.11.2.min.js' type = 'text/javascript'>1</script>
</head>
<body>
    <div class = 'two' style = 'visibility:hidden'>
        <div>
            <p>
                <span class = 'one'>123</span>
            </p>
        </div>
    </div>
    <script>
        $(function(){
            alert($(':hidden').length);
        });
    </script>
</body>
</html>
復制代碼

  最后的答案是5個:head,meta,title,script,script,看到並沒有div,說明:hidden並不適用於visibility。接下來:

復制代碼
<div class = 'two' style = 'display: none'>
    <div>
        <p>
            <span class = 'one'>123</span>
        </p>
    </div>
</div>
<script>
    $(function(){
        alert($(':hidden').length);
    });
</script>
復制代碼

  答案是9個!,那么問題來了,即便算上div不是應該6個嗎?答案就是猶如display的“株連性”,他的后代元素也被設定為display:none了,因此在上面的基礎上又增加了div(.two),div,p,span這四個,總共加起來是9個。ok!

 

  4.  屬性過濾選擇器

  $('[class]'):選擇有class屬性的元素。

  $('[class][id][d]'):選擇有class、id、d屬性的元素。

  注:在這種選擇器中支持自定義的屬性

  $('[class=one]'):選擇class屬性為one的元素。

  $('[class!=one]'):選擇class屬性不為one的元素。

  $('[class^=one]'):選擇class屬性以one開頭的元素。

  $('[class$=one]'):選擇class屬性以one結尾的元素。

  $('[class|=one]'):選擇class屬性為one或以one-開頭的元素

  注:是以‘one-’開頭,而不是‘one'開頭

復制代碼
<div class = 'two'>
    <div>
        <p>
            <span class = 'one' id = 'id_span' d = 'dat'>123</span>
            <span class = 'one two'>222</span>
            <span class = 'one-two'>333</span>
            <span class = 'onetwo'>444</span>
        </p>
    </div>
</div>
<script>
    $(function(){
        alert($('[class|=one]').length);
    });
</script>
復制代碼

  上面的代碼的結果是2,也就是class分別為one和one-two的元素。

  $('[class~=one]'):選擇clss屬性值為one或包含’one‘字符串的元素。

  注:這種選擇器表示屬性值必須以空格分割,或者屬性值等於one。

復制代碼
<div class = 'two'>
    <div>
        <p>
            <span class = 'one' id = 'id_span' d = 'dat'>123</span>
            <span class = 'one two'>222</span>
            <span class = 'two one-two'>333</span>
            <span class = 'onetwo'>444</span>
        </p>
    </div>
</div>
<script>
    $(function(){
        alert($('[class~=one]').length);
    });
</script>
復制代碼

  結果是2,選擇到的是class分別為one和‘one two’的元素。

  $('[class*=one]'):選擇屬性值包含one的元素。

 

  5.  子元素過濾選擇器
  $('div p:first-child):查找div中的第一個p元素。

  注:用到first-child時p必須是div的第一個子元素,因此這個選擇器是選擇第一個子元素,如果這個子元素不是p的話就返回空jquery對象

復制代碼
<div>
    <span>span1</span>
    <p class = 'a'>p1</p>
    <p>p2</p>
    <span>span2</span>
    <p>p3</p>
    <span>span3</span>
</div>
<script>
    $(function(){
        $('div p:first-child').text('11111');
        $('div span:first-child').text('22222');
    });
</script>
復制代碼

  這段代碼會使第一個span的text為222222。而div中的第一個p的text不會是11111,因為它不是div的第一個子元素。

  $('div p:last-child):查找div中最后一個為p標簽的子元素。

  注:last-child和first-child一樣,last-child必須是div中的最后一個子元素,如果它不是p的話,返回空對象

  

  $('p:nth-child(2)'):選擇第二個p元素。

  注:此處的序號不是以0開始的,而是從1開始的。

復制代碼
<div>
    <p>1</p>
    <p>2</p>
    <p>3</p>
    <p>4</p>
</div>
<script>
    $(function(){
        alert($('p:nth-child(2)').html());
    });
</script>
復制代碼

  這段代碼的結果就是2,選擇的就是第二個p元素。

  $('p:nth-child(2n+1):選擇第2n+1(n = 0,1,2,3....)個p元素

  在這里n是從0開始的自然數,可以選擇多個元素。

復制代碼
<div>
    <p>1</p>
    <p>2</p>
    <p>3</p>
    <p>4</p>
    <p>5</p>
    <p>6</p>
</div>
<script>
    $(function(){
        alert($('p:nth-child(2n+1)').length);
    });
</script>
復制代碼

  這段代碼的結果是3個,選擇到的是第1、3、5個p元素。

  $('span:only-child'):選擇父節點只有一個span子節點的那個子節點。

復制代碼
<div>
    <p>1</p>  
    <p>2</p>
    <p>3</p>
    <p>4</p>
    <p>5</p>
    <span>span</span>
    <p>6</p>
</div>
<div>
    <span>span</span>
</div>
<script>
    $(function(){
        alert($('span:only-child').html());
    });
</script>
復制代碼

  結果是span,選擇的是第二個div中的那個span元素。

  $('p:nth-last-child(2)'):選擇倒數第二個p元素。

  在nth-last-child的括號中可以添加數字、數學表達式(2n+3等)、event/odd等。

  $('p:first-of-type'):選擇子元素中第一個類型是p標簽的子元素。

復制代碼
<div>
    <p>1</p>
    <p>2</p>
    <p>3</p>
    <p>4</p>
    <p>5</p>
    <span>span</span>
    <p>6</p>
</div>
<script>
    $(function(){
        alert($('span:first-of-type').html());
    });
</script>
復制代碼

  這段代碼的結果是span,選擇到的是div中唯一的一個span元素。可以看到這個選擇器與first-child的不同是first-child選擇的必須是第一個子元素。同樣的如果選擇器是$('p:first-of-type'),那么結果就是1,選擇到的就是div中類型為p的第一個p元素。

  $('p:last-of-type'):選擇到的類型為p元素的最后一個p元素。

  $('p:only-of-type'):選擇到是父元素中唯一一個類型的p元素。

復制代碼
<div>
    <span>1</span>
    <span>2</span>
    <span>3</span>
    <p>3434</p>
    <span>4</span>
</div>
<script>
    $(function(){
        alert($('p:only-of-type').html());
    });
</script>
復制代碼

  上述代碼的結果是3434,選擇到的是div中唯一一個p元素。

  $('p:nth-of-type(2)'):選擇父元素中的第2個元素。

  $('p:nth-of-type(2)'):選擇父元素中的倒數第2個元素。

 

  6.  表單對象屬性過濾器

  (:disabled)(′:disabled′)和(':enabled'):選擇可用或不可用元素。匹配范圍包括input,textarea,select。

  $(':checked'):選擇選中的單選框或復選框元素。

  $(':selected'):選擇下拉框中被選擇的option元素。

 

  四.  表單元素選擇器

  包括:input,:select,:file,:password,:button,:reset,:submit,:checkbox,:text,:raido。這些都比較簡單,不再詳述。

 

  五.  其他

  之所以命名為其他,是因為在網上好多的關於jquery選擇器的文章並沒有將一些不常見的選擇器進行描述,但是我在一些源代碼中卻看到了一些。因此,就多加了一類這樣的選擇器。在http://www.365mini.com/page/jquery-select-nth-of-type-selector.htm這個網站有中文手冊,比較詳細。

  $(':focus'):選擇當前獲得焦點的元素

  $(':root'):選擇文檔的根目錄,實際上就是html標簽。

  $(':target'):匹配id屬性值等於當前文檔URI的錨點名稱的元素。如URI為http://www.365mini.com/#top,則選擇ID為top的元素。

  $(':lang(en)'):選擇指定語言的所有元素。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM