最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

jQuery代碼性能優(yōu)化的10種方法

 更新時間:2016年06月21日 09:31:02   作者:沫魚  
之前,我們減少字節(jié)數(shù)和請求次數(shù)以及加載順序以使頁面加載的更快。如今,我們越來越多的注意到另一個影響網(wǎng)站性能的部分--CPU利用率。使用 jQuery和其他JavaScript框架,使節(jié)點選擇和DOM操作變得越來越容易,如果使用不當,有可能影響整個網(wǎng)頁的響應(yīng)速度。

1、總是使用#id去尋找element.

在jQuery中最快的選擇器是ID選擇器 ($('#someid')). 這是因為它直接映射為JavaScript的getElementById()方法。
選擇單個元素

<div id="content">

 <form method="post" action="/">

  <h2>Traffic Light</h2>

  <ul id="traffic_light">

   <li><input type="radio" class="on" name="light" value="red" /> Red</li>

   <li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>

   <li><input type="radio" class="off" name="light" value="green" /> Green</li>

  </ul>

  <input class="button" id="traffic_button" type="submit" value="Go" />

 </form>

</div>

選擇button的性能不好的一種方式:

var traffic_button = $('#content .button');

取而代之的是直接選擇button:

var traffic_button = $('#traffic_button');

選擇多個元素

在我們討論選擇多個元素的時候,我們真正需要知道的是DOM的遍歷和循環(huán)才是性能低下的原因。為了盡量減少性能損失, 總是使用最近的父ID去尋找。

var traffic_lights = $('#traffic_light input');

2、在Classes前面使用Tags

在jQuery中第二快的選擇器就是Tag選擇器 ($('head')). 而這是因為它直接映射到JavaScript的getElementsByTagName()方法。

<div id="content">

 <form method="post" action="/">

  <h2>Traffic Light</h2>

  <ul id="traffic_light">

   <li><input type="radio" class="on" name="light" value="red" /> Red</li>

   <li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>

   <li><input type="radio" class="off" name="light" value="green" /> Green</li>

  </ul>

  <input class="button" id="traffic_button" type="submit" value="Go" />

 </form>

</div>

總是在一個Class前面加上一個tag名字(記得從一個ID傳下來)

var active_light = $('#traffic_light input.on');

注意:在jQuery里Class選擇器是最慢的一個選擇器;在IE中它循環(huán)整個DOM??赡艿脑挶M量避免使用它。不要在ID前面 加Tags。例如,它會因為去循環(huán)所有的<div>元素去尋找ID為content的<div>,而導(dǎo)致很慢。

var content = $('div#content');

按照同樣的思路,從多個ID傳下來是冗余的。

var traffic_light = $('#content #traffic_light');

3、緩存jQuery對象

養(yǎng)成保存jQuery對象到一個變量上(就像上面的例子)的習慣。例如,不要這樣做:

$('#traffic_light input.on).bind('click', function(){...});

$('#traffic_light input.on).css('border', '3px dashed yellow');

$('#traffic_light input.on).css('background-color', 'orange');

$('#traffic_light input.on).fadeIn('slow');

取而代之,首現(xiàn)保存jQuery變量到一個本地變量后,再繼續(xù)你的操作。

var $active_light = $('#traffic_light input.on');
 
$active_light.bind('click', function(){...});
 
$active_light.css('border', '3px dashed yellow');
 
$active_light.css('background-color', 'orange');
 
$active_light.fadeIn('slow');

提示:使用$前輟表示我們的本地變量是一個jQuery包集。記住,不要在你的應(yīng)該程序里出現(xiàn)一次以上的jQuery重復(fù)的選擇操作。 額外提示:延遲存儲jQuery對象結(jié)果。

如果你想在你的程序的其它地方使用jQuery結(jié)果對象(result object(s)),或者你的函數(shù)要執(zhí)行多次,要把它緩存在一個全局范圍的對象里。通過定義一個全局容器保存jQuery結(jié)果對象,就可以在其它的函數(shù)里引用它。

// Define an object in the global scope (i.e. the window object)

window.$my ={

 // Initialize all the queries you want to use more than once

 head : $('head'),

 traffic_light : $('#traffic_light'),

 traffic_button : $('#traffic_button')};

function do_something(){

 // Now you can reference the stored results and manipulate them

 var script = document.createElement('script');

 $my.head.append(script);

 // When working inside functions, continue to save jQuery results

 // to your global container.

 $my.cool_results = $('#some_ul li');

 $my.other_results = $('#some_table td');

 // Use the global functions as you would a normal jQuery result

 $my.other_results.css('border-color', 'red');

 $my.traffic_light.css('border-color', 'green');

}

4、更好的利用鏈

前面的例子也可以這樣寫:

var $active_light = $('#traffic_light input.on');

$active_light.bind('click', function(){...})

 .css('border', '3px dashed yellow')

 .css('background-color', 'orange')

 .fadeIn('slow');

這樣可以讓我們寫更少的代碼,使JavaScript更輕量。

5、使用子查詢

jQuery允許我們在一個包集上附加其它的選擇器。因為我們已經(jīng)在本地變量里保存了父對象這樣會減少以后在選擇器上的性能開銷。

<div id="content">

 <form method="post" action="/">

  <h2>Traffic Light</h2>

  <ul id="traffic_light">

   <li><input type="radio" class="on" name="light" value="red" /> Red</li>

   <li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>

   <li><input type="radio" class="off" name="light" value="green" /> Green</li>

  </ul>

  <input class="button" id="traffic_button" type="submit" value="Go" />

 </form>

</div>

例如,我們可以利用子查詢緩存active和inactive lights以便后面的操作。

var $traffic_light = $('#traffic_light'), 

$active_light = $traffic_light.find('input.on'), 

$inactive_lights = $traffic_light.find('input.off');

提示:可以用逗號隔開一次定義多個本地變量,這樣可以節(jié)省一些字節(jié)。

6、限制直接對DOM操作

DOM操作的基本做法是在內(nèi)存中創(chuàng)建DOM結(jié)構(gòu),然后再更新DOM結(jié)構(gòu)。這不是jQuery最好的做法,但對JavaScript來講是高效的。直接操作DOM結(jié)構(gòu)性能是低下的。 例如,如果你需要動態(tài)創(chuàng)建一列元素,不要這樣做:

var top_100_list = [...], // assume this has 100 unique strings 

$mylist = $('#mylist'); // jQuery selects our <ul> element

for (var i=0, l=top_100_list.length; i<l; i++){ 

 $mylist.append('<li>' + top_100_list[i] + '</li>');

}

取而代之,我們希望在插入DOM結(jié)構(gòu)之前先在一個字符串里創(chuàng)建一套元素。
代碼

var top_100_list = [...], // assume this has 100 unique strings 

$mylist = $('#mylist'), // jQuery selects our <ul> element 

top_100_li = ""; // This will store our list items

for (var i=0, l=top_100_list.length; i<l; i++){

 top_100_li += '<li>' + top_100_list[i] + '</li>';

}

$mylist.html(top_100_li);

更快的做法,在插入DOM結(jié)構(gòu)之前我們應(yīng)該總是在一個父節(jié)點里包含許多元素

var top_100_list = [...], // assume this has 100 unique strings 

$mylist = $('#mylist'), // jQuery selects our <ul> element 

top_100_ul = '<ul id="#mylist">'; // This will store our entire unordered list

for (var i=0, l=top_100_list.length; i<l; i++){

 top_100_ul += '<li>' + top_100_list[i] + '</li>';

}

top_100_ul += '</ul>'; // Close our unordered list

$mylist.replaceWith(top_100_ul);

如是你照著上面的做了還是對性能有些迷惑的話,可以參考以下內(nèi)容:

* 試一下jQuery提供的Clone()方法。Clone()方法創(chuàng)建節(jié)點數(shù)的拷貝,隨后你可以在這個副本中進行操作。

* 使用DOM DocumentFragments. As the creator of jQuery points out, 比直接操作DOM性能上更好. 先創(chuàng)建你需要的結(jié)構(gòu)(就像我們上面用一個字符串做的一樣), 然后使用jQuery的 insert or replace methods.

7、事件委托(又名:冒泡事件)

除非特別說明,每一個JavaScript事件(如click, mouseover 等)在DOM結(jié)構(gòu)樹上都會冒泡到它的父元素上。如果我們想讓很多elements(nodes)調(diào)用同一個function這是非常有用的。取而代之的是 你可以只對它們的父級綁定一次,而且可以計算出是哪一個節(jié)點觸發(fā)了事件,而不是綁定一個事件監(jiān)聽器到很多節(jié)點上這種效率低下的方式。例如,假如我們要開發(fā) 一個包含很多input的大型form,當input被選擇的時候我們想綁定一個class name。像這樣的幫定是效率低下的:

$('#myList li).bind('click', function(){

 $(this).addClass('clicked'); // do stuff

});

反而,我們應(yīng)該在父級偵聽click事件。

$('#myList).bind('click', function(e){

 var target = e.target, // e.target grabs the node that triggered the event.

  $target = $(target); // wraps the node in a jQuery object

 if (target.nodeName === 'LI') {

  $target.addClass('clicked');  // do stuff

 }

});

父節(jié)點擔當著發(fā)報機的工作,可以在觸發(fā)了事件的目標element上做一些工作。如果你發(fā)現(xiàn)自己把一個event listener幫定到很多個element上,那么你這種做法是不正確的。

8、消除查詢浪費

雖然jQuery對沒有找到任何匹配的elements處理的很好,但是它還是需要花費時間去查找的。如果你的站點有一個全局的JavaScript,你可能會把每個jQuery function都放在 $(document).ready(function(){ // all my glorious code })里。 不要這樣做。只去放一些頁面上適合用到的function。這樣做最有效的方式是你的模板可以完全控制任何時候或者地方執(zhí)行JavaScript以內(nèi)聯(lián)腳 本的方式初始化function。例如,在你的“article”頁面模板里,你可能在body標簽關(guān)閉之前包含以下代碼

<script type="text/javascript>mylib.article.init();</script></body& gt;如果你的頁面模板包含多種有可能在頁面或者不在頁面上的模塊,或者為了可視化效果你需要它們稍后再初如化,你應(yīng)該在這些模塊之后立即放置初如化函數(shù)。

<ul id="traffic_light">

 <li><input type="radio" class="on" name="light" value="red" /> Red</li>

 <li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>

 <li><input type="radio" class="off" name="light" value="green" /> Green</li>

</ul>



<script type="text/javascript>mylib.traffic_light.init();</script>

你的全局JavaScript庫看起來應(yīng)該是這樣的:

var mylib ={

 article_page : {

  init : function()  {

   // Article page specific jQuery functions. 

  }

 }, 

 traffic_light : {

  init : function()  {

   // Traffic light specific jQuery functions. 

  }

 }

}

9、遵從$(windows).load

有 一種誘惑會使jQuery開發(fā)者hook所有事情到 $(document).ready 這個虛偽的事件里。畢竟在大多數(shù)例子里都可以看到這樣使用。雖然$(document).ready 非常有用,它在頁面呈現(xiàn)時發(fā)生,雖然其它對象還在下載中。如果你發(fā)現(xiàn)你的頁面在下載中停頓,就有可能是$(document).ready 引起的。你可以通過把jQuery functions幫定到$(window).load事件來減少下面下載時的CPU使用率,它是在所有HTML(包括iframe內(nèi)容)都下載完以后才 去調(diào)用所有對象的。

$(window).load(function(){

 // jQuery functions to initialize after the page has loaded.

});

多余的功能,如拖拽、幫定可視化效果和動畫、預(yù)讀取圖片等,使用這種方法比較好。

10、壓縮JS

雖然和jQuery無關(guān),但在這里也要提一下。使JavaScript函數(shù)和變量變得可讀是一個趨勢,這對開發(fā)者來講是必不可少的,但對普通用戶來 講沒有任何關(guān)系。不用什么借口,是時候把JS壓縮納入我們的工作流程中來了。注釋你的代碼,在投放到生產(chǎn)環(huán)境之前找一個壓縮工具進行壓縮。使用 YUICompressor 壓縮你代碼中多余的浪費的字節(jié)。根據(jù)我們的經(jīng)驗,它可以安全的把JavaScript壓縮的盡可能小,而不會多占用CPU。小提示:為了在 YUICompressor里最大化壓縮,應(yīng)該這樣這樣定義變量(例如:var my_long_variable_name;)

學習和最有效的使用jQuery,最好的方法就是去查jQuery的文檔和手冊了。

以上就是本文的全部內(nèi)容,了解更多jQuery的語法,大家可以查看:《jQuery 1.10.3 在線手冊》,也希望大家多多支持腳本之家。

相關(guān)文章

  • jQuery給指定的table動態(tài)添加刪除行的操作方法

    jQuery給指定的table動態(tài)添加刪除行的操作方法

    今天在項目中,剛好用到給指定的table添加一行、刪除一行。添加一行,支持在任意行添加一行且可配置的,刪除一行支持動態(tài)刪除一行。本文給大家介紹的非常詳細,一起看看吧
    2016-10-10
  • jQuery插件學習教程之SlidesJs輪播+Validation驗證

    jQuery插件學習教程之SlidesJs輪播+Validation驗證

    這篇文章主要介紹了jQuery插件學習教程之SlidesJs輪播+Validation驗證的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • 基于Layer+jQuery的自定義彈框

    基于Layer+jQuery的自定義彈框

    這篇文章主要介紹了基于Layer+jQuery的自定義彈框,功能強大,實用性強,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • jQuery 核心函數(shù)以及jQuery對象

    jQuery 核心函數(shù)以及jQuery對象

    首先介紹 jQuery 的幾個核心函數(shù),在 jQuery 中它們起著至關(guān)重要的作用,在實際的前端開發(fā)過程中用到最多的也是它們。
    2010-03-03
  • JQuery文本框高亮顯示插件代碼

    JQuery文本框高亮顯示插件代碼

    JQuery 中沒有文本框高亮顯示這個插件,自己今天寫了一個Plugin,把代碼貼出來分享一下
    2011-04-04
  • jquery插件開發(fā)注意事項小結(jié)

    jquery插件開發(fā)注意事項小結(jié)

    Jquery是繼prototype之后又一個優(yōu)秀的Javascrīpt框架。它是輕量級的js庫(壓縮后只有21k) ,它兼容CSS3,還兼容各種瀏覽器 (IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)
    2013-06-06
  • jQuery基本選擇器之標簽名選擇器

    jQuery基本選擇器之標簽名選擇器

    這篇文章主要介紹了jQuery基本選擇器之標簽名選擇器的相關(guān)資料,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • 使用delegate方法為一個tr標簽加一個鏈接

    使用delegate方法為一個tr標簽加一個鏈接

    這篇文章主要介紹了使用delegate方法為一個tr標簽加一個鏈接,并規(guī)定當這些事件發(fā)生時運行的函數(shù),需要的朋友可以參考下
    2014-06-06
  • jquery使用ColorBox彈出圖片組瀏覽層實例演示

    jquery使用ColorBox彈出圖片組瀏覽層實例演示

    本示例使用Jquery的ColorBox插件彈出圖片組瀏覽層,點擊會彈出頁中窗的效果同時帶有關(guān)閉及上一個下一個的切換,個人感覺相當不錯的彈出窗,感興趣的你可不要錯過了哈
    2013-03-03
  • JQuery動畫與特效實例分析

    JQuery動畫與特效實例分析

    這篇文章主要介紹了JQuery動畫與特效的用法,實例分析了顯示與隱藏、滑動、淡入淡出及自定義動畫的使用技巧,需要的朋友可以參考下
    2015-02-02

最新評論

抚松县| 苍南县| 射洪县| 正蓝旗| 阜阳市| 亚东县| 银川市| 德化县| 邹平县| 黎平县| 墨脱县| 紫金县| 神农架林区| 唐河县| 崇州市| 宁陵县| 调兵山市| 通州市| 章丘市| 太康县| 秦皇岛市| 鄂尔多斯市| 新巴尔虎右旗| 常州市| 霍州市| 博湖县| 金川县| 天台县| 沧源| 邛崃市| 宁武县| 韶山市| 玛沁县| 文昌市| 定襄县| 渝北区| 乌拉特中旗| 阜平县| 宜阳县| 海晏县| 临湘市|