2013-08-17 60 views
1

這是一個jsFiddle演示問題。看看它什麼時候重新排序。主選擇=「選定」未被選中。 http://jsfiddle.net/zuuyj/當前選擇的選項顯示不正確

我有一個選擇框,該即時通訊使用這個腳本排序

$(document).ready(function() { 
    var options = $('select.pca31 option'); 
    var arr = options.map(function(_, o) { 
     return { 
      t: $(o).text(), 
      v: o.value 
     }; 
    }).get(); 
    arr.sort(function(o1, o2) { 
     return o1.t > o2.t ? 1 : o1.t < o2.t ? -1 : 0; 
    }); 
    options.each(function(i, o) { 
     console.log(i); 
     o.value = arr[i].v; 
     $(o).text(arr[i].t); 
    }); 

這工作得很好,直到你有一個選擇的選項(編輯項目)不顯示所選擇的選項,選擇,因爲它重新排序名單。

在此基礎上

What is the most efficient way to sort an Html Select's Options by value, while preserving the currently selected item?

我想這

$("select.pca31 option").empty().append(options); 

但我只是得到一個無限循環。我可以看到爲什麼,但我看不出如何解決它。

+0

你可以發佈標記以及/或小提琴嗎? – dc5

+3

我實現了你引用的解決方案,就像在[似乎工作的小提琴](http://jsfiddle.net/VPCkR/)。這不是你想要做的嗎? – dc5

+0

http://jsfiddle.net/zuuyj/ NOt當你重新排序按字母順序排序...它劑量「尊重」當前選擇.. –

回答

0

你可以試試這個爲你排序功能:

var options = [].slice.call($('select.pca31 option'),0), 
i,len; 
options.sort(function(a,b){ 
    return (a.text > b.text)? 1 : 
    (a.text < b.text)? -1 : 0; 
}); 
for(i = 0,len=options.length;i<len;i++){ 
    $("select.pca31").append(options[i]); 
} 
+0

你正在聲明變量'i'3次...這是'好...只用一行'var i = options.length-1;' – abc123

+0

是的,複製並粘貼錯誤。有一些額外的代碼。另一個答案雖然較短,但它一次追加數組並直接對Jquery對象進行排序。 – HMR

+0

同意了,現在你不要聲明'var i'甚至一次,所以你使用了一個未定義的變量......同樣你在第二行也沒有做任何事情...... – abc123