【问题标题】:Is it possible to filter a jQuery DataTable by data attribute?是否可以按数据属性过滤 jQuery DataTable?
【发布时间】:2015-07-16 15:09:50
【问题描述】:

我想知道是否可以通过其数据属性之一而不是其单元格的内容来过滤 jQuery DataTable。要动态地将过滤器应用于列,可以使用以下调用:

$table.fnFilter('^(Some value)$', columnIndex, true, false);

这将默认使用正则表达式过滤单元格的确切内容。但是,假设我的单元格是这样构造的:

<td data-label="Active"><i class="fa fa-check fa-lg"></i></td>

或者

<td data-label="Active">Active<br /><span class="mute">Some text</span></td>

我希望能够通过属性data-label 的确切内容而不是单元格内容来过滤DataTable。在表 init 上设置列时定义搜索类型是否有问题?或者有没有办法定义按属性而不是内容过滤?

【问题讨论】:

  • 你是如何生成表...json或现有的html的?简单的建议是使用不可见的额外列
  • @charlietfl,目前是 html,但我也想将其应用于 json。但这真的很重要吗?啊,是的,放置那个额外的隐藏列,我有这个解决方法。假设我不能使用该选项。
  • 在 json 模型中,您已经有数据可用作过滤器值,并且该属性将是多余的

标签: jquery datatables


【解决方案1】:

如果要通过代码触发过滤器,创建自定义过滤器:

$.fn.dataTable.ext.search.push(
   function(settings, data, dataIndex) {
      var dataLabel = table
          .row(dataIndex)         //get the row to evaluate
          .nodes()                //extract the HTML - node() does not support to$     
          .to$()                  //get as jQuery object 
          .find('td[data-label]') //find column with data-label
          .data('label');         //get the value of data-label
      return dataLabel  == 'Active'; 
   }     
);

演示 -> http://jsfiddle.net/x83zm7qq/

如果你只是希望data-label能够在用户输入搜索框时作为过滤的目标,你可以将data-label重命名为data-searchdata-filter

<td data-search="Active"><i class="fa fa-check fa-lg"></i></td>

dataTables 称之为orthogonal data

【讨论】:

  • 是的。在td 元素中具有data-searchdata-filter 属性允许我按单元格的值过滤单元格。谢谢!
  • 如何在旧版本上执行此操作?
  • @davidkonrad 这不适用于 1.10 版。任何想法如何在此函数中获取“数据排序”值?
  • @alwaysVBNET,你能举一个行或列标记的例子吗?你用的是什么版本?这适用于 1.10.x ...
  • 嘿@alwaysVBNET,看起来不错。 +1。我相信它更有效,因为您在即用型 settings 对象上进行操作,而不是遍历方法。
【解决方案2】:

您还可以通过将其存储在 initComplete 回调中的“设置”中,然后从通用搜索处理程序下的实例的“设置”对象中调用来定义每个表的自定义回调。代码如下:

$(function(){
  // the common/unified plugin (for all datatables)
  $.fn.DataTable.ext.search.push(
        function(settings, columnsOutput, dataIndex, data, outputIndex) {
          // this = ext.search array (all custom search functions (including this one)
          if (settings._myFilter){
              return settings._myFilter.call(settings, {
                  data: data,
                  dataIndex: dataIndex,
                  outputIndex: outputIndex,
                  columnsOutput: columnsOutput,
                  settings: settings
              });
          } else {
              return true;
          }
      }
      );

  // exact datatable initialization
  var dTable = $("#example").DataTable({
    // some sample data
    data: [{name: "John"}, {name: "Jack"}, {name: "Andy"}],
    columns: [{data: 'name'}],
    // setting our custom function under the initComplete callback
    initComplete: function(settings, json) {
      settings._myFilter = function(info){
        if ($('#jFilter').prop('checked')){
          return (info.data.name.toLowerCase().indexOf('j') >= 0);
        } else {
          return true;
        }
      }
    }
  });
  
  $('#jFilter').on('click', function(){
    dTable.draw(); // redraw will apply all the filters
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://cdn.datatables.net/1.10.0/js/jquery.dataTables.js"></script>
<link href="https://cdn.datatables.net/1.10.0/css/jquery.dataTables.css" rel="stylesheet"/>

<h2>Click checkbox below to filter by data using a callback</h2>
<label><input id="jFilter" type="checkbox"> J only</label>

<table id="example">
</table>

【讨论】:

    【解决方案3】:

    我在这里有点晚了,但我看到了另一个简化这个问题的解决方案: 在 HTML 中: 选择一列来过滤您的数据:(我选择第一列)

    &lt;td&gt;&lt;div data-filter="filter1" &gt;...&lt;/div&gt;&lt;/td&gt;

    在 JS 中:

     $.fn.dataTable.ext.search.push( (settings, data, dataIndex, rowData ) =>{ 
                var row=$(rowData[0]); 
                var filterData = $(rowData[0]).attr('data-filter');
                return filter === 'filter1';
               });
    

    【讨论】:

      【解决方案4】:
      var detailDT = $("#staging-detail-table").DataTable();
      
      var selectedHeaderId = $(...).click...
      
      $.fn.dataTable.ext.search.push(
             function (settings, searchData, dataIndex, rowData) {
      
                  // This is a global call-back, so check what table is getting sent thru
                  // for different search logic.
                  // This is triggered any time any table is re-drawn.
      
                  // Detail grid
                  if (settings.nTable.id == "staging-detail-table") {
                      if (!selectedHeaderId) {
                          // no header was selected. show everything
                          return true;
                      } else {
                          var $trDetailDT = $(detailDT.row(dataIndex).node());
                          var headerId = $trDetailDT.data("headerid");
      
                          return selectedHeaderId == headerId;
                      }
                  }
      
                  return true; // it wasnot the staging data table. Don't filter/limit.
              }
      )
      

      detailDT 是对我要过滤的 DataTable 的引用。

      selectedHeaderId 是我要过滤的值 - 在调用触发搜索的 detailDT.draw() 之前,可能由其他一些 jQuery 用户交互等设置。

      关键部分是调用$(detailDT.row(dataIndex).node());,它使用当前行的回调参数dataIndex。这基本上将行转换为普通的 jQuery 对象以获取数据属性等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多