選擇器是jQuery的根基吧趣,在jQuery中仁热,遍歷DOM、事件處理渠缕、CSS控制鸽素、動(dòng)畫設(shè)計(jì)和AJAX操作都依賴于選擇器
1、jQuery選擇器介紹和優(yōu)勢
jQuery選擇器采用CSS和Xpath選擇器語法規(guī)范亦鳞,能夠滿足用戶在DOM中快速匹配元素或元素集合馍忽。它有如下優(yōu)勢:
- 簡化代碼書寫
- 完善的支持。支持不同CSS版本和不同類型瀏覽器
- 完善的處理機(jī)制蚜迅。jQuery選擇器的核心依然是JavaScript的原生方法舵匾,如getElementById()和getElementsByTagName()等方法俊抵,但是封裝了原生方法的使用谁不,簡化了代碼書寫又避免了易錯(cuò)問題
jQuery選擇器返回值均是一個(gè)偽數(shù)組對象,如果沒有匹配元素徽诲,則會(huì)返回一個(gè)空的偽數(shù)組對象刹帕,因此判斷一個(gè)jQuery對象是否存在,要使用數(shù)組長度來判斷谎替。
if($('tr').length > 0) {
// 處理代碼
}
而不要使用
if($('tr')) {
// 處理代碼
}
jQuery選擇器分為基本選擇器偷溺、結(jié)構(gòu)選擇器、過濾選擇器钱贯、屬性選擇器以及表單選擇器等挫掏。
2、基本選擇器
選 擇 器 | 說明 | 返回值 |
---|---|---|
#id(ID 選擇器) | 根據(jù)給定的ID匹配一個(gè)元素秩命,如果選擇其中包含特殊字符尉共,可以使用兩個(gè)斜杠專業(yè) | 包含單個(gè)元素的jQuery對象 |
element(類型選擇器) | 根據(jù)指定的元素類型名稱選擇該類型所有元素 | 包含同類型元素的jQuery對象 |
.class(類選擇器) | 根據(jù)指定的類名選擇所有同類元素 | 包含同類元素的jQuery對象 |
*(通配選擇器) | 在限定范圍內(nèi)選擇所有元素 | 包含所有元素的jQuery對象 |
selector1,selector2,selectorN | 分別選擇選擇器組中每個(gè)選擇器匹配的元素,然后合并返回所有元素 | 包含多組匹配元素的jQuery對象 |
- ID選擇器
var element = document.getElementById('id')
等價(jià)于jQuery("#id")
- 類型選擇器
var elements = document.getElementsByTagName('tagName')
等價(jià)于jQuery("tagName")
- 類選擇器
var elements = document.getElementsByClassName('className')
等價(jià)于jQuery(".className")
- 通配選擇器
var elements = document.getElementsByTagName('*')
等價(jià)于jQuery("*")
- 分組選擇器
jQuery("selector1, selector2, selectorN")
3弃锐、結(jié)構(gòu)選擇器
結(jié)構(gòu)選擇器就是根據(jù)HTML文檔結(jié)構(gòu)中節(jié)點(diǎn)之間的包含或并列關(guān)系決定匹配元素的一種方法袄友,jQuery模仿CSS的關(guān)系過濾模式定義了4個(gè)關(guān)系選擇器,同時(shí)還根據(jù)包含關(guān)系霹菊,自定義了4個(gè)子元素選擇器剧蚣。
層級選擇器
層級選擇器能夠根據(jù)元素之間的結(jié)構(gòu)關(guān)系進(jìn)行匹配操作,主要包含選擇器旋廷、子選擇器鸠按、相鄰選擇器和兄弟選擇器:
選 擇 器 | 說明 | 舉例 |
---|---|---|
ancestor descendant(包含選擇器) | 在給定的祖先元素下匹配所有的后代元素。ancestor表示任何有效的選擇器饶碘,descendant表示用以匹配元素的選擇器待诅,并且它是第一個(gè)選擇器的后代選擇器。 | $("form input")可以匹配表單下所有的input元素 |
parent > child(子選擇器) | 在給定的父元素下匹配所有的子元素熊镣。parent表示任何有效的選擇器卑雁,child表示用以匹配元素的選擇器募书,并且它是第一個(gè)選擇器的子元素。 | $("form > input")可以匹配表單下所有子級input元素 |
prev + next(相鄰選擇器) | 匹配所有緊接在prev元素后的next元素测蹲。prev表示任何有效的選擇器莹捡,next表示一個(gè)有效的選擇器并且緊接著第一個(gè)選擇器。 | $("label + input")可以匹配所有跟在label后面的input元素 |
prev ~ siblings(兄弟選擇器) | 匹配prev元素之后的所有siblings元素扣甲。prev表示任何有效的選擇器篮赢,siblings表示一個(gè)選擇器,并且它作為第一個(gè)選擇器的同輩琉挖。 | $("form ~ input")可以匹配到所有與表單同輩的input元素 |
子元素選擇器
子元素選擇器就是通過與當(dāng)前匹配元素選擇該元素包含的特定子元素启泣。子元素選擇器包含四種類型:
選 擇 器 | 說明 |
---|---|
:nth-child | 匹配其父元素下的第N個(gè)子或奇偶元素 |
:first-child | 匹配第一個(gè)子元素 :first選擇器只匹配一個(gè)元素,而:first-child選擇符將為每個(gè)父元素匹配一個(gè)子元素 |
:last-child | 匹配最后一個(gè)子元素 :last選擇器只匹配一個(gè)元素示辈,而:last-child選擇符將為每個(gè)父元素匹配一個(gè)子元素 |
:only-child | 如果某個(gè)元素是父元素中唯一的子元素寥茫,那將會(huì)匹配,如果父元素中含有其他元素矾麻,那將不會(huì)被匹配 |
4纱耻、過濾選擇器
過濾選擇器主要通過特定的過濾表達(dá)式來篩選特殊需求的DOM元素,過濾選擇器的語法形式與CSS的偽類選擇器的語法格式相同险耀,即以冒號作為前綴標(biāo)識符弄喘。
定位過濾器
定位過濾器主要是根據(jù)編號和排位篩選特定位置上的元素,或者過濾掉特定元素甩牺。
選 擇 器 | 說明 | 舉例 |
---|---|---|
:first | 匹配找到的第一個(gè)元素 | $("tr:first")表示匹配表格的第一行 |
:last | 匹配找到的最后一個(gè)元素 | $("tr:last")表示匹配表格的最后一行 |
:not | 去除所有與給定選擇器匹配的元素 | $("input:not(:checked)")表示匹配所有未選中的input元素 |
:even | 匹配所有索引值為偶數(shù)的元素蘑志,從0開始計(jì)數(shù) | $("tr:even")可以匹配表格的1、3贬派、5...行(即索引值為0急但,2,4...) |
:odd | 匹配所有索引值為奇數(shù)的元素赠群,從0開始計(jì)數(shù) | $("tr:odd")可以匹配表格的2羊始、4、6...行(即索引值為1查描,3突委,5...) |
:eq | 匹配一個(gè)給定索引值的元素,從0開始計(jì)數(shù) | $("tr:eq(0)")表示匹配第1行表格行 |
:gt | 匹配所有大于給定索引值的元素冬三,從0開始計(jì)數(shù) | $("tr:gt(0)")可以匹配第2行及其后面行 |
:lt | 匹配所有小于給定索引值的元素 | $("tr:lt(1)")可以匹配第一行 |
:header | 匹配如h1匀油、h2、h3之類的標(biāo)題元素 | |
:animated | 匹配所有正在執(zhí)行動(dòng)畫效果的元素 |
內(nèi)容過濾器
內(nèi)容過濾器主要根據(jù)匹配元素所包含的子元素或者文本內(nèi)容進(jìn)行過濾
選 擇 器 | 說明 | 舉例 |
---|---|---|
:contains | 匹配包含給定文本的元素 | $("div:contains('圖片')")匹配所有包含“圖片”的div元素 |
:empty | 匹配所有不包含子元素或者文本的空元素 | |
:has | 匹配含有選擇器所匹配的元素的元素 | $("div:has(p)")匹配所有包含p的div元素 |
:parent | 匹配含有子元素或者文本的元素 |
可見過濾器
可見過濾器就是根據(jù)元素的可見或者隱藏來進(jìn)行匹配的
選 擇 器 | 說明 |
---|---|
:hidden | 匹配所有不可見元素勾笆,或者type為hidden的元素 |
:visible | 匹配所有的可見元素 |
5敌蚜、屬性選擇器
屬性選擇器主要根據(jù)元素的屬性及其屬性值作為過濾的條件,來匹配對應(yīng)的DOM元素窝爪。屬性選擇器都是以中括號作為起止分界符弛车,如[attribute]齐媒,與偽類選擇器特征都比較明顯,jQuery定義了7中屬性選擇器
選 擇 器 | 說明 | 舉例 |
---|---|---|
[attribute] |
匹配包含給定屬性的元素 |
$("div[id]") 表示查找所有含有id屬性的div元素 |
[attribute=value] |
匹配屬性等于特定值的元素纷跛。屬性值的引號在大多數(shù)情況下是可選的喻括,如果屬性值中包含“]”時(shí),需要加引號以避免沖突 |
$("input[name='text']") 表示查找所有name屬性值是'text'的input元素 |
[attribute!=value] |
匹配所有不含有指定的屬性或者屬性不等于特定值的元素贫奠。該選擇器等價(jià)于:not([attr=value])唬血,要匹配含有特定屬性但不等于特定值的元素,可以使用[attr]:not([attr=value]) |
$("input[name!='text']") 表示查找所有name屬性值不是'text'的input元素 |
[attribute^=value] |
匹配給定的屬性是以某些值開始的元素 |
$("input[name^='text']") 表示所有name屬性值是以'text'開始的input元素 |
[attribute$=value] |
匹配給定的屬性是以某些值結(jié)尾的元素 |
$("input[name$='text']") 表示所有name屬性值是以'text'結(jié)尾的input元素 |
[attribute*=value] |
匹配給定的屬性是包含某些值的元素 |
$("input[name*='text']") 表示所有name屬性值是包含'text'字符串的input元素 |
[selector1][selector2][selectorN] |
復(fù)合屬性選擇器唤崭,需要同時(shí)滿足多個(gè)條件時(shí)使用 |
$("input[name*='text'][id]") 表示所有name屬性值包含'text'字符串拷恨,且包含了id屬性的input元素 |
6、表單選擇器
表單是頁面中使用頻率較高的元素之一谢肾,為了方便用戶靈活操作表單腕侄,jQuery專門定義了表單選擇器,使用表單選擇器可以方便獲取表單中某類表單域?qū)ο?/p>
基本表單選擇器
jQuery定義了一組偽類選擇器勒叠,利用他們可以獲取頁面中的表單類型元素
選 擇 器 | 說明 |
---|---|
:input | 匹配所有input兜挨、textarea膏孟、select眯分、button元素 |
:text | 匹配所有單行文本框 |
:password | 匹配所有密碼框 |
:radio | 匹配所有單選按鈕 |
:checkbox | 匹配所有復(fù)選框 |
:submit | 匹配所有提交按鈕 |
:image | 匹配所有圖像域 |
:reset | 匹配所有重置按鈕 |
:button | 匹配所有按鈕 |
:file | 匹配所有文件域 |
:hidden | 匹配所有不可見元素,或者type為hidden的元素 |
高級表單選擇器
jQuery根據(jù)表單域特有的特定定義了4個(gè)表單屬性選擇器柒桑,這些選擇器與基本表單選擇器不同弊决,它們可以選擇任何類型的表單域,因?yàn)樗饕鶕?jù)表單屬性來進(jìn)行選擇
選 擇 器 | 說明 |
---|---|
:enabled | 匹配所有可用元素 |
:disabled | 匹配所有不可用元素 |
:checked | 匹配所有被選中的元素(復(fù)選框魁淳、單選按鈕等飘诗,不包括select中的option) |
:selected | 匹配所有選中的option元素 |
7、jQuery選擇器優(yōu)化
正確使用選擇器引擎對于頁面性能起了至關(guān)重要的作用界逛。使用合適的選擇器表達(dá)式可以提高性能昆稿、增強(qiáng)語義并簡化邏輯。在傳統(tǒng)用法中息拜,最常用的是ID選擇器溉潭、類(Class)選擇器和類型選擇器,其中速度最快的是ID選擇器少欺,使用了JavaScript中的內(nèi)置函數(shù)getElementById()喳瓣。其次是類型選擇器,使用了JavaScript中的內(nèi)置函數(shù)getElementsByTagName()赞别。速度最慢的是Class選擇器畏陕,其需要通過解析HTML文檔樹,并且需要在瀏覽器內(nèi)核外遞歸仿滔,這種遞歸遍歷是無法被優(yōu)化的惠毁。
基于以上問題犹芹,在使用jQuery應(yīng)注意以下問題:
- 多用ID選擇器
- 少直接使用Class選擇器【洗拢可以使用復(fù)合選擇器羽莺,摒除表達(dá)式中的冗余部分,對于不必要的復(fù)合表達(dá)式進(jìn)行簡化
- 多用父子關(guān)系洞豁,少用嵌套關(guān)系盐固。如使用parent > child代替parent child
- 緩存jQuery對象
低效的用法:
for (i = 0; i < 100; i++) {
var myList = $('.myList');
myList.append(i);
}
使用下面的先緩存jQuery對象,則執(zhí)行效率會(huì)大大提高
var myList = $('.myList');
for (i = 0; i < 100; i++) {
myList.append(i);
}
8丈挟、使用原生選擇器
Selectors API是由W3C發(fā)起指定的一個(gè)標(biāo)準(zhǔn)刁卜,致力于讓瀏覽器原生支持CSS查詢。DOM API模塊的核心是兩個(gè)方法:querySelector()
和querySelectorAll()
曙咽。這兩個(gè)方法能夠根據(jù)CSS選擇器規(guī)范蛔趴,便捷定位文檔中指定元素,前者返回的是一個(gè)元素對象例朱,后者返回的是一個(gè)元素集合孝情。
Document、DocumentFragment洒嗤、Element都實(shí)現(xiàn)了NodeSelector接口箫荡,即這三種類型的節(jié)點(diǎn)都擁有querySelector()和querySelectorAll()方法。