jQuery代碼優(yōu)化 選擇符篇
更新時(shí)間:2011年11月01日 17:08:39 作者:
毫無(wú)疑問(wèn),jQuery的獨(dú)到之處就是它以集合為中心的操作。為了取得DOM對(duì)象集合,jQuery利用JavaScript不僅實(shí)現(xiàn)了(它誕生時(shí))很多瀏覽器不支持的CSS選擇符,還實(shí)現(xiàn)了不少獨(dú)到的自定義選擇符,為在文檔中查找元素提供了極大的便利
本文就從選擇符的角度簡(jiǎn)單探討一下優(yōu)化jQuery代碼的問(wèn)題。
Sizzle的運(yùn)行機(jī)制
jQuery從1.3開(kāi)始把根據(jù)選擇符表達(dá)式查找元素的代碼獨(dú)立出來(lái),也就是Sizzle引擎。當(dāng)我們把一個(gè)選擇符表達(dá)式(比如"#id"、".class"、":nth-child(2)")傳遞給$()函數(shù)時(shí),Sizzle在內(nèi)部會(huì)優(yōu)先利用瀏覽器原生支持的DOM方法來(lái)查找元素,以求得最大的執(zhí)行速度。以下就是Sizzle會(huì)優(yōu)先選用的幾個(gè)標(biāo)準(zhǔn)的原生方法(各個(gè)方法的用途不再贅述):
getElementById()
getElementsByTagName()
getElementsByClassName()
querySelectorAll()
如果瀏覽器不支持某個(gè)方法,或者傳入的選擇符表達(dá)式不是標(biāo)準(zhǔn)選擇符(如":eq()"、":odd"或其他自定義選擇符),Sizzle就會(huì)使用document.getElementsByTagName('*')來(lái)取得文檔中的所有元素,然后再遍歷并測(cè)試每個(gè)元素。顯然,這是萬(wàn)不得已才會(huì)用的方法;可想而知,這個(gè)最笨的方法,效率也是最低的。
優(yōu)化示例
舉個(gè)例子,假設(shè)我們要取得頁(yè)面表單中的所有的文本框,即:
<input type="text">
可以使用兩個(gè)選擇符:
$('input[type="text"]')
$('input:text')
第一個(gè)選擇符是標(biāo)準(zhǔn)的CSS屬性選擇符,第二個(gè)選擇符是自定義選擇符。根據(jù)前面對(duì)Sizzle引擎的分析可知,在大多數(shù)現(xiàn)代瀏覽器(支持原生querySelectorAll()方法的瀏覽器)中,第一個(gè)選擇符的速度比第二個(gè)要快很多。
再舉一個(gè)例子。假設(shè)有下面兩個(gè)jQuery查詢(xún):
$('input').eq(1)
$('input:eq(1)')
第一個(gè)查詢(xún)先通過(guò)標(biāo)準(zhǔn)的CSS元素選擇符查找所有input元素,然后再調(diào)用jQuery的eq()方法取得匹配結(jié)果中的第二個(gè)元素(eq()方法的索引參數(shù)是從0開(kāi)始計(jì)算的)。第二個(gè)查詢(xún)則使用了自定義的偽類(lèi)選擇符:eq()。通過(guò)測(cè)試可以看出,第一種方法的速度比第二種方法快得就更多了。
結(jié)論
要盡可能使用CSS規(guī)范中規(guī)定的選擇符,除非沒(méi)有標(biāo)準(zhǔn)選擇符,才考慮使用jQuery的自定義選擇符。
(注:本文基于《jQuery基礎(chǔ)教程(第3版)》相關(guān)章節(jié)內(nèi)容編撰而成。)
Sizzle的運(yùn)行機(jī)制
jQuery從1.3開(kāi)始把根據(jù)選擇符表達(dá)式查找元素的代碼獨(dú)立出來(lái),也就是Sizzle引擎。當(dāng)我們把一個(gè)選擇符表達(dá)式(比如"#id"、".class"、":nth-child(2)")傳遞給$()函數(shù)時(shí),Sizzle在內(nèi)部會(huì)優(yōu)先利用瀏覽器原生支持的DOM方法來(lái)查找元素,以求得最大的執(zhí)行速度。以下就是Sizzle會(huì)優(yōu)先選用的幾個(gè)標(biāo)準(zhǔn)的原生方法(各個(gè)方法的用途不再贅述):
復(fù)制代碼 代碼如下:
getElementById()
getElementsByTagName()
getElementsByClassName()
querySelectorAll()
如果瀏覽器不支持某個(gè)方法,或者傳入的選擇符表達(dá)式不是標(biāo)準(zhǔn)選擇符(如":eq()"、":odd"或其他自定義選擇符),Sizzle就會(huì)使用document.getElementsByTagName('*')來(lái)取得文檔中的所有元素,然后再遍歷并測(cè)試每個(gè)元素。顯然,這是萬(wàn)不得已才會(huì)用的方法;可想而知,這個(gè)最笨的方法,效率也是最低的。
優(yōu)化示例
舉個(gè)例子,假設(shè)我們要取得頁(yè)面表單中的所有的文本框,即:
<input type="text">
可以使用兩個(gè)選擇符:
復(fù)制代碼 代碼如下:
$('input[type="text"]')
$('input:text')
第一個(gè)選擇符是標(biāo)準(zhǔn)的CSS屬性選擇符,第二個(gè)選擇符是自定義選擇符。根據(jù)前面對(duì)Sizzle引擎的分析可知,在大多數(shù)現(xiàn)代瀏覽器(支持原生querySelectorAll()方法的瀏覽器)中,第一個(gè)選擇符的速度比第二個(gè)要快很多。
再舉一個(gè)例子。假設(shè)有下面兩個(gè)jQuery查詢(xún):
復(fù)制代碼 代碼如下:
$('input').eq(1)
$('input:eq(1)')
第一個(gè)查詢(xún)先通過(guò)標(biāo)準(zhǔn)的CSS元素選擇符查找所有input元素,然后再調(diào)用jQuery的eq()方法取得匹配結(jié)果中的第二個(gè)元素(eq()方法的索引參數(shù)是從0開(kāi)始計(jì)算的)。第二個(gè)查詢(xún)則使用了自定義的偽類(lèi)選擇符:eq()。通過(guò)測(cè)試可以看出,第一種方法的速度比第二種方法快得就更多了。
結(jié)論
要盡可能使用CSS規(guī)范中規(guī)定的選擇符,除非沒(méi)有標(biāo)準(zhǔn)選擇符,才考慮使用jQuery的自定義選擇符。
(注:本文基于《jQuery基礎(chǔ)教程(第3版)》相關(guān)章節(jié)內(nèi)容編撰而成。)
相關(guān)文章
jQuery實(shí)現(xiàn)base64前臺(tái)加密解密功能詳解
這篇文章主要介紹了jQuery實(shí)現(xiàn)base64前臺(tái)加密解密功能,結(jié)合實(shí)例形式分析了jquery.base64.js實(shí)現(xiàn)前臺(tái)base64加密與解密功能的實(shí)現(xiàn)方法,并給出了java實(shí)現(xiàn)后臺(tái)base64加密解密的操作示例對(duì)比驗(yàn)證加密效果,需要的朋友可以參考下2017-08-08Javascript 使用ajax與C#獲取文件大小實(shí)例詳解
本文章向碼農(nóng)們介紹了js ajax獲取文件大小的實(shí)例,涉及JavaScript調(diào)用ajax交互及后臺(tái)C#文件操作的相關(guān)技巧,需要的朋友可以參考下2017-01-01最新最熱最實(shí)用的15個(gè)jQuery插件匯總
本文給大家匯總介紹了2015年7月最新發(fā)布的最熱最實(shí)用的15款jQuery插件,都有著非常炫酷的效果,十分的實(shí)用,這里推薦給大家。2015-07-07jQuery EasyUI datagrid實(shí)現(xiàn)本地分頁(yè)的方法
這篇文章主要介紹了jQuery EasyUI datagrid實(shí)現(xiàn)本地分頁(yè)的方法,以實(shí)例形式較為詳細(xì)的分析了本地分頁(yè)的原理與相關(guān)的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-02-02jQuery中使用validate插件校驗(yàn)表單功能
這篇文章主要介紹了jQuery中使用validate插件校驗(yàn)表單功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒,需要的朋友可以參考下2019-05-05js根據(jù)json數(shù)據(jù)中的某一個(gè)屬性來(lái)給數(shù)據(jù)分組的方法
今天小編就為大家分享一篇js根據(jù)json數(shù)據(jù)中的某一個(gè)屬性來(lái)給數(shù)據(jù)分組的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10