摘要: 我一直在尋找有關jQuery性能優化方面的小竅門,能讓我那臃腫的動態網頁應用變得輕便些。找了不少文章後,我決定將最好最經常使用的一些優化性能的建議列出來javascript
我一直在尋找有關jQuery性能優化方面的小竅門,能讓我那臃腫的動態網頁應用變得輕便些。找了不少文章後,我決定將最好最經常使用的一些優化性能的建議列出來 1. $('#content').hide(); java 複製代碼jquery 或者從ID選擇器繼承來選擇多個元素:git 1. $('#content p').hide(); github 複製代碼ajax 2. 在class前面使用tag 1. varreceiveNewsletter = $('#nslForm input.on'); api 複製代碼瀏覽器 jQuery中class選擇器是最慢的,由於在IE瀏覽器下它會遍歷全部的DOM節點。儘可能避免使用class選擇器。也不要用tag來修飾ID。下面的例子會遍歷全部的div元素來查找id爲’content’的那個節點: 1. varcontent = $('div#content');// 很是慢,不要使用 複製代碼 用ID來修飾ID也是多此一舉: 1. vartraffic_light = $('#content #traffic_light');// 很是慢,不要使用 複製代碼 3. 使用子查詢 1. varheader = $('#header'); 2. varmenu = header.find('.menu'); 3. // 或者 4. varmenu = $('.menu', header); 複製代碼 4. 優化選擇器以適用Sizzle的「從右至左」模型 1. vardivs = $('.testdiv','#pageBody');// 2353 on Firebug 3.6 2. vardivs = $('#pageBody').find('.testdiv');// 2324 on Firebug 3.6 - The best time 3. vardivs = $('#pageBody .testdiv');// 2469 on Firebug 3.6 複製代碼 6. 利用強大的鏈式操做 1. $('li.menu-item').click(function() {alert('test click');}) 2. .css('display','block') 3. .css('color','red') 4. fadeTo(2, 0.7); 複製代碼 記住,永遠不要讓相同的選擇器在你的代碼裏出現屢次: 1. $.extend($.expr[':'], { 2. abovethefold:function(el) { 3. return$(el).offset().top < $(window).scrollTop() + $(window).height(); 4. } 5. }); 6. varnonVisibleElements = $('div:abovethefold');// 選擇元素 複製代碼 ================================================================= 1. varheader = $('#header'); 2. vardivs = header.find('div'); 3. varforms = header.find('form'); 複製代碼 9. 當要進行DOM插入時,將全部元素封裝成一個元素 1. varmenu = '<ul id="menu">'; 2. for(vari = 1; i < 100; i++) { 3. menu += '<li>'+ i + '</li>'; 4. } 5. menu += '</ul>'; 6. $('#header').prepend(menu); 7. // 千萬不要這樣作: 8. $('#header').prepend('<ul id="menu"></ul>'); 9. for(vari = 1; i < 100; i++) { 10. $('#menu').append('<li>'+ i + '</li>'); 11. } 複製代碼 冒泡事件:除非在特殊狀況下, 不然每個js事件(例如:click, mouseover等.)都會冒泡到父級節點。當咱們須要給多個元素調用同個函數時這點會頗有用。代替這種效率不好的多元素事件監聽的方法就是, 你只需向它們的父節點綁定一次。好比, 咱們要爲一個擁有不少輸入框的表單綁定這樣的行爲: 當輸入框被選中時爲它添加一個class傳統的作法是,直接選中input,而後綁定focus等,以下所示: 1. $("#entryform input").bind("focus",function(){ 2. $(this).addClass("selected"); 3. }).bind("blur",function(){ 4. $(this).removeClass("selected"); 5. }); 複製代碼 固然上面代碼能幫咱們完成相應的任務,但若是你要尋求更高效的方法,請使用以下代碼: 1. $("#entryform").bind("focus",function(e){ 2. var$cell = $(e.target); // e.target 捕捉到觸發的目標元素 3. $cell.addClass("selected"); 4. }).bind("blur",function(e){ 5. var$cell = $(e.target); 6. $cell.removeClass("selected"); 7. }); 複製代碼 通過在父級監聽獲取焦點和失去焦點的事件,對目標元素進行操做。在上面代碼中,父級元素扮演了一個調度員的角色, 它能夠基於目標元素綁定事件。若是你發現你給不少元素綁定了同一個事件監聽, 那麼如今的你確定知道哪裏作錯了。同理,在Table操做時,咱們也可使用這種方式加以改進代碼:普通的方式 1. $('#myTable td').click(function(){ 2. $(this).css('background','red'); 3. }); 4. 改進方式: 5. $('#myTable').click(function(e) { 6. var$clicked = $(e.target); 7. $clicked.css('background','red'); 8. }); 複製代碼 假設有100個td,在使用普通的方式的時候,你綁定了100個事件。在改進方式中,你只爲一個元素綁定了1個事件,至因而100個事件的效率高,仍是1個事件的效率高,相信你也能自行分辨了。 1. App.hiddenDivs = $('div.hidden'); 2. // 以後在你的應用中調用: 3. App.hiddenDivs.find('span'); 複製代碼 13. 採用jQuery的內部函數data()來存儲狀態 1. $('#head').data('name','value'); 2. // 以後在你的應用中調用: 3. $('#head').data('name'); 複製代碼 14. 使用jQuery utility函數 1. $("table").delegate("td","hover",function(){ 2. $(this).toggleClass("hover"); 3. }); 複製代碼 18.使用ready事件的簡寫 1. / 也不要使用 2. $(document).ready(function(){ 3. // 代碼 4. }); 5. // 你能夠如此簡寫: 6. $(function(){ 7. // 代碼 8. }); 複製代碼 ================================================================= 1. // 在Firebug控制檯記錄數據的快捷方式 2. $.l($('div')); 3. // 獲取UNIX時間戳 4. $.time(); 5. // 在Firebug記錄執行代碼時間 6. $.lt(); 7. $('div'); 8. $.lt(); 9. // 將代碼塊放在一個for循環中測試執行時間 10. $.bm("var divs = $('.testdiv', '#pageBody');");// 2353 on Firebug 3.6 複製代碼 ================================================================= 1. $('<style type="text/css"> div.class { color: red; } </style>') 2. .appendTo('head'); 複製代碼 24. 避免載入多餘的代碼 1. // 連接特定版本的壓縮代碼 2. <script type="text/javascript"src="[color=blue !important][url=https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js]https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js[/url]"></script> 複製代碼 28. 緩慢載入內容不只能提升載入速度,也能提升SEO優化(Lazy load content for speed and SEO benefits) |