2014-04-10 52 views
0

我有一個基於不同數據屬性(如數據品牌,數據存儲等)的不同div的產品列表代碼。我用我的朋友幫助我開發的複選框選擇篩選記錄。我需要在這方面做小改動。查看代碼。顯示所有divs取消選中複選框

<html> 
    <head> 
    <meta charset="utf-8"> 
    <title>JS Bin</title> 
    </head> 
    <body> 
    <div> 
     <div class="content" 
      data-category="shoes" 
      data-price="4000" 
      data-size="38" 
      data-brand="Nike"> 
     <img src="http://placehold.it/120x80"> 
     <p>Nike 38<br>$4000</p> 
     </div> 
     <div class="content" 
      data-category="shirts" 
      data-price="6000" 
      data-size="20" 
      data-brand="Nike"> 
     <img src="http://placehold.it/140x80"> 
     <p>Nike 20<br>$6000</p> 
     </div>  
     <div class="content" 
      data-category="shoes" 
      data-price="500" 
      data-size="20" 
      data-brand="Andrew"> 
     <img src="http://placehold.it/120x80"> 
     <p>Andrew 20<br>$500</p> 
     </div> 
     <div class="content" 
      data-category="shoes" 
      data-price="780" 
      data-size="42" 
      data-brand="Andrew"> 
     <img src="http://placehold.it/120x80"> 
     <p>Andrew 42<br>$780</p> 
     </div> 
     <div class="content" 
      data-category="shirts" 
      data-price="1200" 
      data-size="40" 
      data-brand="Sunbaby"> 
     <img src="http://placehold.it/140x80"> 
     <p>Sunbaby 40<br>$1200</p> 
     </div> 
     <div class="content" 
      data-category="shoes" 
      data-price="2000" 
      data-size="70" 
      data-brand="Andrew"> 
     <img src="http://placehold.it/120x80"> 
     <p>Andrew 70<br>$2000</p> 
     </div> 
     <div class="content" 
      data-category="shoes" 
      data-price="800" 
      data-size="50" 
      data-brand="Sunbaby"> 
     <img src="http://placehold.it/120x80"> 
     <p>Sunbaby 50<br>$800</p> 
     </div> 
     <div class="content" 
      data-category="shirts" 
      data-price="1300" 
      data-size="20" 
      data-brand="Nike"> 
     <img src="http://placehold.it/140x80"> 
     <p>Nike 20<br>$1300</p> 
     </div> 
     <div class="content" 
      data-category="shirts" 
      data-price="800" 
      data-size="35" 
      data-brand="Andrew"> 
     <img src="http://placehold.it/140x80"> 
     <p>Andrew 35<br>$800</p> 
     </div> 
    </div> 
    <form id="filter"> 
     <div> 
     <input type="checkbox" 
       name="brand" 
       value="Andrew" checked>    
       Andrew 
     </input> 
     <input type="checkbox" 
       name="brand" 
       value="Sunbaby"> 
       Sunbaby 
     </input> 
     <input type="checkbox" 
       name="brand" 
       value="Nike"> 
       Nike 
     </input> 
     </div> 
     <div> 
     <input type="checkbox" 
       name="category" 
       value="shoes" checked>    
       Shoes 
     </input> 
     <input type="checkbox" 
       name="category" 
       value="shirts"> 
       Shirts 
     </input> 
     </div> 
     <div> 
     <input type="radio" 
       name="price" 
       value="0-9000"   
       checked> 
       All 
     </input> 
     <input type="radio" 
       name="price" 
       value="0-999"> 
       $0-$1000 
     </input> 
     <input type="radio" 
       name="price" 
       value="1000-2000"> 
       $1000-$2000 
     </input> 
     <div> 
     <div> 
     <input type="radio" 
       name="size" 
       value="0-80"   
       checked> 
       All 
     </input> 
     <input type="radio" 
       name="size" 
       value="0-25"> 
       Small 
     </input> 
     <input type="radio" 
       name="size" 
       value="26-45"> 
       Medium 
     </input> 
     <input type="radio" 
       name="size" 
       value="46-80"> 
       Big 
     </input> 
     <div> 
    </form> 
    </body> 
</html> 

CSS

.hidden {display: none;} 

.content {border-radius: 5px; border: 1px solid #bbb;padding: 5px; margin: 5px; float: left;} 
#filter {clear: left;} 

腳本

var filterContentForm = function(content, form){ 
    var filter = function() { 
    var checkBoxGroups = {}, 
     radioGroups = {}; 
    var addRadioGroup = function(name){ 
     radioGroups[name] = {  
     el: $('input[name='+name+']:checked') 
     }; 
     var n = radioGroups[name]; 
     n.el 
     .each(function(){ 
     n.range = $(this).val().split('-'); 
     n.from = Number(n.range[0]); 
     n.to = Number(n.range[1]);  
     }); 
    };  
    $('#filter input[type=radio]') 
    .each(function(){ 
     addRadioGroup($(this).attr('name')); 
    });  
    var addCheckBoxGroup = function(name){ 
     checkBoxGroups[name] = { 
     el: $('input[name='+name+']:checked'),  
     ch: [] 
     }; 
     var n = checkBoxGroups[name]; 
     n.el.each(function(){ 
     n.ch.push($(this).val()); 
     }); 
    }; 
    $('#filter input[type=checkbox]') 
    .each(function(){ 
     addCheckBoxGroup($(this).attr('name')); 
    }); 
    var contents = $(content), all = 0; 
    contents.removeClass('hidden') 
    .each(function(){ 
     var $this = $(this), 
      price = $this.data('price'); 
     for(var c in radioGroups){ 
     var n = radioGroups[c], 
      d = Number($this.data(c)); 
     if(d < n.from || d > n.to){ 
      $this.addClass('hidden'); 
      all++; 
      return; 
     } 
     }  
     var show = 0, i; 
     for(var c in checkBoxGroups){ 
     var n = checkBoxGroups[c], 
      d = $this.data(c);  
     for(i = 0; i < n.ch.length; i++){   
      if(d === n.ch[i]) { 
      show++; break; 
      } 
     } 
     } 
     var l = Object.keys(checkBoxGroups).length; 
     if(show < l) { 
     $this.addClass('hidden'); 
     all++; 
     } 
    }); 
    if(all > contents.length - 1) 
     contents.removeClass('hidden'); 
    }; 
    $(form+' input').change(filter); 
    filter(); 
}; 
filterContentForm('.content', '#filter'); 
#filter {clear: left;} 

上面的代碼工作fine.I只需要在這一個小的變化。也就是說,在開始時檢查兩個複選框,即對於品牌即耐克和類別即鞋。我只想在開始時,這兩個複選框也需要取消選中,所有記錄都可見,但是當我從Andrew和Shoes複選框中刪除「已選中」時,Filtering不會發生。

只是指導我如何在開始時保持所有複選框未被選中,然後在選擇複選框後過濾應該工作。 感謝您的幫助

+1

你能創造的這個的jsfiddle –

+0

@NevilleNazerane http://jsfiddle.net/Alfie/AgUQT/ – Anton

+0

試圖從我以前的答案得到的幫助:http://stackoverflow.com/a/22759872/1982680 –

回答

0

您的過濾器代碼似乎是一個小錯誤。 確保你在標題中添加了jquery js!

來切換檢查您的複選框和/或單選按鈕的/未選中狀態,只需添加/從標籤

<input type="checkbox" 
      name="category" 
      value="shoes" **checked**> 
+0

@瓦倫 - 當我我試着用你的邏輯,即把** **與鞋複選框check.filter works.But當我保持**檢查**與鞋和安德魯checkbox.filter doesnot工作。如何使過濾器工作保持所有複選框未選中... – user3488008

+0

剛剛在Anton上面評論中給出的jsfiddle鏈接上進行了檢查。該組合工作正常。當「品牌」或「類別」中的任何一個都沒有被檢查時,就會出現問題。 – Varun

+0

我在那裏只檢查一次,可以檢查一次 – user3488008

0

確定刪除選中的屬性,使這就是問題所在:

你正在檢查下列條件

if(show < l)

其中show是filterCategories [您的情況:品牌和類別]的計數。這是與l這是目前的總過濾器類別的計數進行比較。

所以,當只有其中一類被選中時,這個條件爲真,並

`$this.addClass('hidden'); 
    all++;` 

得到執行以下代碼。這使你的all++達到,因此你的下面的代碼被執行的contents.length

if(all > contents.length - 1) 
    contents.removeClass('hidden'); 

將覆蓋過濾器並顯示所有項目[你的情況的div]

爲了解決這個問題看下面的代碼。 activeFilterCount變量是需要的更改。剛剛從var show=0,i;用下面的代碼替換您的代碼all++;}

var show = 0, i, activeFilterCount=0; for(var c in checkBoxGroups){ var n = checkBoxGroups[c], d = $this.data(c); if(n.ch.length > 0){ activeFilterCount++; } for(i = 0; i < n.ch.length; i++){
if(d === n.ch[i]) { show++; break; } } } if(show < activeFilterCount) { $this.addClass('hidden'); all++; }

我知道它有一個小過於冗長,但我希望它可以幫助你!如果有什麼不清楚,請告訴我。

+0

@ Varun - 得到它sir.it工作。謝謝人.. – user3488008

+0

@ Varun-似乎代碼不工作在我的本地pc.but工作在fiddle.any線索先生? – user3488008

+0

那麼它很難甚至猜測沒有看文件。你能詳細說明什麼不起作用嗎?一個問題可能是緩存。清除緩存並嘗試。 – Varun

相關問題