JQuery學(xué)習(xí)筆記整理:選擇元素

2018-06-19 15:51 更新

這篇文章主要講解如何選擇元素,包括

1、選擇器

2、選擇方法

2.1 添加更多元素(add())

2.2 限制選擇范圍(eq()、filter()、first()、last()、has()、not()、slice())

2.3 檢測結(jié)果集(is())
2.4 修改、回退結(jié)果集(end()、addBack())
2.5 訪問后代元素(children()、contents()、find())
2.6 訪問祖先猿(closest()、offsetParent()、parent()、parents()、parentsUntil())
2.7 訪問兄弟元素(next()、nextAll()、nextUntil()、prev()、prevAll()、prevUntil()、siblings())
3、 jQuery對象
3.1 屬性方法
3.2 jQuery對象轉(zhuǎn)換成DOM對象
3.3 DOM對象轉(zhuǎn)換成jQuery對象
4、 鏈?zhǔn)椒椒ǎǚ椒ㄦ湥?/div>

如果不想滾動,只想看自己所需要的,可在頁面按ctrl+F鍵,輸入名稱即可搜索到。

1、選擇器
JQuery不但支持大部分的CSS選擇器,還額外的為我們提供了不少方便的選擇器。
1.1 不支持的CSS選擇器
JQuery支持大多數(shù)CSS選擇器,所以在這里只列舉一下不支持的CSS選擇器,如果你不知道CSS有哪些選擇器,可以看這里:CSS API整理復(fù)習(xí)

::after | :after

::before | :before

::selection

::placeholder

:fullscreen


1.2專屬選擇器

:animated  選擇所有正在處理動畫的元素

:contains(text)   選擇包含指定文本的元素

:eq(n)    選擇第n個元素(從0開始計(jì)數(shù))

:even     選擇所有的偶數(shù)元素(從0開始計(jì)數(shù))

:odd 選擇所有奇數(shù)元素

:first    選擇第一個匹配的元素

:last 選擇最后一個匹配的元素

:gt(n)    選擇序號大于n的所有元素

:lt(n) 選擇序號小于n的所有元素

:has(selector)    選擇至少包含一個匹配指定選擇器的元素的元素

:text     選擇所有的輸入框元素

上面的選擇可以單獨(dú)使用也可以與其他選擇器使用:

$(':first')


$('html:first')

上面兩行代碼是等價的,都會返回包含基于DOM樹的第一個元素,也就是html

還有一些類型選擇器

:button    選擇所有的按鈕

:checkbox  選擇所有的復(fù)選框

:file      選擇所有的文件上傳輸入框

:header    選擇所有的標(biāo)題元素(h1、h2等)

:hidden    選擇所有被隱藏的元素

:image     選擇所有的圖片元素

:input     選擇所有的input元素

:parent    選擇所有擁有至少一個子元素的元素

:password  選擇所有的密碼輸入框

:radio     選擇所有的單選框

:reset     選擇所有的表單重置按鈕

:selected  選擇所有的狀態(tài)已被選中的元素

:submit    選擇所有的表單提交元素

:visible   選擇所有的可見元素


2、選擇方法
當(dāng)我們執(zhí)行修改元素的jQuery操作時,這些操作大多數(shù)返回來的都是一個jQuery對象(代表0個或多個DOM元素),也是基于此,我們可以采用鏈?zhǔn)椒椒?/b>調(diào)用。
2.1 添加更多元素
add()方法返回一個jQuery對象,所以可以在add()方法后采用鏈?zhǔn)椒椒ā?/div>

add(selector)、add(selector,context)  把匹配選擇器(可選上下文)的所有元素添加到調(diào)用add()方法的jQuery對象

add(HTMLElement)、add(HTMLElement[])  把一個或多個HTMLElement添加到j(luò)Query對象

add(jQuery)  把參數(shù)jQuery對象中的元素添加到當(dāng)前jQuery對象。

實(shí)例:

/*

*<div class="example">   

*  <input type="text" />   

*  <span></span>   

*  <button>Button</button>

*  <div class="item"></div>   

*</div>

*/


var btn = $(':button');

var span = document.querySelectorAll('.example span');

$('.example input').add('.example .item').add(btn).add(span).addClass('add');


//執(zhí)行結(jié)果

//<div class="example">    

//  <input type="text" class="add" />     

//  <span class="add"></span>     

//  <button class="add">Button</button>   

//  <div class="item add"></div>

//</div> 

上面的JavaScript代碼中,btn是 jQuery對象 ,span是 HTMLElement ,執(zhí)行后,當(dāng)前頁面上具有類名為example的元素內(nèi)所有的input元素、具有類名為example的元素內(nèi)所有具有類名item的元素、所有的button按鈕和具有類名為example的元素內(nèi)所有span元素都會被添加上類名add。

注意:add()方法相當(dāng)于(把所有匹配結(jié)果相加)的意思,而不是子孫輩匹配,也不是往DOM里插元素。

2.2 限制選擇范圍

eq(index)  得到第index個元素(刪除其他元素)

filter(condition)  得到符合condition參數(shù)的元素(刪除不符合條件的元素)

first()    得到第一個元素(刪除其他元素)

last()     得到最后一個元素(刪除其他元素)

has(selector)、has(jQuery)、has(HTMLElement)、has(HTMLElement[])  得到匹配selector后代元素的元素,或返回包含jQuery對象內(nèi)的元素或HTMLElement所對應(yīng)的元素的元素(刪除沒有匹配后代的元素)

not(condition)  刪除匹配condition參數(shù)的元素

slice(start,end)  得到start、end參數(shù)指定范圍的元素子集、刪除子集之外的其他元素

(1)eq(index)、first()、last()
這三個方法也是返回一個jQuery對象。

/*

* <div class="example">

*   <span>1</span>

*   <span>2</span>

*   <span>3</span>

* </div>

*/


var spans = $('.example span');

spans.first().addClass('one');

spans.eq(0).addClass('one');

上面最后兩行代碼是等價的,返回匹配元素的結(jié)果集中的第一個元素,然后給它添加類名one

spans.last().addClass('last');

spans.eq(-1).addClass('last');

上面兩行代碼也是等價的,返回匹配元素的結(jié)果集中的最后一個元素,然后給它添加類名last。

注意:使用eq(index)時,當(dāng)index為正值時,是從0開始計(jì)數(shù)的,也就是0是第一個匹配元素;而當(dāng)index為負(fù)值時,則是從-1開始計(jì)數(shù)的,也就是-1是最后一個匹配元素。

(2)slice(start,end)
slice()也返回一個jQuery對象。
jQuery的 slice() 方法其實(shí)和數(shù)組的slice()方法是一個意思,支持兩個參數(shù),分別是選擇的起始索引號和結(jié)束索引號,索引是從0開始,第二個參數(shù)是可選的,當(dāng)省略第二個參數(shù)時,表示一直延續(xù)到結(jié)果集的結(jié)尾,相當(dāng)于slice(start,length-1)

實(shí)例:

spans.slice(1,2).addClass('slice')


// 結(jié)果 

// <div class="example">  

//   <span>1</span>  

//   <span class="slice">2</span>  

//   <span>3</span>  

// </div> //

注意:當(dāng)提供兩個參數(shù)時,slice(start,end)返回的匹配結(jié)果中并不會包含最后一個元素,也就是不會包括eq(end);當(dāng)?shù)谝粋€參數(shù)大于結(jié)果集長度時,返回長度為0的jQuery對象;當(dāng)?shù)诙€參數(shù)大于結(jié)果集的長度時,相當(dāng)于只提供第一個參數(shù)。

spans.slice(-2).addClass('slice');


// 結(jié)果   

// <div class="example">    

//   <span>1</span>    

//   <span class="slice">2</span>    

//   <span class="slice">3</span>    

// </div> 

//

注意:slice(-index)支持一個負(fù)數(shù),-1表示最后一個元素,表示從結(jié)果集的結(jié)尾開始切割,并且返回從最后一個元素到倒數(shù)第index個的元素。

(3)filter()
filter()用來過濾元素,參數(shù)可以是選擇器、jQuery對象、HTMLElement或回調(diào)函數(shù)。

var first = $('.example span:first');   

var last = document.querySelector('.example span:last-child');   

spans.filter('.example span:nth-child(2)').addClass('second');   

spans.filter(first).addClass('first');   

spans.filter(last).addClass('last');


/*結(jié)果

*<div class="example">   

*  <span class="first">1</span>   

*  <span class="second">2</span>   

*  <span class="last">3</span>   

*</div>

*/

在上面的代碼中,分別給filter()方法傳入一個selector選擇器、一個jQuery對象、一個HTMLElement來過濾元素。

filter()方法還可以傳入一個回調(diào)函數(shù),會把元素的索引號作為參數(shù)傳遞給這個函數(shù),同時,函數(shù)內(nèi)的上下文( this )指向需要處理的對應(yīng)當(dāng)前元素的HTMLElement對象:

spans.filter(function(index){   

  return index == 2 || this.textContent == '1';   

}).addClass('filter');


// 結(jié)果

//<div class="example">   

//  <span class="filter">1</span>

//  <span>2</span>   

//  <span class="filter">3</span>   

//</div>

//

返回true的表示匹配。

(4)not()
not()也返回一個jQuery對象,它的作用和filter正好相反,刪除所匹配的元素,用法可參考上面的filter方法,當(dāng)傳入的是函數(shù)時,同樣會將元素的索引作為參數(shù)傳遞給函數(shù),上下文this指向當(dāng)前對應(yīng)元素的HTMLElement。

spans.not(function(index){   

  return index == 2 || this.textContent == '1';   

}).addClass('not');


// 結(jié)果  

//<div class="example">     

//  <span>1</span>  

//  <span class="not">2</span>     

//  <span>3</span>     

//</div>  

//


(5)has()
has方法是基于 后代元素 過濾結(jié)果集,也是返回一個jQuery對象,可傳入選擇器、一個或多個HTMLElement對象、一個jQuery對象。

實(shí)例:

/*<div class="example">

*  <span><b>1</b></span>

*  <span><i>2</i></span>

*  <span><span class="col"></span></span>

*</div>

*/


spans.has('.col').addClass('a');   

var b = $('b');   

spans.has(b).addClass('b');   

var i = document.querySelector('i');   

spans.has(i).addClass('i');


// 結(jié)果

//<div class="example">  

//  <span class="b"><b>1</b></span>  

//  <span class="i"><i>2</i></span>  

//  <span class="a"><span class="col"></span></span>  

//</div>  

//


2.3 檢測結(jié)果集
is()方法返回布爾值

is(selector)  如果結(jié)果集中至少有一個元素匹配選擇器selector,返回true

is(HTMLElement)、is(HTMLElement[])  如果結(jié)果集中包含指定的HTMLElement或者至少包含指定HTMLElement[]中的一個元素,返回true

is(jQuery)    如果結(jié)果集中至少包含一個參數(shù)對象中的元素,返回true

is(function(index))  如果至少有一次參數(shù)函數(shù)返回true,則返回true

實(shí)例:

/*  

* <div class="example">  

* <span>1</span>  

* <span>2</span>  

* <span>3</span>  

* </div>  

*/


spans.is(function(index){   

  return this.textContent == '2';   

});

// true


spans.is(function(index){   

  return this.textContent == '5';   

});

// false


2.4 修改、回退結(jié)果集
當(dāng)我們調(diào)用方法鏈修改結(jié)果集時,jQuery維護(hù)著一個歷史結(jié)果集棧。

end()   扔掉當(dāng)前結(jié)果集,返回jQuery對象中緩存著的上一個結(jié)果集

addBack()、addBack(selector)  得到原結(jié)果集與當(dāng)前選擇結(jié)果的集合,支持可選選擇器參數(shù),利用這個可過濾原結(jié)果集

(1)end()

end()方法返回一個jQuery對象。

spans.first().addClass('first').end().addClass('span');


// 結(jié)果 

// <div class="example">    

// <span class="first span">1</span>    

// <span class="span">2</span>    

// <span class="span">3</span>    

// </div>    

//

上面的代碼中,我們首先用first()方法獲取到匹配的第一個元素,給它添加類名first,然后調(diào)用end()方法,這時會返回到上一次結(jié)果集(也就是spans),給所有匹配的spans元素添加類名span。


(2)addBack()

addBack()返回一個jQuery對象

$('.example').children('span:first').addBack().addClass('addBack');


// 結(jié)果   

// <div class="example addBack">      

// <span class="addBack">1</span>      

// <span>2</span>      

// <span>3</span>      

// </div>      

//

注意:當(dāng)傳入一個selector參數(shù)時,它過濾的是原結(jié)果集,而不是當(dāng)前選擇結(jié)果。


2.5 訪問DOM

以一個結(jié)果集為起點(diǎn),我們可以在DOM中訪問其他部分,使用一個結(jié)果集得到另一個結(jié)果集。

下面的方法都返回jQuery對象,即使沒有匹配,也會返回一個空的jQuery對象(length等于0)

(1)訪問后代元素

children()  得到結(jié)果集內(nèi)所有元素的直接子元素

children(selector)  得到結(jié)果集內(nèi)所有元素的匹配selector選擇器的直接子元素

contents()  得到結(jié)果集內(nèi)所有元素的直接子元素和文本內(nèi)容

find()  得到結(jié)果集內(nèi)所有元素的后代元素

find(selector)  得到結(jié)果集內(nèi)所有元素的匹配selector選擇器的后代元素

find(jQuery)、find(HTMLElement)、find(HTMLElement[])  得到結(jié)果集內(nèi)所有元素的子元素與參數(shù)對象對應(yīng)元素的交集

children()和find()方法返回的結(jié)果集中沒有重復(fù)元素。


實(shí)例:children()

childrend()方法得到結(jié)果集內(nèi)所有元素的 直接子元素 。

/*

*<div class="example">   

*  <div><span></span></div>   

*  <span></span>   

*</div>

*/


var ex = $('.example');   

ex.children().addClass('child');   

ex.children('span').addClass('span');


// 結(jié)果

//<div class="example">   

//  <div class="child"><span></span></div>

//  <span class="child span"></span>   

//</div>

//

在上面的代碼中,第二行會選中結(jié)果集ex中的所有直接子元素添加類名child,第三行會選中結(jié)果集ex中的所有類型為span的直接子元素添加類名span。


實(shí)例:contents()

console.log(ex.contents())


// 打印結(jié)果

//0:text  

//1:div 

//2:text  

//3:span

//4:text

//

注意:換行符會導(dǎo)致出現(xiàn)text文本節(jié)點(diǎn)


實(shí)例:find()

find()方法得到結(jié)果集內(nèi)所有元素的 后代元素 。

var span = $('.example div>span');   

var span2 = document.querySelectorAll('.example>span');   

ex.find('div').addClass('div');   

ex.find(span).addClass('span');   

ex.find(span2).addClass('span2');


// 結(jié)果

//<div class="example">   

//  <div class="div">   

//    <span class="span"></span>   

//  </div>   

//  <span class="span2"></span>

//</div>

//

在上面的代碼中,分別傳入一個selector選擇器、一個HTMLElement、一個jQuery對象,仔細(xì)看結(jié)果。


(2)訪問祖先元素

closest(selector)、closest(selector,context)  得到結(jié)果集內(nèi)元素的祖先元素中匹配selector選擇器的最接近的那個祖先元素

closest(jQuery)、closest(HTMLElement)  得到結(jié)果集內(nèi)的祖先元素與參數(shù)元素的交集

offsetParent()  得到距離最近的祖先定位元素(使用fixed、absolute或rela定位的元素)

parent()、parent(selector)  得到結(jié)果集內(nèi)元素的父元素(可選匹配selector選擇器的元素),最多返回一個父元素

parents()、parents(selector)  得到結(jié)果集內(nèi)元素的父元素(可選匹配selector選擇器的元素),可能返回多個父元素

parentsUntil(selector)、parentsUntil(selector,context)  得到結(jié)果集內(nèi)元素的匹配selector選擇器的祖先元素,可選的第二個選擇器參數(shù)用來過濾選擇結(jié)果

parentsUntil(HTMLElement)、parentsUntil(HTMLElement,selector)、parentsUntil(HTMLElement[])、parentsUntil(HTMLElement[],selector)  得到結(jié)果集內(nèi)元素的祖先元素與參數(shù)元素的交集,可選的第二個參數(shù)選擇器用來過濾選擇結(jié)果


實(shí)例:parent()、parents()

/*<div class="example" style="position:relative">   

*  <div>   

*    <span class='child'></span>   

*  </div>   

*  <span></span>   

*</div>

*/


var child = $('.child');   

child.parent().addClass('parent');   

child.parent('div').addClass('parentSpan');   

child.parents().addClass('parents');   

child.parents('div').addClass('parentsDiv');


// 結(jié)果

//<div class="example parents parentsDiv">   

//  <div class="parent parentSpan parents parentsDiv">   

//    <span class="child"></span>   

//  </div>   

//  <span></span>   

//</div>

//

parent()和parents()都是用來選擇父元素,兩者的區(qū)別是:前者只會返回一個父元素,而后者會返回多個父元素,依據(jù)DOM樹,會一直向上匹配,直到當(dāng)前文檔的根元素(html);當(dāng)傳入?yún)?shù)時,前者可能返回包含0個或1個父元素的jQuery對象,而后者可能返回包含0個或多個父元素的jQuery對象。


實(shí)例:offsetParent()

child.offsetParent().addClass('offsetParent')


// 結(jié)果  

//<div class="example offsetParent" style="position:relative">     

//  <div>     

//    <span class="child"></span>     

//  </div>     

//  <span></span>     

//</div>  

//

從上面的代碼可以看到,具有類名為child的元素調(diào)用offsetParent()方法返回的是div.example元素,因?yàn)槟J(rèn)情況下,元素的定位方式是position:static,而我們給div.example設(shè)置了relative。


實(shí)例:closest()

closest()方法和parents()方法很類似,不同之處在于它只會返回一個節(jié)點(diǎn),也就是第一個匹配的祖先元素。(在開發(fā)中相對用的多)

child.closest('div').addClass('closest');


// 結(jié)果    

//<div class="example">       

// <div class="closest">       

// <span class="child"></span>       

// </div>       

// <span></span>       

//</div>    

//

closest()還可以傳入jQuery對象、HTMLElement對象,得到結(jié)果集內(nèi)元素的祖先元素與參數(shù)元素的交集;如無匹配,返回一個空的jQuery對象。


實(shí)例:parentsUntil()

parentsUntil()用來選擇祖先猿。對于jQuery對象中的每一個元素,parentsUntil()方法會沿著DOM樹向上查找,選中沿途的祖先元素,直到當(dāng)前祖先元素匹配參數(shù)選擇器為止。

child.parentsUntil('.example').addClass('parentsUntil');


// 結(jié)果      

//<div class="example">         

// <div class="parentsUntil">         

// <span class="child"></span>         

// </div>         

// <span></span>         

//</div>      

//

上面的代碼中,具有類名為child的元素會一直向上匹配祖先元素,直到匹配到一個具有類名為example的元素才會停止,而且并不會包含具有類名為example的元素。

注意:parentsUntil()方法并不會包含匹配selector參數(shù)的元素。


parentsUntil()還可傳入第二個參數(shù)作進(jìn)一步過濾,過濾原理和filter一樣。


(3)訪問兄弟元素

next()、next(selector)  得到下一個兄弟元素,可選的selector參數(shù)用來過濾選擇結(jié)果

nextAll()、nextAll(selector)  得到后面的所有兄弟元素,可選的selector參數(shù)用來過濾選擇結(jié)果

nextUntil(selector)、nextUntil(selector,selector)、nextUntil(jQuery)、nextUntil(jQuery,selector)、nextUntil(HTMLElement[])、nextUntil(HTMLElement[],selector)  得到后面的兄弟元素,直到(不包含)匹配(選擇器、jQuery對象、HTMLElement對象或HTMLElement對象數(shù)組)。可選的第二個selector參數(shù)用來過濾選擇結(jié)果。

prev()、prev(selector)  得到上一個兄弟元素,可選的selector參數(shù)用來過濾選擇結(jié)果

prevAll()、prevAll(selector)  得到前面的所有兄弟元素,可選的selector參數(shù)用來過濾選擇結(jié)果

prevUntil(selector)、prevUntil(selector,selector)、prevUntil(jQuery)、prevUntil(jQuery,selector)、prevUntil(prevHTMLElement[])、prevUntil(HTMLElement[],selector)  得到前面所有兄弟元素,直到(不包含)匹配參數(shù)(選擇器、jQuery對象、HTMLElement對象或HTMLElement對象數(shù)組)。可選的第二個selector參數(shù)用來過濾選擇結(jié)果

siblings()、siblings(selector)  選擇所有的兄弟元素,可選的selector參數(shù)用來過濾選擇結(jié)果


實(shí)例:next()、nextAll()、prev()、prevAll()、siblings()

/ <div class="example">   

    <span>1</span>   

    <span>2</span>   

    <span class="child">3</span>   

    <span>4</span>   

    <span>5</span>   

/ </div>


var child = $('.child');   

child.next().addClass('next');   

child.nextAll().addClass('nextAll');   

child.prev().addClass('prev');   

child.prevAll().addClass('prevAll');   

child.siblings().addClass('siblings');


// 結(jié)果

//<div class="example">   

//  <span class="prevAll siblings">1</span>   

//  <span class="prev prevAll siblings">2</span>   

//  <span class="child">3</span>   

//  <span class="next nextAll siblings">4</span>   

//  <span class="nextAll siblings">5</span>   

//</div>

next()返回下一個兄弟節(jié)點(diǎn)、nextAll()返回后面所有的兄弟節(jié)點(diǎn)、prev()返回上一個兄弟節(jié)點(diǎn)、prevAll()返回前面的所有兄弟節(jié)點(diǎn)、siblings()返回所有的兄弟節(jié)點(diǎn)(并不包含自身)。


上面五個方法都可以傳入一個selector參數(shù)作過濾。


實(shí)例:nextUntil()、prevUntil()

nextUntil()、prevUntil()兩個方法其實(shí)和parentsUntil()原理一樣,只不過parentsUntil()是匹配祖先元素,而nextUntil()、prevUntil()兩個方法分別是根據(jù)前面的所有兄弟元素和后面的所有兄弟元素。


3、jQuery對象

jQuery對象是包裝DOM對象后產(chǎn)生的對象,可以說它是一個數(shù)組對象,代表0個或多個DOM元素,具有jQuery對象的屬性和方法。


使用jQuery執(zhí)行的很多操作返回的都是一個jQuery對象。


3.1屬性方法

length  返回jQuery對象中包含元素的個數(shù),等價于size()

size()  返回jQuery對象中包含元素的個數(shù),等價于length

each(function())  在每個選中元素上運(yùn)行給定的function,并返回function修改之后的jQuery對象

get(index)   返回給定索引(index)對應(yīng)的HTMLElement對象

index(selecotr)、index(HTMLElement)、index(jQuery)  返回給定參數(shù)中匹配元素的索引序號(為HTMLElement和jQuery對象時,取第一個元素)

toArray()   返回一個由jQuery對象中包含的元素構(gòu)成的HTMLElement對象數(shù)組。


3.2 jQuery對象轉(zhuǎn)換成DOM對象

jQuery對象是一個數(shù)組對象,使用 [index] 或 .get(index) 方法得到的都是一個DOM對象。


3.3 DOM對象轉(zhuǎn)換成jQuery對象。

要將DOM對象轉(zhuǎn)換成jQuery對象,其實(shí)只要將DOM對象傳入 $(DOM) 即可


4、鏈?zhǔn)椒椒?/b>

前面多次提到,大多數(shù)jQuery的操作都是返回一個jQuery對象,也正是基于此,我們可以采用方法鏈:

$('body').find('div').filter('.item')........


上面的都是個人筆記,如有錯誤,歡迎指正!


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號