2017-04-06 18 views
0

現在、私はフィルタリングアプリケーションを開発中です。顧客は黒をクリックしたときに、それが黒の製品が表示されますですIAM何をしてだからここに私のhtmlとjsのコードチェックボックスの値に基づいてクラスを表示/非表示Jquery

jQuery(document).ready(function($){ 
 
    
 
    $(".color-label").on("click",function(){ 
 
\t 
 
\t var color_box_val= $(this).find('.color-box').val(); 
 
\t $('.test-li').hide(); 
 
\t $('div:contains('+color_box_val+')').closest('.test-li').show(); 
 
\t }); 
 
    
 
});
.hidden-color{ 
 
    display:none; 
 
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script> 
 

 
<label class="color-label">Red<input type="checkbox" class="color-box" value="red"/></label> 
 
<label class="color-label">Black <input type="checkbox" class="color-box" value="Black"/></label> 
 

 

 
<ul> 
 
<li class="test-li"> 
 
    <div class="test-div"> 
 
    <p class="hidden-color">red</p> 
 
\t red poduct 
 
    </div> 
 
</li> 
 
    <li class="test-li"> 
 
    <div class="test-div"> 
 
    <p class="hidden-color">Black</p> 
 
\t black Product 
 
    </div> 
 
</li> 
 
<li class="test-li"> 
 
    <div class="test-div"> 
 
    <p class="hidden-color">Blue</p> 
 
\t blue Product 
 
    </div> 
 
</li>

を参照してください。顧客が赤と黒の両方をクリックした場合、両方を表示する必要があり、顧客が何もチェックしなかった場合、すべての製品を表示する必要があります。

しかし、私はいくつかの点で立ち往生しました。クリックしたときに赤と黒の両方を表示するにはどうすればいいですか?現在、新しくクリックされたチェックボックスに基づいて結果を表示しています。また、すべてのものをアンチックすると、すべてのボックスを表示する必要があります。提案してください 。

答えて

1

まず、変更することをお勧めするのは、リストアイテムにカラーデータを保存する方法です。それらを隠れた段落要素に格納するのではなく、HTML5のデータ属性として保存してみましょう。

それが完了したら、あなたが意図し何をするのは非常に簡単です:基本的にOR操作である、すなわち、赤と黒のチェックが入っているとき、あなたは黒赤またはある項目を示したいと思います。

ロジックは以下の通りである:あなたがたが、このイベントが発生した場合、あなたはすべてのこれらのチェックボックスの値を収集したい

  • すべてのチェックボックスに.change()イベントに耳を傾ける

    1. 場合にのみ、彼らチェックされます。これは、チェックされたチェックボックスを選択するのに.filter(':checked')を使用し、配列を返すために.map()を使用して行います。
    2. 次に、すべてのリスト項目を反復処理します。アレイ内の値がdata-colorの場合、それらの値が表示されます。さもなければそれらを隠す。

    とチェックボックスのいずれかがフィルタリングされている場合は、すべてこのロジックをチェックし、条件文の中に包まれている:

    • 何がチェックされていない場合は一つ以上の場合、我々は任意のフィルタリング
    • を望んでいません上記のフィルタリングロジックを使用してフィルタリングを実行します。

    アップデート:私は.toLowerCase()を使用して、すべての色の値を小文字に変換しました値は任意に大文字にすることができる。

  • +0

    jQuery(document).ready(function($) { // Listen to change event $('.color-box').change(function() { // Store checked checkboxes var $checked = $('.color-box').filter(':checked'); if ($checked.length) { // Perform filtering if one or more is checked // Collect ALL values from all .color-box into an array var colors = $checked.map(function() { return $(this).val().toLowerCase(); }).get(); // Iterate through each list item and evaluate $('.test-li').each(function() { var $t = $(this); if (colors.indexOf($t.data('color').toLowerCase()) >= 0) { $t.show(); } else { $t.hide(); } }); } // If nothing is checked, show all list items else { $('.test-li').show(); } }); });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script> <label class="color-label">Red<input type="checkbox" class="color-box" value="red"/></label> <label class="color-label">Black <input type="checkbox" class="color-box" value="Black"/></label> <ul> <li class="test-li" data-color="red"> <div class="test-div"> red Product </div> </li> <li class="test-li" data-color="black"> <div class="test-div"> black Product </div> </li> <li class="test-li" data-color="blue"> <div class="test-div"> blue Product </div> </li>
    が友人ありがとう:

    は、以下の概念実証例を参照してください。それは働いている。良い説明。 – Manik

    +1

    @Manik何もチェックされていないシナリオを含めるように答えを更新しました。すべての項目が表示されるはずです – Terry

    +0

    本当にありがとうございます。 2番目のシナリオでは別のコードを作成しましたが、コードは完璧です。私はif(colors.length == 0){$( "。test-li")と書く。 }。あなたはwoocommerceとwordpressを知っていますか? 。 – Manik

    関連する問題