jQuery筆記(二)-- 使用選擇器

選擇器是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()方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渔隶,一起剝皮案震驚了整個(gè)濱河市羔挡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌间唉,老刑警劉巖绞灼,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呈野,居然都是意外死亡低矮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門被冒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來军掂,“玉大人,你說我怎么就攤上這事姆打×寄罚” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵幔戏,是天一觀的道長玛追。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么痊剖? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任韩玩,我火速辦了婚禮,結(jié)果婚禮上陆馁,老公的妹妹穿的比我還像新娘找颓。我一直安慰自己,他們只是感情好叮贩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布击狮。 她就那樣靜靜地躺著,像睡著了一般益老。 火紅的嫁衣襯著肌膚如雪彪蓬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天捺萌,我揣著相機(jī)與錄音档冬,去河邊找鬼。 笑死桃纯,一個(gè)胖子當(dāng)著我的面吹牛酷誓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播态坦,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盐数,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驮配?” 一聲冷哼從身側(cè)響起娘扩,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤着茸,失蹤者是張志新(化名)和其女友劉穎壮锻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涮阔,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猜绣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敬特。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掰邢。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伟阔,靈堂內(nèi)的尸體忽然破棺而出辣之,到底是詐尸還是另有隱情,我是刑警寧澤皱炉,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布怀估,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏多搀。R本人自食惡果不足惜歧蕉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望康铭。 院中可真熱鬧惯退,春花似錦、人聲如沸从藤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夷野。三九已至叠荠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扫责,已是汗流浹背榛鼎。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鳖孤,地道東北人者娱。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像苏揣,于是被迫代替她去往敵國和親黄鳍。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容