亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

jQuery代碼性能優化的10種方法

2019-11-20 09:39:07
字體:
來源:轉載
供稿:網友

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的遍歷和循環才是性能低下的原因。為了盡量減少性能損失, 總是使用最近的父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中它循環整個DOM??赡艿脑挶M量避免使用它。不要在ID前面 加Tags。例如,它會因為去循環所有的<div>元素去尋找ID為content的<div>,而導致很慢。

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

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

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

3、緩存jQuery對象

養成保存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');

取而代之,首現保存jQuery變量到一個本地變量后,再繼續你的操作。

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包集。記住,不要在你的應該程序里出現一次以上的jQuery重復的選擇操作。 額外提示:延遲存儲jQuery對象結果。

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

// 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允許我們在一個包集上附加其它的選擇器。因為我們已經在本地變量里保存了父對象這樣會減少以后在選擇器上的性能開銷。

<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');

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

6、限制直接對DOM操作

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

var top_100_list = [...], // assume this has 100 unique strings $mylist = $('#mylist'); // jQuery selects our <ul> elementfor (var i=0, l=top_100_list.length; i<l; i++){  $mylist.append('<li>' + top_100_list[i] + '</li>');}

取而代之,我們希望在插入DOM結構之前先在一個字符串里創建一套元素。
代碼

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 itemsfor (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結構之前我們應該總是在一個父節點里包含許多元素

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 listfor (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);

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

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

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

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

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

$('#myList li).bind('click', function(){ $(this).addClass('clicked'); // do stuff});

反而,我們應該在父級偵聽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 }});

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

8、消除查詢浪費

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

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

<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庫看起來應該是這樣的:

var mylib ={ article_page : {  init : function()  {   // Article page specific jQuery functions.   } },  traffic_light : {  init : function()  {   // Traffic light specific jQuery functions.   } }}

9、遵從$(windows).load

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

$(window).load(function(){ // jQuery functions to initialize after the page has loaded.});

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

10、壓縮JS

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

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

以上就是本文的全部內容,了解更多jQuery的語法,大家可以查看:《jQuery 1.10.3 在線手冊》,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品视频免费播放| 成人免费福利视频| 亚洲国产精品va在看黑人| 欧美一级视频免费在线观看| 国产成人精品999| 国产婷婷成人久久av免费高清| 国产日韩综合一区二区性色av| 欧美激情综合色| 91久久久亚洲精品| 色777狠狠综合秋免鲁丝| 亚洲精品欧美一区二区三区| 免费av一区二区| 综合国产在线观看| 亚洲精品免费一区二区三区| 亚洲一区二区少妇| 另类天堂视频在线观看| 成人免费大片黄在线播放| 亚洲美女精品成人在线视频| 欧美做受高潮电影o| 亚洲美女自拍视频| 国产精品日韩欧美| 一区二区三区无码高清视频| 2019中文字幕全在线观看| 91成品人片a无限观看| 成人免费观看网址| 精品国产一区二区三区久久久| 精品视频在线导航| 亚洲精品理论电影| 欧美三级免费观看| 国产免费一区二区三区在线能观看| 国产精品久久久久久久久久| 日韩毛片中文字幕| 日韩av资源在线播放| 福利视频第一区| 国产亚洲欧洲高清| 95av在线视频| 久久黄色av网站| 国产一区二区动漫| 97在线免费观看| 最近2019年好看中文字幕视频| 欧美亚洲午夜视频在线观看| 国产亚洲欧美日韩精品| 国产精品视频一区国模私拍| 国产视频自拍一区| 亚洲人午夜精品| 亚洲国产精品va| 久久久久久美女| 欧美猛少妇色xxxxx| 亚洲欧美制服综合另类| 日韩欧美在线第一页| 在线一区二区日韩| 日本成人在线视频网址| 在线观看成人黄色| 91九色视频在线| 欧美成人免费在线视频| 国产精品三级久久久久久电影| 国产一区二区黑人欧美xxxx| 最新日韩中文字幕| 日韩电影免费观看在线| 91亚洲国产成人精品性色| 97香蕉久久夜色精品国产| 亚洲的天堂在线中文字幕| 欧美电影《睫毛膏》| 欧美性69xxxx肥| 欧美激情国产高清| 欧美日韩人人澡狠狠躁视频| 国产做受高潮69| 亚洲免费电影在线观看| 欧美激情手机在线视频| 精品美女久久久久久免费| 精品magnet| 亚洲护士老师的毛茸茸最新章节| 欧美性猛交xxxx免费看| 永久免费精品影视网站| 亚洲乱码一区av黑人高潮| 视频一区视频二区国产精品| 91精品国产色综合久久不卡98口| 琪琪亚洲精品午夜在线| 国产午夜精品全部视频播放| 午夜精品久久久99热福利| 亚洲最大中文字幕| 欧美高清视频免费观看| 欧美日本在线视频中文字字幕| 国产成人精品亚洲精品| 日本精品中文字幕| 亚洲图片欧美日产| 国产精品欧美日韩一区二区| 欧美极度另类性三渗透| 中文字幕日韩视频| 国产精品日韩欧美大师| 日韩成人性视频| 97精品一区二区视频在线观看| 热久久美女精品天天吊色| 欧美国产精品人人做人人爱| 亚洲综合中文字幕68页| 精品无人区乱码1区2区3区在线| 日韩av在线免费观看一区| 欧美多人乱p欧美4p久久| 亚洲欧洲偷拍精品| 欧美精品国产精品日韩精品| 亚洲xxxxx| 久久精品久久久久久国产 免费| 国模私拍视频一区| 欧美刺激性大交免费视频| 91精品国产91久久| 91亚洲永久免费精品| 国产欧美va欧美va香蕉在线| 日韩一区二区精品视频| 91福利视频在线观看| 欧美成人精品在线视频| 国产z一区二区三区| 最新亚洲国产精品| 欧洲美女7788成人免费视频| 亚洲人成电影网| 欧美—级a级欧美特级ar全黄| 亚洲一区亚洲二区| 日韩乱码在线视频| 国产精品激情av在线播放| 国产精品在线看| 热久久美女精品天天吊色| 亚洲影院色在线观看免费| 激情懂色av一区av二区av| 亚洲人成电影网站色…| 亚洲免费视频一区二区| 国外成人在线视频| 国产精品亚发布| 性夜试看影院91社区| 欧美日韩国产二区| 亚洲男人的天堂在线播放| 色婷婷av一区二区三区久久| 国产精品成熟老女人| 欧美亚洲第一区| 久久久精品美女| 亚洲色图激情小说| 久久久久久久久久亚洲| 国产精品一区二区av影院萌芽| 97福利一区二区| 日韩免费在线电影| 精品久久久久久久久久久久| 午夜精品一区二区三区av| 国产欧美一区二区三区久久| 亚洲国产天堂网精品网站| 亚洲男子天堂网| 欧美激情欧美激情在线五月| 亚洲精品福利资源站| 久久精品成人动漫| 亚洲福利视频在线| 色爱av美腿丝袜综合粉嫩av| 久久久在线免费观看| 国产精品扒开腿爽爽爽视频| 欧美日韩一区二区三区在线免费观看| 狠狠综合久久av一区二区小说| 欧美激情奇米色| 久热精品视频在线观看一区| 欧洲精品在线视频| 亚洲精品白浆高清久久久久久| 97在线看福利| 国产综合香蕉五月婷在线| 日本国产高清不卡| 久久视频这里只有精品| 亚洲国产精久久久久久久| 欧美午夜性色大片在线观看| 日韩av在线播放资源| 国产精品视频久|