2017-11-17 6 views
1

私はユーザーが正しいコンドームを見つけるのを助けるために、単純なファセットフィルタを構築しています。数日前、私は平方フィートでコンドミニアムを除外するための基本的なスライダを得ました。次の部分は、私がSO hereに投稿し、icecubからいくつかの助けを得たチェックボックスを働かせていました。それ以来、私はそれらを連動させるように取り組んできました(例えば、2つの寝室をチェックし、スライダーを800 sqftにスライドさせて両方の変数でコンドームをフィルターにかけるなど)。昨日仕事ができました。jQueryの多面フィルタの問題。

唯一の問題は、スライダが2つのチェックボックスのいずれかにチェックされている場合にのみ機能することです。両方またはいずれもチェックされていない場合、スライダは機能しません。私のロジックがどこに欠陥があるのか​​正確にはわかりません。

はここでフィドルhttps://jsfiddle.net/baskinco/mwqkztn8/

だとここでJSが

 // FUNCTIONS 
     //make slider textbox equal to slider value 
     function printValue(sliderID, textbox) { 
     var x = document.getElementById(textbox); 
     var y = document.getElementById(sliderID); 
     x.value = y.value; 
     } 

     //get bdrm and slider values 
     function getValues() { 
     var bdrm1 = false; 
     var bdrm2 = false; 
     var sliderValue; 

     if($("#1bdrm").is(':checked')){ 
      bdrm1 = true; 
     } 
     if ($("#2bdrm").is(':checked')){ 
      bdrm2 = true; 
     } 
     sliderValue = $("#rangeValue").val(); 

     runFilter(bdrm1, bdrm2, sliderValue); 
     } 

     function runFilter(bdrm1, bdrm2, sliderValue) { 
     $.each($('.condo-box'), function() { 
      $this = $(this); 
      condoData = $this.data(); 
      if(bdrm1 && !bdrm2){ 
      if ((condoData.bdrms == 1) && (condoData.sqft <= sliderValue)){ 
       $this.show(); 
      } else { 
       $this.hide(); 
      } 
      } else if(bdrm2 && !bdrm1){ 
      if ((condoData.bdrms == 2) && (condoData.sqft <= sliderValue)){ 
       $this.show(); 
      } else { 
       $this.hide(); 
      } 
      } else { 
      $this.show(); 
      } 
     }); 
     } 

     // Set values for units 
     $('#jackson').data({ 
     id:1, 
     sqft:897, 
     bdrms:2 
     }); 
     $('#nicholl').data({ 
     id:2, 
     sqft:808, 
     bdrms:2 
     }); 
     $('#atwood').data({ 
     id:3, 
     sqft:1020, 
     bdrms:2 
     }); 
     //etc 

    //MAIN SCRIPT 
     $(document).ready(function() { 
     //print slider value to slider textbox 
     printValue('slider','rangeValue'); 

     //when a bdrm box is checked .. 
     $("#1bdrm, #2bdrm").click(function(){ 
      getValues(); 
     }); 

     //when the slider is moved 
     $("#slider").change(function() { 
      getValues(); 
     }); 
     }); 
+0

あなたのマークアップがあまり変化していない場合、変数にセレクタをキャッシュすることをお勧めします。複雑なセレクタ(あなたのケースではありませんが、それでも..)がある場合は、毎回dom要素をフェッチするのはコストがかかる可能性があります。 –

+0

ちょっと@PabloMescher、私は理論的には理解していますが、ありがとう! – Marc

+0

あなたのコードでセレクタが2回使用されている例はありませんので、私のアドバイスは実際には話題にはなりませんでした。既に知っていれば私を無視してください:)。 私は、スライダーやコンボボックスを操作するコードがアプリにたくさんあると思っていましたが、その場合、事前にキャッシュしておくと良いでしょう。 '' $ var "slider = $("#slider " ); $ slider.change(...) //さらに下へ $ slider.on( "click"、...) '' ' –

答えて

1

あなたの他の条件は平方フィートとスライダーをチェックしていないですが、それは次のようになります。

else { 
    if ((condoData.sqft <= sliderValue)){ 
     $this.show(); 
    } else { 
     $this.hide(); 
    } 
} 

https://jsfiddle.net/mwqkztn8/1/

また、もっと単純であっても、全体がちょうど:

$.each($('.condo-box'), function() { 
    $this = $(this); 
    condoData = $this.data(); 
    var sqftFilter = (condoData.sqft <= sliderValue); 
    var bedFilter = (!bdrm1 && !bdrm2) || (condoData.bdrms == 1 && bdrm1) || (condoData.bdrms == 2 && bdrm2); 
    $this.toggle(sqftFilter && bedFilter); 
}); 

https://jsfiddle.net/mwqkztn8/3/

+0

うん...今明らかにする...ありがとう! – Marc

+0

あなたの簡素化が機能し、.toggleメソッドの詳細を学び、論理演算子の理解を深めてください。再度、感謝します! – Marc