2009-11-30 169 views
2

我正在嘗試重新填充下拉菜單。我正在調用ajax來檢索myList。當我有新的列表時,我從select元素中刪除所有選項並插入新值(大約100個選項)。這適用於IE和Firefox的更高版本;刷新幾乎是即時的。但是,在IE6上,這些操作確實會降低瀏覽器的速度。下拉框幾乎變成動畫,因爲選項已從中刪除,並持續幾秒鐘。除了將舊列表與新列表進行比較並僅刪除/添加已更改的項目之外,是否有任何方法可以加快速度?從IE6中選擇刪除選項

$("#myselect").children.remove(); 

$.each(myList, function(i, val) { 
    $("<option>").attr("value", val.myID) 
       .text(val.myText) 
       .appendTo("#myselect"); 
}); 
+3

您可以嘗試在更改它之間隱藏控件,以確保它不會嘗試呈現更改。 – NibblyPig 2009-11-30 17:19:33

+0

順便說一句,你可以用$('mySelect')替換$('#mySelect')。children()。remove()。 – 2009-11-30 17:24:49

回答

2

如果您創建一個新元素並將其切換出來,該怎麼辦?

var newSelect = $("<select></select>"); 
$.each(myList, function(i, val) { 
    $("<option>").attr("value", val.myID) 
       .text(val.myText) 
       .appendTo(newSelect); 
}); 
$("#myselect").replaceWith(newSelect); 
+0

聽起來像它應該工作,這將是餡餅簡單。我會回報。 :) – Chris 2009-11-30 17:29:48

+0

這加速了幾秒鐘,並修復了「動畫」刪除。 IE6仍然有點慢,但這似乎是最好的解決方案。謝謝! – Chris 2009-11-30 17:43:37

2

雖然你的代碼是好得多,如果它的速度太慢,去直接路由(我已經做到了,在過去,使用jQuery之前,它在所有的瀏覽器是即時,包括IE6)。 只是刪除所有來自選擇孩子通過刪除HTML:

$("#myselect").html(''); 

所以您創建每個選項的HTML修正環路,並通過使用

$('#myselect').html(optionsHTML); 

將其插入選擇根據性能的不同,你可以在這個解決方案和karim79的解決方案之間嘗試一箇中間立場(即,使用html()去除選項,並使用數組追加它們而不是創建純HTML)。

+0

我也喜歡這個想法,因爲你不必吹走選擇元素。 .html('')修復了children.remove()問題。 – Chris 2009-11-30 17:53:43

+0

這解決了我的性能問題,IE8中的$(「#myListBox」)。empty()花費了3秒鐘的時間來清除Firefox耗時30毫秒的列表框。公平地說,有超過2500個項目,但這並不能解釋性能差異的數量級。 – Nick 2010-05-24 16:27:54