天天看點

jQuery進階選擇器

層次選擇器

<a href="https://s4.51cto.com/wyfs02/M02/A4/CD/wKioL1mx9YGjKFeLAADKI7FvwX0880.png" target="_blank"></a>

進階選擇器方法:

find()、children()、next()、nextAll()、prev()、prevAll()、siblings()、nextUntil()、prevUntil()

這些方法如果不傳遞參數,相當于傳遞了('*'),即所有節點。如果傳遞了參數,例如

find('p'), next('a'),則表示選擇指定的标簽元素。

find():選擇正在處理的元素的後代元素, 包括子節點、孫子節點......

find('p'):選擇正在處理的元素的後代元素中的p元素

例如:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<code>//HTML</code><code>代碼</code>

<code>&lt;p&gt;p0&lt;</code><code>/p</code><code>&gt;</code>

<code>&lt;div </code><code>id</code><code>=</code><code>"box"</code><code>&gt;</code>

<code>    </code><code>&lt;p&gt;p1&lt;</code><code>/p</code><code>&gt;</code>

<code>    </code><code>&lt;p&gt;p2&lt;</code><code>/p</code><code>&gt;</code>

<code>    </code><code>&lt;div&gt;</code>

<code>        </code><code>&lt;p&gt;p3&lt;</code><code>/p</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>/div</code><code>&gt;</code>

<code>    </code><code>&lt;a href=</code><code>""</code><code>&gt;aaa&lt;</code><code>/a</code><code>&gt;</code>

<code>&lt;</code><code>/div</code><code>&gt;</code>

<code>&lt;p&gt;p&lt;</code><code>/p</code><code>&gt;</code>

<code>//JS</code>

<code>$(</code><code>'#box'</code><code>).</code><code>find</code><code>(</code><code>'p'</code><code>).css(</code><code>'color'</code><code>, </code><code>'blue'</code><code>)</code>

<code>//</code><code>被選擇的元素為</code>

<code>&lt;p&gt;p1&lt;</code><code>/p</code><code>&gt;</code>

<code>&lt;p&gt;p2&lt;</code><code>/p</code><code>&gt;</code>

<code>&lt;div&gt;</code>

<code>    </code><code>&lt;p&gt;p3&lt;</code><code>/p</code><code>&gt;</code>

children(): 選擇正在處理的元素的所有兒子元素,不包含孫子元素和重孫子元素

children('p'): 選擇正在處理的元素的所有兒子元素中的&lt;p&gt;&lt;/p&gt;元素,不包含孫子元素中的p元素和重孫子元素中的p元素

next(): 選擇正在處理的元素的同級元素的下一個元素,遇到則停止選擇

next(‘p’): 選擇正在處理的元素的同級元素下一個元素,如果該元素是p元素,則選擇,如果沒有下級元素或者下級元素第一個不是p元素,則不選擇

<code>$('#box').next('p').css('color', 'red')</code>

nextAll():選擇正在處理元素的同級下的所有元素,相當于nextAll(‘*’)

nextAll('p'):選擇正在處理元素的同級下的所有p元素

prev()和prevAll()正好和next()、nextAll()相反,是向上選擇

siblings():選擇正在處理的元素的同級的所有上面的元素下面的元素,例如:

$('#box').siblings('p').css('color', 'red')

它等于

<code>$(</code><code>'#box'</code><code>).prevAll(</code><code>'p'</code><code>).css(</code><code>'color'</code><code>, </code><code>'red'</code><code>)</code>

<code>$(</code><code>'#box'</code><code>).nextAll(</code><code>'p'</code><code>).css(</code><code>'color'</code><code>, </code><code>'red'</code><code>)</code>

nextUntil(‘p’):選擇正在處理元素的同級下的所有元素,直到遇到p元素後停止選擇。如果同級下沒有p元素,則選擇所有元素。

<code>//HTML代碼</code>

<code>&lt;</code><code>p</code><code>&gt;p&lt;/</code><code>p</code><code>&gt;</code>

<code>&lt;</code><code>div</code> <code>id</code><code>=</code><code>"box"</code><code>&gt;div&lt;/</code><code>div</code><code>&gt;</code>

<code>&lt;</code><code>a</code> <code>href</code><code>=</code><code>""</code><code>&gt;aaa&lt;/</code><code>a</code><code>&gt;</code>

<code>&lt;</code><code>div</code><code>&gt;div&lt;/</code><code>div</code><code>&gt;</code>

<code>&lt;</code><code>input</code> <code>type</code><code>=</code><code>""</code> <code>value</code><code>=</code><code>"送出"</code><code>&gt;</code>

<code>//JS代碼</code>

<code>$(function(){</code>

<code>    </code><code>$('#box').nextUntil('p').css('color', 'red')</code>

<code>})</code>

搜尋到的元素為

選擇器快慢比較:

$('#box').find('p'):這條最快,使用的是原生的getElementById、ByName、ByTagName和querySelectorAll()

$('p', '#box' ):jQuery會自動把這條語句翻譯成$('#box').find('p'),這會導緻一定的性能損失,它比最快的形式慢了5%~10%

$('#box').children('p'):這條語句在jQuery内部,會使用$sibling()和javascript的nextSibling()方法,一個個周遊節點,他比最快的大約慢50%

$('#box &gt;p'):jQuery内部使用Sizzle引擎,處理各種選擇器。Sizzle引擎的選擇順序是從右到左,是以這條語句的先選p,然後再一個個過濾出父元素#box,這導緻它比最快的形式大約慢70%

$('#box p'):這條語句與上一條是同樣的情況,但是,上一條隻選擇直接的子元素,這一條可以選擇多級子元素,是以他的速度更慢,大概比最快的慢了77%

$('p', $('#box)):内部會将這條語句翻譯成$('#box').find('p'),比最快的形式慢了23%

綜上所述,最快的是find()方法,最慢的是$('#box p')這種進階選擇器。如果一開始将$('#box')進行指派,那麼jQuery就對其變量進行緩存,那麼速度回進一步提高。

<code>var</code> <code>box=$(</code><code>'#box'</code><code>)</code>

<code>var</code> <code>p = box.find(</code><code>'p'</code><code>)</code>

注意:我們應該推薦使用哪種選擇器方案呢?其實,使用哪種都差不多,這裡我們推薦使用jQuery提供的方法。因為不但方法的速度比進階選擇器運作的更快,并且它的靈活性和擴充性要高于進階選擇器。使用"+"或"~"從字面上沒有next和nextAll更加語義化,更加清晰,jQuery的方法更加豐富,提供了相對的prev和prevAll。畢竟jQuery是程式設計語言,需要能夠靈活的拆分群組合選擇器,而使用CSS模式過于死闆。是以,如果jQuery提供了獨立的方法來替代某些選擇器的功能,我們還是推薦優先選擇使用獨立的方法。

屬性選擇器

<a href="https://s2.51cto.com/wyfs02/M02/06/1E/wKiom1myAnGjo-kgAAF3TTtf1TU639.png" target="_blank"></a>

例子:

24

25

26

27

28

<code>&lt;a href=</code><code>""</code> <code>title=</code><code>"a1"</code><code>&gt;a1&lt;</code><code>/a</code><code>&gt;</code>

<code>&lt;a&gt;a2&lt;</code><code>/a</code><code>&gt;</code>

<code>&lt;a&gt;a3&lt;</code><code>/a</code><code>&gt;</code>

<code>&lt;a&gt;a4&lt;</code><code>/a</code><code>&gt;</code>

<code>&lt;a href=</code><code>""</code> <code>title=</code><code>"a5"</code><code>&gt;a5&lt;</code><code>/a</code><code>&gt;</code>

<code>//JS</code><code>代碼</code>

<code>$(</code><code>'a[title]'</code><code>)    </code><code>//</code><code>選擇定義了title屬性的a标簽元素</code>

<code>$(</code><code>'a[title=a1]'</code><code>) </code><code>//</code><code>選擇title值為a1的a标簽元素</code>

<code>$(</code><code>'a[title^=a]'</code><code>) </code><code>//</code><code>選擇title屬性值以a開頭的a标簽元素</code>

<code>$(</code><code>'a[title$=a]'</code><code>) </code><code>//</code><code>選擇title屬性值以a結尾的a标簽元素</code>

<code>$(</code><code>'a[title|=a]'</code><code>) </code><code>//</code><code>選擇title屬性值以a開頭,并且後面有一個“-”的a标簽元素,例如:&lt;a href=</code><code>""</code> <code>title=</code><code>"a-1"</code><code>&gt;a1&lt;</code><code>/a</code><code>&gt;</code>

<code>$(</code><code>'a[title!=a1]'</code><code>) </code><code>//</code><code>選擇有title屬性,但值不等于a1的a标簽元素</code>

<code>$(</code><code>'a[title~=a1]'</code><code>) </code><code>//</code><code>選擇具有title屬性,且屬性值是以一個空格分割的清單。</code>

<code>例如: </code>

<code>&lt;a title=</code><code>"num1 aaa bbb"</code><code>&gt;aa&lt;</code><code>/a</code><code>&gt;</code>

<code>$(</code><code>'a[title~=aaa]'</code><code>)可以比對到,$(</code><code>'a[title~=bbb]'</code><code>)也可以比對到,$(</code><code>'a[title~=num1]'</code><code>)也可以比對到</code>

<code>$(</code><code>'a[title*=aaa]'</code><code>) </code><code>//</code><code>類似于正規表達式,選擇具有title屬性,且屬性值中包含aaa字元串的a标簽元素</code>

<code>$(</code><code>'a[bbb][title=a1]'</code><code>) </code><code>//</code><code>多屬性選擇器,選擇具有bbb屬性,并且title屬性值為a1的a元素标簽</code>

本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1963490,如需轉載請自行聯系原作者

繼續閱讀