1

次の jQuery を使用して、フォーム内の選択要素を並べ替えています。

$('select.select-sortable').each(function () {
    var options = $(this).children();
    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) {
      o.value = arr[i].v;
      $(o).text(arr[i].t);
    });
});

並べ替えは機能しますが、ページが更新されるたびに表示される値が変わります。選択肢がいくつあっても、第1選択肢→第3選択肢→第2選択肢→第1選択肢の順で変化します。

選択を最初のオプションにロックするループに追加$(this).children(":first").attr("selected", true);しましたが、なぜdsiplayが変更されたのか、なぜその順序で変更されたのかはまだわかりません。誰にもアイデアはありますか?

4

3 に答える 3

1

この問題は、主selectedにオプションの属性がキャプチャされていないことが原因です。

$('select').each(function () {
    var options = $(this).children();
    var arr = options.map(function(_, o) {
      return { t: $(o).text(), v: o.value, s: $(o).attr('selected') };
    }).get();
    arr.sort(function(o1, o2) { return o1.t > o2.t ? 1 : o1.t < o2.t ? -1 : 0; });
    options.each(function(i, o) {
      o.value = arr[i].v;
      $(o).text(arr[i].t);
      if(arr[i].s!==undefined){
        $(o).attr('selected','selected');
      }
    });
});
于 2013-08-01T16:05:26.777 に答える
0

次のコードを試してください。並べ替えて、.eq() で渡す値を選択します。

var arr = [],
$select = $("#ddsort"),
$options = $select.children();

$options.each(function(index, obj){
   arr.push($(this).val());
});

Array.sort(arr);
$select.empty();

$.each(arr,function(index, obj){
   $select.append("<option value="+obj+">"+obj+"</option>");   
});

$select.children().eq(2).attr("selected","selected");

ここで実際の例を参照してください: http://jsfiddle.net/tFDNx/3/

お役に立てば幸いです。

于 2013-08-01T16:27:08.600 に答える