2015-06-29 21 views
0

我有一些列表和一些標題,我想過濾列表。 我已經完成了這個部分,你可以在下面的演示鏈接中看到。但我有一些我無法弄清楚的標準。帶有標題的jQuery過濾器列表

  1. 如果標題匹配的一些字符的輸入,則顯示所有繼<ul>
  2. 孩子如果頭不匹配的一些字符的輸入,但在<ul>的話,則表現出一定的項目,做,也是<li>顯示頭
  3. 如果以下<ul>匹配輸入由一些字符既不頁眉或,隱藏兩個頭部和項目在以下<ul>

jQuery(function() { 
    var listFilter = { 
     init: function(header, list) { 
      $('.filterdrp_input') 
      .change(function() { 
       var filter = this.value.trim(); 

       if(filter) {        
        myFilter(header); 
        myFilter(list); 

        function myFilter(selector) { 
         $(selector).find('[data-name]').hide() 
         .filter('[data-name*="'+ filter +'"]') 
         .show();  
        } 
       } 
       else { 
        $(header).find("span").show(); 
        $(list).find("li").show(); 
       } 
       return false; 
      }) 
      .keyup(function() {   
       $(this).change(); 
      }); 

     } 
    } 

    listFilter.init($(".list-header"), $('.filterdrp').find('ul')); 

}); 

<div class="filterdrp"> 
<input type="text" placeholder="search" class="filterdrp_input"> 

<h2 class="list-header"> 
    <span data-name="name_01"> 
     name_01 
    </span> 
</h2> 
<ul class="list"> 
    <li class="list__item" data-name="item_01"> 
     item_01 
    </li> 
    <li class="list__item" data-name="item_02"> 
     item_02 
    </li> 
    <li class="list__item" data-name="item_03"> 
     item_03 
    </li> 
</ul> 

<h2 class="list-header"> 
    <span data-name="name_02"> 
     name_2 
    </span> 
</h2> 
<ul class="list"> 
    <li class="list__item" data-name="item_06"> 
     item_06 
    </li> 
    <li class="list__item" data-name="item_07"> 
     item_07 
    </li> 
    <li class="list__item" data-name="item_08"> 
     item_08 
    </li> 
</ul> 

demo

我已經更新了我的解決方案,因此,這裏是最後的工作示例 http://jsfiddle.net/x2oshad5/6/

+0

如果沒有'listFilter'知道HTML的結構,就不可能做到這一點。由於您的方法接受2個獨立的「列表」(包裝爲jQuery集合),因此它不能將任何內容應用於下一個列表。要麼將HTML的結構更改爲父 - >子結構,要麼放寬規則,以便函數知道結構。 – Amit

回答

1

耦合會更容易,如果HTML結構因此,標題是在同一個容器內,但原樣,最好的解決方案是用'next()'之類的東西進行搜索。爲了防止不斷搜索,您可以註冊所有標題並將所有子項目及其主項目連接起來。例如:

var headers = $('.list-header'); 
headers.each(function(){ 
var list = $(this).next('ul.list'); 
this.ChildItems = $('li[data-name]', list); 
this.MainItem = $('span[data-name]', this); 
this.AllItems = this.MainItem.add(this.ChildItems); 

之後,匹配應該按照標題項目完成。幾種可能的方式,但對於例如以下工作: (Fiddle)

var listFilter = { 
    init: function() { 
     var headers = $('.list-header'); 
     headers.each(function(){ 
      var list = $(this).next('ul.list'); 
      this.ChildItems = $('li[data-name]', list); 
      this.MainItem = $('span[data-name]', this); 
      this.AllItems = this.MainItem.add(this.ChildItems); 
     }); 
     $('.filterdrp_input') 
     .change(function() { 
      var filter = this.value.trim(); 
      function FilterItems(items){ 
       return items.filter('[data-name*="'+ filter +'"]'); 
      } 
      headers.each(function(){ 
       var itemstoshow = this.AllItems; 
       if(filter.length > 0 && FilterItems(this.MainItem).length === 0){ 
         var matches = FilterItems(this.ChildItems); 
        itemstoshow = matches.length===0 ? $() : matches.add(this.MainItem); 
       } 
       itemstoshow.show(); 
       this.AllItems.not(itemstoshow).hide();      

      });  
      return false; 
     }) 
     .keyup(function() {   
      $(this).change(); 
     }); 

    } 
} 

listFilter.init(); 

爲了得到一個不區分大小寫:

var filter = this.value.trim().toLowerCase(); 
function FilterItems(items){ 
    return items.filter(function(){ return $(this).attr('data-name').toLowerCase().indexOf(filter) > -1;}); 
} 

雖然與後一種方法,你也可以選擇存儲的所有數據值一旦進入初始化階段。

+0

謝謝我的名字 我可以看到我們的方法是在同一個方向。我已更新我的小提琴 http://jsfiddle.net/x2oshad5/2/ – Johansrk

+0

小寫/大寫怎麼辦?看起來我們更加接近一個檢查 – Johansrk

+0

JQuery的屬性包含功能確實區分大小寫。在示例場景中,可以使用過濾器上的.toLowerCase()輕鬆解決此問題,只要所有數據名稱屬性都以小寫字母添加,就足夠了,否則可以使用自定義過濾器/正則表達式來提供不區分大小寫匹配,可以在這裏看到:http://stackoverflow.com/questions/19465157/case-insensitive-jquery-attribute-selector –