2012-02-27 38 views
1

我在頁面上有很多選擇輸入(96或384)。每個選項都有一個廣泛的選項列表 - 幾乎1000個。因此,頁面大小介於4-8MB(壓縮爲1-4MB)之間。我決定只通過放置一次選項列表來加快頁面加載速度,然後用JavaScript將其添加到每個輸入。將大量子元素附加到大量元素上的JavaScript性能

不幸的是,瀏覽器需要很多時間才能完成任務(在FF 10上約3分鐘)或掛起(Chrome 17)。我試圖用jQuery和純JS完成任務。根本沒有區別。

該任務是否可行?我應該知道如何編寫快速高效的JavaScript?

Screenshot

編輯:我把所有的選項,以一個字符串,並使用innerHTML把它放到選擇輸入。感謝您的快速響應。

Edit2:我按照Diodeus建議的方式生成元素。但是,當select元素處於焦點時,我加載選項(謝謝rlemon)。我相信所有的答案都是非常有幫助的,對於任何有類似問題的人來說都是有價值的謝謝你們。

+0

也許你應該顯示你的JS代碼,所以我們可以看看它,但通常你可能會改變你的界面,並使用一個選擇從哪個值被添加到(只讀)輸入字段,而不是有很多大的選擇。 – Sirko 2012-02-27 15:29:01

+0

也許你應該讓你的輸入onfocus加載選項列表......這樣每個輸入*將會稍微加載一些時間,但整個頁面應該很快。 – rlemon 2012-02-27 15:36:40

+0

另一個好處。謝謝rlemon。 – Jacek 2012-02-27 15:37:58

回答

4

將您的HTML構建爲字符串或單個對象,然後將其全部注入到該頁面中。 DOM重寫速度很慢,因爲必須爲每個插入文件計算文檔重新流動。

+0

好點。我會嘗試這種方法。 – Jacek 2012-02-27 15:31:46

+1

這也可以通過[documentFragment](https://developer.mozilla.org/en/DOM/DocumentFragment)來實現。文檔碎片允許您存儲和使用元素,就像它們是DOM元素一樣,但不會觸發迴流。一旦建立了樹,您可以簡單地將DF附加到DOM。 – rlemon 2012-02-27 15:42:41

+0

作爲使用數組和'push()'的一個附註,所有的字符串在舊版瀏覽器(特別是IE <9)上有很大的不同,如果這是你的任何擔心的話。 – ckozl 2012-02-27 15:44:07

1

爲什麼你需要分別追加孩子?只需用另一個元素中的選項包裝整個列表並追加那個元素即可。這應該會更快,因爲它只是一個操作,而不是1000.

+0

我將所有選項都放到單個字符串中,並使用innerHTML將其放到選擇輸入中。我應該在我的帖子中說過。無論如何,謝謝你這麼快速回答:)。 – Jacek 2012-02-27 15:29:33

1

我建議你使用ajax。用第三方組合框替換標準輸入選擇例如:Jquery UI Combobox。首先你加載所有空的組合框。它的項目將盡快加載點擊打開下拉列表。

你可以用jQuery和jQuery UI很容易做到這一點。

1

默認情況下,在HTML上加載的所有內容比使用JS添加數千個元素要快。

您的服務器爲您提供用戶計算機無法保證的質量/速度。

+0

正在下載4-5MB無論哪種方式,適當的解決方案都是根據用戶焦點動態加載選項。 – rlemon 2012-02-27 15:39:56