2012-09-24 28 views
9
<select id="myElement" multiple="multiple"> 
    <option value="1">Category Type</option> 
    <option value="158">itemOne</option> 
    <option value="157">itemTwo</option> 
    <option value="7">My Type</option> 
    <option value="20">itemThree</option> 
    <option value="21">itemFour</option> 
    <option value="22">itemFive</option> 
    <option value="8">Category Yet Another</option> 
    <option value="31">itemCheese</option> 
    <option value="32">itemBrain</option> 
</select> 

"カテゴリ"オプション( "item"で始まらないもの)がoptgroupであり、次のカテゴリオプションまでそれを折り返すように動的に変換する必要があります。上記のようになります:jQueryを使用して動的にオプトグループを追加する

<select id="myElement" multiple="multiple"> 
    <optGroup label="Category Type"> 
    <option value="158">One</option> 
    <option value="157">Two</option> 
    </optGroup> 
    <optGroup label="My Type"> 
    <option value="20">Three</option> 
    <option value="21">Four</option> 
    <option value="22">Five</option> 
    </optGroup> 
    <optGroup label="Category Yet Another"> 
    <option value="31">Cheese</option> 
    <option value="32">Brain</option> 
    </optGroup> 
</select> 

jQueryを使用して目的の効果を達成するためにこれを繰り返し、値を変更する方法はありますか?

答えて

17

それはjQueryを使用して、非常に簡単です:あなたがグループになります<option>要素を一致させるためにfilter()を使用することができます

http://jsfiddle.net/mGmXq/

$(document).ready(function() { 
    var $cont = $('select'); 
    $('option').each(function() { 
     if ($(this).text().indexOf('item') !== 0) { 
      $('<optGroup/>').attr('label', $(this).text()).appendTo($cont); 
      $(this).remove(); 
     } else { 
      $cont.find('optGroup').last().append($(this)); 
      $(this).text($(this).text().substr(4)); 
     } 
    }); 
});​ 
+1

かなりエレガントなソリューション! – vzwick

+0

素晴らしい!すぐに助けてくれました –

5

。次に、それらを反復処理して、同じ要素のnextUntil()を後続のオプションと一致するように呼び出すことができます(nextUntil()は、グループのメンバーになる次のオプション)。

そこから、あなたはその後、ちょうどグループになった<option>要素にremove()を呼び出し、その<optgroup>要素を作成するために、これらの<option>要素にwrapAll()を使用することができます。次のようなものがあります。

var $groups = $("#myElement option").filter(function() { 
    return $(this).text().indexOf("item") != 0; 
}); 
$groups.each(function() { 
    var $this = $(this); 
    $this.nextUntil($groups).wrapAll($("<optgroup>", { 
     label: $this.text() 
    })).end().remove(); 
}); 

結果はthis fiddleです。

+0

私はwrapAllの使い方が好きです。どの要素が入ってくるのか事前に知らなければどうしたらよいかわかりませんでした(私は、 optgroupは修正されました)。どうもありがとう。 – key2starz

+0

+1このアプローチは私のために働いていましたが、multiselect - $( "#myElement")でリフレッシュした後でのみ機能しました。これは頭​​の傷の半日を他の人に救うかもしれない –

2

私の実装:

$(function(){ 
    var target = $('#target'), 
     optGroup; 

    function strStartsWith(str, prefix) { 
     return str.indexOf(prefix) === 0; 
    } 

    $('#myElement').find('option').each(function(){ 
     var elm = $(this).clone(); 
     if(strStartsWith(elm.text(), 'item')) 
     { 
      elm.text(elm.text().substr(4)); 
      if(optGroup) optGroup.append(elm); 
     } 
     else 
     { 
      optGroup = $('<optgroup>').attr('label', elm.text()); 
      target.append(optGroup); 
     } 
    }); 
}); 

デモ:http://jsfiddle.net/HUHRz/1/

1
$.each(data, function() { 

    if (prevGroupName.indexOf(this.Group.Name) == -1) { 
     $prevGroup = $('<optgroup />').prop('label', this.Group.Name).appendTo('#ConfigurationId'); 
    } else { 
     $prevGroup = $("optgroup[label='" + this.Group.Name + "']"); 
    } 
    $("<option />").val(this.Value).text(this.Text).appendTo($prevGroup); 
    prevGroupName.push(this.Group.Name); 
}); 
関連する問題