国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

jQuery 效率提升建議

liuhh / 2663人閱讀

摘要:網(wǎng)上有一篇文章轉(zhuǎn)載比較泛濫,已經(jīng)不知道原文作者了,里面針對效率提升建議非常科學(xué),現(xiàn)在重新組織里面的內(nèi)容并轉(zhuǎn)載。事實(shí)上,這種處理完全不必要。利用這一點(diǎn),可以大大簡化事件的綁定。對象由于會對變更,速度會遠(yuǎn)慢于函數(shù)。

jQuery簡潔通用的方法集把編碼者從繁重的工作中解脫出來,也拉低了進(jìn)入javascript的門檻,初學(xué)者對瀏覽器兼容性一無所知的情況下,幾行代碼就可以寫出超炫的特效。網(wǎng)上有一篇文章轉(zhuǎn)載比較泛濫,已經(jīng)不知道原文作者了,里面針對jQuery效率提升建議非常科學(xué),現(xiàn)在重新組織里面的內(nèi)容并轉(zhuǎn)載。


1.使用最新版本的jQuery

jQuery的版本更新很快,你應(yīng)該總是使用最新的版本。因?yàn)樾掳姹緯倪M(jìn)性能,還有很多新功能。 下面就來看看,不同版本的jQuery性能差異有多大。這里是三條最常見的jQuery選擇語句:

$(".elem")
$(".elem", context)
context.find(".elem")

我們用1.4.2、1.4.4、1.6.2三個(gè)版本的jQuery測試,看看瀏覽器在1秒內(nèi)能夠執(zhí)行多少次。結(jié)果如下:

可以看到,1.6.2版本的運(yùn)行次數(shù),遠(yuǎn)遠(yuǎn)超過兩個(gè)老版本。尤其是第一條語句,性能有數(shù)倍的提高。其他語句的測試,比如.attr(“value”).val(),也是新版本的jQuery表現(xiàn)好于老版本。

2.正確使用選擇器

在jquery中,你可以用多種選擇器,選擇同一個(gè)網(wǎng)頁元素。每種選擇器的性能是不一樣的,你應(yīng)該了解它們的性能差異。

最快的選擇器:id選擇器和元素標(biāo)簽選擇器

舉例來說,下面的語句性能最佳:
$("#id")
$("form")
$("input")
遇到這些選擇器的時(shí)候,jQuery內(nèi)部會自動調(diào)用瀏覽器的原生方法(比如getElementById()),所以它們的執(zhí)行速度快。

較慢的選擇器:class選擇器
$(".className")的性能,取決于不同的瀏覽器。Firefox、Safari、Chrome、Opera瀏覽器,都有原生方法getElementByClassName(),所以速度并不慢。但是,IE5-IE8都沒有部署這個(gè)方法,所以這個(gè)選擇器在IE中會相當(dāng)慢,jQuery歷次更新對IE8之前的版本來說是沒有用處的。

最慢的選擇器:偽類選擇器和屬性選擇器

先來看例子。找出網(wǎng)頁中所有的隱藏元素,就要用到偽類選擇器:
$(":hidden")

屬性選擇器的例子則是:
$("[attribute=value]")

這兩種語句是最慢的,因?yàn)闉g覽器沒有針對它們的原生方法。但是,一些瀏覽器的新版本,增加了querySelector()querySelectorAll()方法,因此會使這類選擇器的性能有大幅提高。

最后是不同選擇器的性能比較圖。

可以看到,ID選擇器遙遙領(lǐng)先,然后是標(biāo)簽選擇器,第三是Class選擇器,其他選擇器都非常慢。

3.理解子元素和父元素的關(guān)系

下面六個(gè)選擇器,都是從父元素中選擇子元素。你知道哪個(gè)速度最快,哪個(gè)速度最慢嗎?

$(".child", $parent)
$parent.find(".child")
$parent.children(".child")
$("#parent > .child")
$("#parent .child")
$(".child", $("#parent"))

我們一句句來看。

$(".child", $parent)
這條語句的意思是,給定一個(gè)DOM對象,然后從中選擇一個(gè)子元素。jQuery會自動把這條語句轉(zhuǎn)成$.parent.find("child"),這會導(dǎo)致一定的性能損失。它比最快的形式慢了5%-10%。

$parent.find(".child")
這條是最快的語句。.find()方法會調(diào)用瀏覽器的原生方法(getElementByIdgetElementByNamegetElementByTagName等等),所以速度較快。

$parent.children(".child")
這條語句在jQuery內(nèi)部,會使用$.sibling()和javascript的nextSibling()方法,一個(gè)個(gè)遍歷節(jié)點(diǎn)。它比最快的形式大約慢50%。

$("#parent > .child")
jQuery內(nèi)部使用Sizzle引擎,處理各種選擇器。Sizzle引擎的選擇順序是從右到左,所以這條語句是先選.child,然后再一個(gè)個(gè)過濾出父元素#parent,這導(dǎo)致它比最快的形式大約慢70%。

$("#parent .child")
這條語句與上一條是同樣的情況。但是,上一條只選擇直接的子元素,這一條可以于選擇多級子元素,所以它的速度更慢,大概比最快的形式慢了77%。

$(".child", $("#parent"))
jQuery內(nèi)部會將這條語句轉(zhuǎn)成$("#parent").find(".child"),比最快的形式慢了23%。所以,最佳選擇是$parent.find(".child")。而且,由于$parent往往在前面的操作已經(jīng)生成,jQuery會進(jìn)行緩存,所以進(jìn)一步加快了執(zhí)行速度。

4.不要過度使用jQuery

jQuery速度再快,也無法與原生的javascript方法相比。所以有原生方法可以使用的場合,盡量避免使用jQuery。
請看下面的例子,為a元素綁定一個(gè)處理點(diǎn)擊事件的函數(shù):

$("a").click(function(){
    alert($(this).attr("id"));
});

這段代碼的意思是,點(diǎn)擊a元素后,彈出該元素的id屬性。為了獲取這個(gè)屬性,必須連續(xù)兩次調(diào)用jQuery,第一次是$(this),第二次是attr("id")
事實(shí)上,這種處理完全不必要。更正確的寫法是,直接采用javascript原生方法調(diào)用this.id,根據(jù)測試,this.id的速度比$(this).attr("id")快了20多倍。

5.做好緩存

選中某一個(gè)網(wǎng)頁元素,是開銷很大的步驟。所以,使用選擇器的次數(shù)應(yīng)該越少越好,并且盡可能緩存選中的結(jié)果,便于以后反復(fù)使用。 比如,下面這樣的寫法就是糟糕的寫法:

jQuery("#top").find("p.classA");
jQuery("#top").find("p.classB");

更好的寫法是:

var cached = jQuery("#top");
cached.find("p.classA");
cached.find("p.classB");

根據(jù)測試,緩存比不緩存,快了2-3倍。

6.使用鏈?zhǔn)綄懛?/b>

jQuery的一大特點(diǎn),就是允許使用鏈?zhǔn)綄懛ā?/p>

$("div").find("h3").eq(2).html("Hello");
采用鏈?zhǔn)綄懛〞r(shí),jQuery自動緩存每一步的結(jié)果,因此比非鏈?zhǔn)綄懛ㄒ臁8鶕?jù)測試,鏈?zhǔn)綄懛ū龋ú皇褂镁彺娴模┓擎準(zhǔn)綄懛ǎ蠹s快了25%。

7.事件的委托處理(EventDelegation)

javascript的事件模型,采用”冒泡”模式,也就是說,子元素的事件會逐級向上”冒泡”,成為父元素的事件。
利用這一點(diǎn),可以大大簡化事件的綁定。比如,有一個(gè)表格(table元素),里面有100個(gè)格子(td元素),現(xiàn)在要求在每個(gè)格子上面綁定一個(gè)點(diǎn)擊事件(click),請問是否需要將下面的命令執(zhí)行100次?

$("td").bind("click", function(){
    $(this).toggleClass("click");
});

回答是不需要,我們只要把這個(gè)事件綁定在table元素上面就可以了,因?yàn)閠d元素發(fā)生點(diǎn)擊事件之后,這個(gè)事件會”冒泡”到父元素table上面,從而被監(jiān)聽到。
因此,這個(gè)事件只需要在父元素綁定1次即可,而不需要在子元素上綁定100次,從而大大提高性能。這就叫事件的”委托處理”,也就是子元素”委托”父元素處理這個(gè)事件。
具體的寫法有兩種。第一種是采用.delegate()方法:

$("table").delegate("td","click", function(){
    $(this).toggleClass("click");
});

第二種是采用.live()方法:

$("table").each(function(){
    $("td", this).live("click",function(){
        $(this).toggleClass("click");
    });
});

這兩種寫法基本等價(jià)。唯一的區(qū)別在于,.delegate()是當(dāng)事件冒泡到指定的父元素時(shí)觸發(fā),.live()則是當(dāng)事件冒泡到文檔的根元素后觸發(fā),因此.delegate().live()稍快一點(diǎn)。此外,這兩種方法相比傳統(tǒng)的.bind()方法還有一個(gè)好處,那就是對動態(tài)插入的元素也有效,.bind()只對已經(jīng)存在的DOM元素有效,對動態(tài)插入的元素?zé)o效。
根據(jù)測試,委托處理比不委托處理,快了幾十倍。在委托處理的情況下,.delegate()又比.live()大約快26%。

8.少改動DOM結(jié)構(gòu)

改動DOM結(jié)構(gòu)開銷很大,因此不要頻繁使用.append().insertBefore().insetAfter()這樣的方法。
如果要插入多個(gè)元素,就先把它們合并,然后再一次性插入。根據(jù)測試,合并插入比不合并插入,快了將近10倍。

如果你要對一個(gè)DOM元素進(jìn)行大量處理,應(yīng)該先用.detach()方法,把這個(gè)元素從DOM中取出來,處理完畢以后,再重新插回文檔。根據(jù)測試,使用.detach()方法比不使用時(shí),快了60%。

如果你要在DOM元素上儲存數(shù)據(jù),不要寫成下面這樣:

var elem = $("#elem");
elem.data(key,value);

而要寫成

var elem = $("#elem");
$.data(elem,key,value);

根據(jù)測試, 后一種寫法要比前一種寫法,快了將近10倍。因?yàn)?b>elem.data()方法是定義在jQuery函數(shù)的prototype對象上面的, 而$.data()方法是定義jQuery函數(shù)上面的,調(diào)用的時(shí)候不從復(fù)雜的jQuery對象上調(diào)用,所以速度快得多。(此處可以參閱下面第10點(diǎn)。)

9.正確處理循環(huán)

循環(huán)總是一種比較耗時(shí)的操作,如果可以使用復(fù)雜的選擇器直接選中元素,就不要使用循環(huán),去一個(gè)個(gè)辨認(rèn)元素。
javascript原生循環(huán)方法for和while,要比jQuery的.each()方法快,應(yīng)該優(yōu)先使用原生方法。

10.盡量少生成jQuery對象

每當(dāng)你使用一次選擇器(比如$("#id")),就會生成一個(gè)jQuery對象。jQuery對象是一個(gè)很龐大的對象,帶有很多屬性和方法,會占用不少資源。所以,盡量少生成jQuery對象。
舉例來說,許多jQuery方法都有兩個(gè)版本,一個(gè)是供jQuery對象使用的版本,另一個(gè)是供jQuery函數(shù)使用的版本。下面兩個(gè)例子,都是取出一個(gè)元素的文本,使用的都是text()方法。你既可以使用針對jQuery對象的版本:

var $text = $("#text");
var $ts = $text.text();

也可以使用針對jQuery函數(shù)的版本:

var $text = $("#text");
var $ts = $.text($text);

由于后一種針對jquery函數(shù)的版本不通過jQuery對象操作,所以相對開銷較小,速度比較快。

11.小結(jié)

jQuery對象方法和自身函數(shù)運(yùn)行速度我進(jìn)行了一下對比,分別測試了文章中提到的text和data,text測試結(jié)果不是很明顯,$.text比對象方法text略占上風(fēng)。對象data由于會對dom變更,速度會遠(yuǎn)慢于jQuery函數(shù)data。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/26029.html

相關(guān)文章

  • web前端--10個(gè)妨礙進(jìn)步的學(xué)習(xí)方式

    摘要:之前寫文章的時(shí)候,我說過很多學(xué)習(xí)的方式和建議。今天換一下,說一下我個(gè)人不建議的學(xué)習(xí)方式,或者我個(gè)人覺得是妨礙進(jìn)步的學(xué)習(xí)方式,希望大家引以為鑒如果大家有什么補(bǔ)充和指點(diǎn)的,歡迎指出。 1.前言 從事web前端的人很多,每個(gè)人的學(xué)習(xí)方式,學(xué)習(xí)習(xí)慣基本不會一模一樣!關(guān)于web前端(或者直接互聯(lián)網(wǎng)),大家都知道,是做到老,學(xué)到老的一個(gè)行業(yè)。之前寫文章的時(shí)候,我說過很多學(xué)習(xí)的方式和建議。今天換一下...

    liuchengxu 評論0 收藏0
  • JavaScript入門的5條建議

    摘要:你是否已經(jīng)初步掌握了和,但完全不知道從何入手如果是,那么這篇文章一定會對你有所幫助,這里總結(jié)了條建議,幫助初學(xué)者總結(jié)學(xué)習(xí)方法,提高學(xué)習(xí)效率。這樣的結(jié)果就是,個(gè)小時(shí)最多只利用了個(gè)小時(shí)。 你是否已經(jīng)初步掌握了html和css,但完全不知道從何入手JavaScript?如果是,那么這篇文章一定會對你有所幫助,這里總結(jié)了5條建議,幫助JavaScript初學(xué)者總結(jié)學(xué)習(xí)方法,提高學(xué)習(xí)效率。 一、...

    李昌杰 評論0 收藏0
  • 【JavaScript】window與undefined作為參數(shù)的作用

    摘要:比如函數(shù)執(zhí)行作用一函數(shù)內(nèi)部是隔離的區(qū)域函數(shù)執(zhí)行過程中,如果能在參數(shù)處找到那么就不會去全局作用域中找,所以結(jié)果就是效率高,提升性能。結(jié)論作為實(shí)參的用意提高性能方便代碼壓縮。作為形參的用意防止的值被修改早期的低版本瀏覽器中。 本文行文流程 兩個(gè)大的信息來源:teacher與segmentfault論壇,以此分為兩大板塊 第一大板塊:一個(gè)普通的自調(diào)用函數(shù)==》加了各種參數(shù)的自調(diào)用函數(shù)==》...

    legendmohe 評論0 收藏0
  • 前端性能優(yōu)化

    摘要:端優(yōu)談?wù)勱P(guān)于前端的緩存的問題我們都知道對頁面進(jìn)行緩存能夠有利于減少請求發(fā)送,從而達(dá)到對頁面的優(yōu)化。而作為一名有追求的前端,勢必要力所能及地優(yōu)化我們前端頁面的性能。這種方式主要解決了淺談前端中的過早優(yōu)化問題過早優(yōu)化是萬惡之源。 優(yōu)化向:單頁應(yīng)用多路由預(yù)渲染指南 Ajax 技術(shù)的出現(xiàn),讓我們的 Web 應(yīng)用能夠在不刷新的狀態(tài)下顯示不同頁面的內(nèi)容,這就是單頁應(yīng)用。在一個(gè)單頁應(yīng)用中,往往只有一...

    Dean 評論0 收藏0

發(fā)表評論

0條評論

liuhh

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<