2010-06-29 50 views
3

我通過AJAX調用從服務器獲取胖JSON數組,然後處理它並使用Javascript呈現HTML。我想要的是儘可能快地做到這一點。使用Javascript呈現HTML的策略

Chrome在我的測試中領先於FF,但它仍然需要5-8秒才能讓瀏覽器呈現~300條記錄。

我認爲延遲加載比如Google Reader中實現的延遲加載,但這違背了我的其他用例,例如能夠獲得即時搜索結果(在客戶端對我們獲取的所有記錄進行簡單搜索JSON數組)和多個過濾器。

我注意到的一件事是FF和Chrome都不會渲染任何東西,直到它們遍歷JSON數組中的所有項目,即使我在每個循環後都明確地將新創建的元素插入到DOM中(只要我有HTML)。我想達到的就是這樣:強制瀏覽器儘快呈現。

我試着推遲調用(數組中的每個項目都會被延遲函數處理),但是在那裏遇到了額外的問題,因爲看起來執行的順序不再保證了(一些項目進一步向下在之前的其他項目之前處理)。

我在這裏尋找任何提示和技巧。

+0

渲染300+ DOM節點是要花費時間。我建議你檢查一下dojo網格(http:// dojotoolkit。org)它實現了惰性渲染,但您仍然可以保留客戶端上的所有數據。 – Maz 2010-06-29 13:50:44

+2

這可能是一個好主意*不*分別將每個元素插入到DOM中。構建一個容器元素並將其保留在DOM之外,直到你填充完畢。 (300條記錄對我來說看起來並不是那麼重要,你應該能夠讓它運行得比5到8秒快) – Pointy 2010-06-29 13:55:47

回答

1

嘗試:

  • 推行到一個數組,然後簡單地

    el.innerHTML = array.join(""); 
    
  • 使用document fragments

    var frag = document.createDocumentFragment(); 
    for (loop) { 
        frag.appendChild(el); 
    } 
    parent.appendChild(frag); 
    
0

嘗試在分離的DOM節點或文檔片段中創建元素,然後將所有內容一次性附加。

+0

......或者文檔片段 – Pointy 2010-06-29 13:53:37

+0

@Pointy - 確實如此。答案已更新。 – Oded 2010-06-29 13:54:19

+0

有趣!我做到了這一點,它將Chrome中的渲染時間縮短到1秒。然而,Firefox 3.6仍然需要5秒鐘。我想我必須自己優化渲染算法。 – 2010-06-29 15:29:55

1

如果您不需要一次顯示全部300條記錄,那麼您可以嘗試一次爲它們分頁30或50條記錄,並且只展開JSON數組,因爲這些子部分需要通過尋呼機顯示或一個本地搜索框。一旦轉換後,您可以緩存內容供隨後顯示,因爲用戶可以在頁面上下瀏覽。

0

300不是很多。 我設法使用jQuery在JSON中創建一個包含JSON數據的500多個元素的樹,在Chrome上只需幾分之一秒。 300不是一個大數字。

如果它們渲染的很慢,可能是由於做錯的方式。你能指定你是如何做到的嗎?

最慢的方法是將HTML寫入Javascript中的字符串,然後將其分配給innerHtml成員。但那300行仍然會很快。