【问题标题】:Create a dropdown with several options which contain custom filters创建一个包含多个选项的下拉列表,其中包含自定义过滤器
【发布时间】:2016-09-05 07:28:57
【问题描述】:

我已经在网上搜索过,但我还没有找到我的问题的解决方案。也许我搜索了错误的术语,所以如果我的问题的解决方案可能非常简单,我很抱歉。

示例表:

所以,我想做的是:

  • 提供包含多个选项的下拉列表
  • 每个选项都提供了一个自定义过滤器(例如,“option1”显示所有 可用的记录,“option2”显示所有可用的记录 可用并且有标签 F,'option3' 显示所有记录 可用并带有标签 E,...)
  • 立即“实时”应用过滤器

那么,我该如何实现呢?

提前致谢。

【问题讨论】:

  • 您可以在options 中使用data-* 属性

标签: javascript jquery datatables


【解决方案1】:

我创建了可以使用的组件(纯 js,不需要 Jquery),并按列值过滤表行。组件使用数据属性,可以自定义过滤任意列。

var FilterSelect=function(selectSelector,tableSelector){

   this.$select=document.querySelector(selectSelector);//our select
   this.$table=document.querySelector(tableSelector); //our table
   
   this.filter=null; //filter value
   this.columnNum=null; //column num to check value
  
   this._bind();
  
   
   //run setting and filtering in beginning ( option can be set )
   this._setAndFilter();

};



// method sets parameters from chosen option
FilterSelect.prototype._set=function(){

      var option=this.$select.options[this.$select.selectedIndex];//get current option
    this.filter=typeof option.dataset.filter!='undefined'?option.dataset.filter:null;
    
    this.columnNum=typeof option.dataset.columnNum!='undefined'?option.dataset.columnNum:null;
  
};

//method filters table
FilterSelect.prototype._filterTable=function(){

  var trs=this.$table.querySelectorAll("tr");
  
  for (var i=0; i<trs.length; i++){
    
    
      var tr=trs[i];
    
      if (this.columnNum==null){
      
        //no filters
        tr.style.display="block"
        continue;
      }
    
      
      var td=tr.querySelectorAll("td")[parseInt(this.columnNum)];//get td 
    
      var value=td.innerText;//get td inner text to compar
    
      if (value!=this.filter)
      tr.style.display="none"; //filter does not match - hide
      else
        tr.style.display="block";//display block - filter match
  }
  
};

//filtering table and setting options
FilterSelect.prototype._setAndFilter=function(){

   this._set();//set current filter and column
   this._filterTable();//do table filtering
  
};

//bind select change event
FilterSelect.prototype._bind=function(){

  this.$select.addEventListener("change",function(){
  

    this._setAndFilter();
    
    
  }.bind(this));
  
  

};

//usage
var filterSelect=new FilterSelect('#select','#table');
<select id="select">
  <option>No filter</option>
  <option data-column-num="3" data-filter="E">Filter Label E</option>
  <option data-column-num="2" data-filter="Yes">Filter Available</option>
  <option data-column-num="3" data-filter="F">Filter Label F</option>
  <option data-column-num="2" data-filter="No">Filter Not Available</option>
</select>  

<table id="table">
  <tr>
    <td>1</td><td>One</td> <td>Yes</td><td>E</td>
  </tr>  
  <tr>
    <td>2</td><td>Two</td> <td>Yes</td><td>F</td>
  </tr>  
  <tr>
  <td>3</td><td>Three</td> <td>No</td><td>E</td>
  </tr>
</table>

数据属性信息:

data-column-num - 检查过滤器值的列数(从 0 开始)

data-filter - 用于检查由 columnNum 列选择的文本的过滤器值

以上组件支持按单列值过滤。这是可以过滤多列的组件 - https://jsfiddle.net/maciejsikora/0kbubfts/

【讨论】:

  • 首先感谢您的努力。但是,如果我理解正确,您的解决方案一次只过滤一列?我需要的是使用一个选项一次过滤多个列。
  • 我会改变我的例子来做到这一点。等一下
  • @yaksey 我通过多重过滤添加了指向 jsfiddle 的链接
  • 正是我需要的,谢谢。对于我的一个项目,我绝对可以使用您的解决方案。所以我编辑了我的问题,因为我忘了提到我已经在我的另一个项目中使用了一个 jQuery 表格插件——我之前在标题中提到过,但是我的标题被编辑了。对于这个,我必须寻找我认为的另一种解决方案。
  • @yaksey 您的问题获得 3 分,因为更笼统,我的建议是回到原始问题内容并提出其他问题。我的回答是针对原始问题,与 DataTables 没有任何共同之处。
猜你喜欢
  • 2012-07-21
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2021-01-08
  • 1970-01-01
相关资源
最近更新 更多