2012-06-28 27 views
0

我有一個大表列出了約50名用戶和他們的賬戶,包括他們有「項目」的數量一些簡單的數據。當點擊用戶行時,會在下面展開更多行,以顯示每個項目的詳細信息。大多數用戶只有不到20個項目,所以這對瀏覽器來說並不是很重要。然而,有幾個用戶擁有100多個項目(其中一個擁有500多個項目),當點擊用戶行時,瀏覽器停頓的時間爲1-4秒。需要通過500多個表格行循環瀏覽器正在窒息

錶行設置,以便與.project類的任何行默認情況下隱藏,並在用戶行點擊(無.project類)當與.project類的所有後續行具有類.open其中加入顯示它們。

關於如何使運行速度更快的建議?有沒有更好,更乾淨的方法來達到相同的效果?

下面是HTML的一個簡化版本:

<table> 
    <tr> 
     <td>Username</td><td>Email</td><td>10 Projects</td> 
    </tr> 
    <tr class="project"> 
     <td>&nbsp;</td><td>&nbsp;</td><td>Project Name</td> 
    </tr> 
    <tr class="project"> 
     <td>&nbsp;</td><td>&nbsp;</td><td>Project Name</td> 
    </tr> 
    <tr class="project"> 
     <td>&nbsp;</td><td>&nbsp;</td><td>Project Name</td> 
    </tr> 
    <tr class="project"> 
     <td>&nbsp;</td><td>&nbsp;</td><td>Project Name</td> 
    </tr> 
    <tr class="project"> 
     <td>&nbsp;</td><td>&nbsp;</td><td>Project Name</td> 
    </tr> 
    <tr class="project"> 
     <td>&nbsp;</td><td>&nbsp;</td><td>Project Name</td> 
    </tr> 
    <tr class="project"> 
     <td>&nbsp;</td><td>&nbsp;</td><td>Project Name</td> 
    </tr> 
    <tr class="project"> 
     <td>&nbsp;</td><td>&nbsp;</td><td>Project Name</td> 
    </tr> 
    <tr class="project"> 
     <td>&nbsp;</td><td>&nbsp;</td><td>Project Name</td> 
    </tr> 
    <tr class="project"> 
     <td>&nbsp;</td><td>&nbsp;</td><td>Project Name</td> 
    </tr> 
    <tr> 
     <td>Username</td><td>Email</td><td>3 Projects</td> 
    </tr> 
    <tr class="project"> 
     <td>&nbsp;</td><td>&nbsp;</td><td>Project Name</td> 
    </tr> 
    <tr class="project"> 
     <td>&nbsp;</td><td>&nbsp;</td><td>Project Name</td> 
    </tr> 
    <tr class="project"> 
     <td>&nbsp;</td><td>&nbsp;</td><td>Project Name</td> 
    </tr> 
</table> 

...和JS:

(function($) { 

    $.fn.viewProjects = function() { 

     this.each(function() { 
      $(this).click(function(){ 

       var projects = $(this).nextUntil(':not(.project)'); // get all rows that follow and have the '.project' class 

       if ($(this).hasClass('focused')) { // collapse 
        $(this).removeClass('focused'); 
        projects.each(function(n, proj){ 
         $(proj).removeClass('open'); 
        }); 
       } 
       else { // expand 
        $(this).addClass('focused'); 
        projects.each(function(n, proj){ 
         $(proj).addClass('open'); 
        }); 
       } 

      }); 
     }); 

    }; 

    $('tr:not(.project)').viewProjects(); 

})(jQuery); 
+0

你有沒有考慮過或者你打算分頁結果?所以說,在給定的時間只顯示20個用戶項目。 –

+0

分頁是另一種解決方案 - 好主意@happytimeharry – BumbleB2na

回答

2

這是因爲DOM加載到這麼多東西加入。我在類似情況下做的是:

  • 檢查是否有超過50行
  • 如果是這樣,則停在50和放置一個「點擊查看更多」鏈接。
  • 點擊後,加載下50行。
  • 繼續此過程,直到加載所有行。

或者,您可以在用戶向下滾動頁面時自動觸發下一行50行。我更喜歡顯示一個鏈接,因爲自動加載的東西可能會令人困惑。

編輯 - 如果您使用jQuery顯示和隱藏內容而不是每次添加和刪除類,會出現什麼情況?

if ($(this).hasClass('focused')) { // collapse 
    $(this).removeClass('focused'); 
    projects.hide(); 
} 
else { // expand 
    $(this).addClass('focused'); 
    projects.show(); 
} 
+0

同樣是否也用於隱藏?例如,點擊具有500多個項目的用戶時,顯示項目大約需要2秒鐘的時間。再次點擊隱藏時,需要的時間差不多。順便說一句,我不是實際添加或從DOM中刪除。我只是改變一個類,將它們從'position:absolute'改爲''position:static;'。 –

+0

這聽起來像絕對和靜態定位之間的切換是非常處理器密集型。我知道固定定位可以是處理器擴展..你可以離開你的元素作爲絕對定位,然後在點擊事件jquery .show()和.hide()之間切換嗎? – BumbleB2na

0

您可以檢查webworker創建線程來提高性能。我知道這是一個模糊的,但我想提出這個方向。

不幸的是,我們不能在webworkers內部操縱DOM。但是DOM可以在你的客戶端代碼上操作。

看來您正在使XMLhttprequest獲取新數據,並且這可以在webworkers內完成。

0

你不需要每個。jQuery中點擊功能是支持鏈式這可能加快速度:

(function($) { 

    $.fn.viewProjects = function() { 

      $(this).click(function(){ 

       var projects = $(this).nextUntil(':not(.project)'); // get all rows that follow and have the '.project' class 

       if ($(this).hasClass('focused')) { // collapse 
        $(this).removeClass('focused'); 
        projects.each(function(n, proj){ 
         $(proj).removeClass('open'); 
        }); 
       } 
       else { // expand 
        $(this).addClass('focused'); 
        projects.each(function(n, proj){ 
         $(proj).addClass('open'); 
        }); 
       } 

      }); 

    }; 

    $('tr:not(.project)').viewProjects(); 

})(jQuery); 
+0

這段代碼有什麼不同? –

+0

啊......我明白了。謝謝。 –

+0

有興趣知道它是否有所作爲? – Liam

0

相反的顯示/隱藏500個項目,顯示/隱藏一個:

重組HTML到這樣的事情:

<table> 
    <tr> 
     <td>Username</td><td>Email</td><td>10 Projects</td> 
    </tr> 
    <tr class="project"> 
     <td colspan="3"> 
      <ul> 
       <li>Project Name</li> 
       <li>Project Name</li> 
       <li>Project Name</li> 
       <li>Project Name</li> 
       <li>Project Name</li> 
       <li>Project Name</li> 
       <li>Project Name</li> 
       <li>Project Name</li> 
       <li>Project Name</li> 
     </ul> 
    </td> 
</tr> 

+0

我認爲,但項目細節需要與用戶細節保持一致。 –

+0

@BrandonDurham不知道你所說的「項目細節需要與用戶的詳細信息比對」是什麼意思(?視覺上這可以用確實的造型完成),但任何時候你有HTML這樣的:'​​ ​​ '是時候考慮重組。 – steveax

+0

這是簡化的示例代碼。我拿出敏感信息並換成' '。 –