2013-02-16 63 views
0

我想在我的沉重的JavaScript UI應用程序中做出一些嚴重的延遲削減。 我已經讀了如何優化代碼,並從我學到了一些東西,我的理解是:

  1. $(元素)。每個()使事情變得更慢
  2. 變量(和HTML對象)應該被緩存

這是一個函數內我現有的代碼的一部分運行經常在我的應用程序:

if($('.textbox').length > 0) 
{ $(".textbox").each(function(){ 
      var parts = $(this).attr('id').split('_'); 
      // do some linear-time operations here with $this 
      }); 
    }); 

到目前爲止,我知道我應該把$this = $(this).each()的開頭,並且只使用$(this)。但我還能做什麼?有沒有更快的替代方法來使用.each()?我確實需要檢查出每個div.textbox類。

回答

1

但我還能做什麼呢?

幾件事情:

  1. 是絕對沒有指向您的if聲明(除非它有您還沒有表現出一個else條款),因爲一個空的jQuery對象上調用.each是一個沒有-OP。去掉它。

  2. 如果您不想刪除它,至少要緩存DOM查找的結果,因爲每次調用$('.textbox')時,jQuery必須關閉並查詢DOM。

  3. id是DOM元素實例的反射特性,所以$(this).attr("id").split('_')涉及多個函數調用和存儲器分配可以通過使用this.id.split('_')避免。

所以這給了我們:

$('.textbox').each(function() { 
    var parts = this.id.split('_'); 
    // Do something with `parts` 
}); 

,或者出現您還沒有表現出一個else:如果我使用純JavaScript

var boxes = $('.textbox'); 
if (boxes.length) { 
    boxes.each(function() { 
     var part s= this.id.split('_'); 
     // ... 
    }); 
} 
else { 
    // ... 
} 
+0

謝謝!我對你直接使用'this'的方式有些困惑。比使用'$ this'更有效嗎?我們可以直接使用'this',即使是像'$ this.css('left')'這樣的東西嗎? – user961627 2013-02-16 12:54:17

+1

@ user961627:在'each'(和內jQuery的事件處理程序),'this'指原始DOM元素,這意味着可以使用任何屬性或DOM元素具有的方法(參見[各種DOM規格](HTTP:/ /www.w3.org/DOM/DOMTR))。當你執行'$(this)'時,你調用了jQuery並傳入了DOM元素,並且找回了一個jQuery包裝器。這個包裝器提供了像'css'這樣的jQuery函數。 – 2013-02-16 13:04:34

+0

謝謝 - 我一直對這個包裝部分感到困惑 - 你把這些話寫得很清楚。 – user961627 2013-02-16 13:09:02

1

你正在使用jQuery,它在後面執行了很多代碼。最快的方式是原生Javascript。

真正的小優化是從this得到id。您也可以使用這個(純JS)的jQuery將執行很多功能):

var parts = this.id.split('_'); 

因此,例如
讓所有的元素儘可能快。您可以使用此函數來獲取類名的元素:

if (document.getElementsByClassName == undefined) { 
    document.getElementsByClassName = function(className) 
    { 
     var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)"); 
     var allElements = document.getElementsByTagName("*"); 
     var results = []; 

     var element; 
     for (var i = 0; (element = allElements[i]) != null; i++) { 
      var elementClass = element.className; 
      if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass)) 
       results.push(element); 
     } 

     return results; 
    } 
} 

和代碼循環:

var elements = getElementsByClassName(".textbox"); 
for(var i=0;i<elements.length;i++) 
{ 
    var splitid = elements[i].id.split("_"); 
} 
+0

,我還需要到使用'getElementsByClassName(「。textbox」);',或者我們會在類名之前擺脫點'.'?另外,只是想知道 - 不是大多數瀏覽器已經定義了「document.getElementsByClassName」嗎? – user961627 2013-02-16 13:04:21

+0

@ user961627:你會擺脫斑點的(但你也不得不併不是所有的瀏覽器都有'getElementsByClassName'的問題,雖然所有現代的做)。但是,這是一個**巨大的**過度泛化,認爲使用「純JavaScript」比使用庫「更快」。在絕大多數情況下,如果您正確使用庫,則沒有可衡量的差異(例如,通過不連續兩次查詢相同信息的DOM,這會比僅僅執行一次更慢你是如何做到的)。 – 2013-02-16 13:07:34

+0

謝謝@TJJCrowder,這是我的意思,jQuery真的很好做事容易。但是,如果你想要表現,你可能不希望所有的圖書館開銷。 – Niels 2013-02-16 13:26:34