2017-11-28 11 views
0

jqueryを使用してレビューに基づいて商品をフィルタリングするフィルタを作成しました。選択ボックスの値が変更されると、選択されたボックスの選択値から選択された星を取得するjqueryイベントが呼び出されます。すべてのdiv(表示+不可視)にフィルタ関数を適用

そしてここif/else声明、

if(stars == 'all'){ 
    $('#results > div.stars').fadeIn(450); 
} else{ 
    $('#results > div.stars').filter(function(){ 
     return $(this).attr('stars') != stars 
    }).fadeOut(450); 
} 

は、今ではかなりうまく動作しますが、小さな問題があるのです。私は2番目の時間をフィルタすると、それが(ちょうどdivsdisplay:blockとプロパティが含まれています)、すべての製品が含まれていません

例:私は5つ星に戻って変更した場合、5つ星による まずIフィルターはその後、今4によって再びフィルタリングし、それは、私はそれらをすべて(if条件を実行し、すべてのdivsdisplay:blockに設定)フィルタ

試みるまでは動作しません:それらをフィルタリングする前に は私がfadeInすべてdivsしようとしたが、それはひどい見えます。私はまた、親divを隠して、フィルターを適用して親divを表示しようとしましたが、それも良く見えません。

質問:このシナリオを処理する適切な方法は何ですか?

例スニペット:

jQuery(document).on('change', '#byStars', function() { 
 
    var stars = jQuery(this).val(); 
 

 
    if(stars == 'all'){ 
 
     jQuery('div[stars]').fadeIn(450); 
 
    } else { 
 
     jQuery('div[stars]').filter(function(){ 
 
      return jQuery(this).attr('stars') != stars 
 
     }).fadeOut(450); 
 
    } 
 

 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<select id='byStars' class='col-md-2 pull-right'> 
 
    <option value='all'>All</option> 
 
    <option value='5'>5 Star</option> 
 
    <option value='4'>4 Star</option> 
 
    <option value='3'>3 Star</option> 
 
    <option value='2'>2 Star</option> 
 
    <option value='1'>1 Star</option> 
 
    <option value='0'>0 Star</option> 
 
</select> 
 

 
<div stars="5">5</div><br/> 
 
<div stars="4">4</div><br/> 
 
<div stars="3">3</div><br/> 
 
<div stars="2">2</div><br/> 
 
<div stars="1">1</div><br/>

+1

私たちのコードをお見せ...例と試行のそれぞれについて問題 – charlietfl

+0

を再現している[MCVE] ** **実行可能なを作成するための十分な基本的なコードやHTMLを入力してください何が起こったのかを完全に説明してください... "うまくいかない"/"良く見えない"とはあなたが見たもの、あるいはあなたが代わりに見たいと思ったものを伝えるのに十分ではありません。 –

+0

更新された質問 – Alena

答えて

1

あなたは常にフィルタを適用する前に、フルセットを持っているように、if/elsejQuery('div[stars]').show();を追加する必要があります。

jQuery(document).on('change', '#byStars', function() { 
 
    var stars = jQuery(this).val(); 
 
    if (stars == 'all') { 
 
    jQuery('div[stars]').fadeIn(450); 
 
    } else { 
 
    jQuery('div[stars]').filter(function() { 
 
     jQuery(this).attr('stars') != stars ? jQuery(this).hide() : jQuery(this).show(); 
 
    }); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<select id='byStars' class='col-md-2 pull-right'> 
 
    <option value='all'>All</option> 
 
    <option value='5'>5 Star</option> 
 
    <option value='4'>4 Star</option> 
 
    <option value='3'>3 Star</option> 
 
    <option value='2'>2 Star</option> 
 
    <option value='1'>1 Star</option> 
 
    <option value='0'>0 Star</option> 
 
</select> 
 

 
<div stars="5">5</div> 
 
<div stars="4">4</div> 
 
<div stars="3">3</div> 
 
<div stars="2">2</div> 
 
<div stars="1">1</div>

+0

あなたの答えをお寄せいただきありがとうございます。私は 'if/else'の前に' fadeIn'を試しましたが動作しますが、すべてのコンテンツを表示してフィルタリングされたコンテンツを表示するので、うまく見えません。 – Alena

+0

私は答えが更新されましたが、どうやって正確にアニメーションしたいのですか? –

+0

ありがとう、 'fadeIn/fadeOut'の代わりに' hide() 'と' show() 'を使うとうまくいきます。 – Alena

0

他のものを非表示にするには、クリックしたアイテムをフェードインする必要があっただけかもしれません。私はスニペットを追加しました。私はそれが助けて欲しい

$(".selectMe").on("click", function(){ 
 

 
    var stars = "all"; 
 
    
 
    stars = $(this).attr('data-id'); 
 
    
 

 
    if(stars == 'all'){ 
 
    
 
     $('#results > div.stars').fadeIn(450); 
 
     
 
    } else { 
 
     
 
     $('#results').find("[data-stars='"+stars+"']").fadeIn(450); //added this in to fade in selected before hide others below. 
 
      
 
     $('#results > div.stars').filter(function(){ 
 
      
 
      return $(this).attr('data-stars') != stars; 
 
      
 
     }).fadeOut(450); 
 
     
 
    } 
 
    
 
});
.stars { 
 
    display: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<button class='selectMe' data-id="all">all</button> 
 
<button class='selectMe' data-id="fiveStars">5</button> 
 
<button class='selectMe' data-id="fourStars">4</button> 
 
<button class='selectMe' data-id="threeStars">3</button> 
 
<button class='selectMe' data-id="twoStars">2</button> 
 
<button class='selectMe' data-id="oneStar">1</button> 
 

 
<div id="results"> 
 
RESULTS: 
 
    <div class="stars" data-stars='oneStars'>1 stars</div> 
 
    <div class="stars" data-stars='twoStars'>2 stars</div> 
 
    <div class="stars" data-stars='threeStars'>3 stars</div> 
 
    <div class="stars" data-stars='fourStars'>4 stars</div> 
 
    <div class="stars" data-stars='fiveStars'>5 stars</div> 
 
    <div class="stars" data-stars='fiveStars'>5 stars</div> 
 
    <div class="stars" data-stars='oneStar'>1 stars</div> 
 

 
</div>

+0

ありがとうございますが、問題はまだありません。これらは参照用の数値であり、実際の環境ではタイトル、説明、画像、レビューでdivになっていますので、フィルタリング前にすべてが表示されていると表示されません – Alena

関連する問題