2016-07-29 4 views
1

私はユーザーが自分のクエリをフィルタリングできるドロップダウンを持っています。フィルタメニューからキー/値のペアを作成する - jQuery

<select id="bike_category_filter" multiple="multiple"> 
    <optgroup label="Gender"> 
    <option value="Mens">Mens</option> 
    <option value="Womens">Womens</option> 
    </optgroup> 
    <optgroup label="Type"> 
    <option value="Mountain Bike">Mountain Bike</option> 
     <option value="Hybrid">Hybrid</option> 
     <option value="Road">Road</option> 
    </optgroup> 
</select> 

私はので、私はキーGenderでそれを追加したいオプションMen || Womensのクリック時とタイプのいずれかのために例えば

、ハッシュに
{ gender: 'Mens', style: ['Mountain Bike', 'Road'] } 

を選択したオプションを送信するために探していますstyle: ['values here']

jQueryライブラリからどのようなメソッドを使用すればよいでしょうか?

はどのような援助が

おかげ

を高く評価し あなたはこれを行うことができます

答えて

0

var styles = { 
    "men": ['Mountain Bike', 'Road'], 
    "women": [...] 
}; 
$("select").change(function() { 
    var gender = $("select option:selected").val(); 
    $("your elment").addClass(styles[gender].join(" ")); 
}); 

私は上記のようにスタイルオブジェクトを作成し、キー配列のように性別を設定するために、あなたをお勧めします値。

ユーザの変更が選択されたときに、changeコールバックが呼び出され、この$("select option:selected").val();は、選択された要素(ここでは性別)の値を返します。 stylesは、この構文を使用するとオブジェクトですstyles["men"]あなたはmenキーの値を取得します。

+0

おかげで、私はあなたがデータを受信する準備ができてオブジェクトを作成して意味を理解、私は 'VARカテゴリ= {「性別」を行っています: []、 "styles":[]}; 'しかし、私は変更機能で何が起こっているのか分かりません。どのようにジェンダーとスタイルを決定するのですか? – Richlewis

+0

@Richlewisは私の更新を見ます。 –

1

var result = { 
 
    gender: '', 
 
    style: [] 
 
}; 
 

 
$('#bike_category_filter').change(function() { 
 
    var selected = $('option:selected', this), 
 
     val = selected.val(), 
 
     index = ''; 
 

 
    if (!val) { 
 
     return; 
 
    } 
 

 
    switch (selected.parent()[0].label) { 
 
     case 'Gender': 
 
      result.gender = val; 
 
      // reset style for selected gender 
 
      result.style = []; 
 
      break; 
 
     case 'Type': 
 
      (index = result.style.indexOf(val) === -1) 
 
       ? result.gender && result.style.push(val) 
 
       : result.style.splice(index, 1); 
 
      break; 
 
    } 
 

 
    $(this).val(result.style.concat([result.gender])); 
 
    $('code').html(JSON.stringify(result)); 
 
});
select { 
 
    height: 130px;} 
 

 
code { 
 
    display: block; 
 
    margin: 15px 0;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<select id="bike_category_filter" multiple="multiple"> 
 
    <optgroup label="Gender"> 
 
    <option value="Mens">Mens</option> 
 
    <option value="Womens">Womens</option> 
 
    </optgroup> 
 
    <optgroup label="Type"> 
 
    <option value="Mountain Bike">Mountain Bike</option> 
 
     <option value="Hybrid">Hybrid</option> 
 
     <option value="Road">Road</option> 
 
    </optgroup> 
 
</select> 
 

 
<code></code>

+0

ありがとうございます、これは私が達成したいと思ったより多くのインラインであるようです。 – Richlewis

+0

ありがとう@Richlewis、最後の更新を確認してください –

+1

静的な 'optgroup'を持っていればこの解決策は良いですが、' optgroup'タグを使用して結果オブジェクトのキーを生成し、その中で選択されたオプションを取得します。ジェネリックソリューションのための私の答えを確認してください –

1

基本的なアルゴリズムは、次のとおり毎に空のオブジェクト

  • resultリセット
      • ユーザが/を選択するたびに、値を選択解除します<optgroup>タグ:
        • 追加:変数groupName
        • におけるlabel属性の値は、ユーザにより選択された<optgroup>内の各<option>タグに新しい空groupSelectionsアレイ
        • 初期化
          • ストアoptiongroupSelections
        • は終わりresult[groupName] = groupSelections

    を設定し、各optgroupためresultオブジェクトに1つの特性を有するべきであり、これらの特性の各々は、内の選択option Sの値をリストする配列であるべきですそのoptgroup。ここで

    は、それがコードである:

    var result; 
     
    $('#bike_category_filter').change(function() { 
     
        result = {}; 
     
        $(this).find('optgroup').each(function() { 
     
        var groupName = $(this).attr('label'); 
     
        var groupSelections = []; 
     
        $(this).find('option:selected').each(function() { 
     
         groupSelections.push($(this).val()); 
     
        }); 
     
        result[groupName] = groupSelections; 
     
        }); 
     
        $('#result').html(JSON.stringify(result)); 
     
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
     
    
     
    <select id="bike_category_filter" multiple="multiple" style="width:150px;height:150px;"> 
     
        <optgroup label="Gender"> 
     
        <option value="Mens">Mens</option> 
     
        <option value="Womens">Womens</option> 
     
        </optgroup> 
     
        <optgroup label="Type"> 
     
        <option value="Mountain Bike">Mountain Bike</option> 
     
         <option value="Hybrid">Hybrid</option> 
     
         <option value="Road">Road</option> 
     
        </optgroup> 
     
    </select> 
     
    
     
    <p><code id="result"></code></p>

  • +0

    あなたの答えをありがとう、私がそれが欲しいものに合っていない唯一のものは、メンズは削除されますが、メンズは削除されています...しかし、それは良い答えで、私はこのアプローチにどのように取り組んでいるのか考えています – Richlewis

    +0

    あなたはロードを選択するとメンズが強調表示されなくなった男性とそれから道路を選択すると、両方がハイライト表示されますが、道路だけがオブジェクトに表示されます。 –

    +0

    '