【问题标题】:jQuery DataTables 'OR' Search/ FilterjQuery DataTables 'OR' 搜索/过滤
【发布时间】:2014-10-12 12:05:10
【问题描述】:

我正在使用 jQuery DataTables (http://www.datatables.net/) 来显示一些表格数据。搜索/过滤器是一个强大的功能。虽然如果在表格中搜索多个关键字,搜索只会过滤已经过滤的数据。

例如这里的例子 - http://jsfiddle.net/illuminatus/2j0Lz5or/1/

如果像10 99 这样搜索关键字,它不会产生任何结果。我希望搜索显示包含搜索或输入的所有关键字的所有结果/行。

搜索 10 99 将显示第 1、5 和 6 行。

从技术上讲,搜索应该是“或”搜索。

不胜感激。

编辑: 搜索应该是“或”搜索。

【问题讨论】:

标签: jquery search datatables jquery-datatables


【解决方案1】:

AND-过滤器(包括所有搜索词都存在的行)。 这个custom filter 覆盖了内置过滤过程。每行中的每一列都与每个搜索词进行比较。

$.fn.dataTableExt.afnFiltering.push(
  function(oSettings, aData, iDataIndex) {
      var keywords = $(".dataTables_filter input").val().split(' ');  
      var matches = 0;
      for (var k=0; k<keywords.length; k++) {
          var keyword = keywords[k];
          for (var col=0; col<aData.length; col++) {
              if (aData[col].indexOf(keyword)>-1) {
                  matches++;
                  break;
              }
          }
      }
      return matches == keywords.length;
   }
);

分叉小提琴 -> http://jsfiddle.net/9d097s4a/


OR-过滤器(包括至少存在一个搜索词的行)。这是另一种方法,主要是为了简化上面的this answer。代替使用oSearch 和硬编码的搜索词,默认过滤事件被替换为对搜索短语进行标记然后执行高级fnFilter() 的事件。作为可选实验,现在只在用户点击 enter 时执行搜索 - 感觉更自然。

var input = $(".dataTables_filter input");
input.unbind('keyup search input').bind('keypress', function (e) {
    if (e.which == 13) {
       var keywords = input.val().split(' '), filter ='';
       for (var i=0; i<keywords.length; i++) {
           filter = (filter!=='') ? filter+'|'+keywords[i] : keywords[i];
       }            
       dataTable.fnFilter(filter, null, true, false, true, true);
       //                                ^ Treat as regular expression or not
    }
});

查看演示 -> http://jsfiddle.net/2p8sa9ww/

【讨论】:

  • 感谢您的及时回复。虽然,您的分叉小提琴没有按预期工作。如果我搜索 10 99,则搜索结果应该是第 1、5 和 6 行。
  • 嘿@SameerJoshi,好吧 - 如果您希望在 10 99 时返回第 1,5 和 6 行,那么您要执行的不是 AND 搜索,而是 OR 搜索?没有行同时匹配 10 和 99。
  • 我的错。你是对的。我需要“或”搜索而不是“与”。我已经相应地编辑了这个问题。知道如何管理吗?
  • @Borna,如果我理解你是正确的,那么你应该使用aData[col].charAt(0) == keyword.charAt(0)(或类似的东西,如果你想在第一个字符上测试)我不知道 yajra dataTables 输出javascript客户端的效果如何,但它是 jQuery dataTables,插件的工作方式应该没有什么区别,yajra dataTables 只是插件的一个方便的包装器。
  • @davidkonrad 抱歉,经过更多测试后,我意识到它实际上正在改变搜索字段。现在不需要帮助,但谢谢。只是想让 fnfilter() 在最新的 DataTables 中工作。
【解决方案2】:

针对数据表 1.10 更新

//在新位置搜索字段

Table = $('#your_datatable').DataTable();
$('#your_input_text_field').keyup(function () {
    Table.search($(this).val()).draw();
})

////OR search (enabling regular expression search)
var input = $('#your_input_text_field');
input.unbind('keyup search input').bind('keypress', function (e) {
    if (e.which == 13) {
        var keywords = input.val().split(' '),
            filter = '';
        for (var i = 0; i < keywords.length; i++) {
            filter = (filter !== '') ? filter + '|' + keywords[i] : keywords[i];
        }
        //true (param 2) turns regex on, false (param 3) turns smart search off
        Table.search(filter, true, false).draw();
    }
});

【讨论】:

    【解决方案3】:

    我通过使用 regEx 搜索来完成这项工作。我使用以下正则表达式在整个表格中搜索关键字10 99

    ^(?=.*?(10|99)).*?

    分叉小提琴 - http://jsfiddle.net/illuminatus/2j0Lz5or/6/

    参考:http://datatables.net/forums/discussion/12062/filtering-jquery-datatable-using-regular-expression

    【讨论】:

    • 这种方法最适合当您有一个用于搜索的自定义输入字段(例如,不是内置输入)和一个用于在手动执行搜索之前进行预处理的自定义事件时。 OR-filtering 可以通过多种方式实现,在下面我的答案中添加了一个更“流线型”的版本。
    【解决方案4】:

    在“每次”按键而不是按回车时触发搜索:

    var dataTable = $('table').dataTable();
    var input = $(".dataTables_filter input");
    input.unbind('keyup search input').bind('keyup',
    function(e) {
        if (input.val().length > 0) {
            var keywords = input.val().trim().split(' '), filter = '';
            for (var i = 0; i < keywords.length; i++) {
                filter = (filter !== '') ? filter + '|' + keywords[i] : keywords[i];
            }
            dataTable.fnFilter(filter, null, true, false, true, true);
            //                                ^ Treat as regular expression or not                        
        } else if (input.val().length == 0) {
            dataTable.fnFilter(" ", null, true, false, true, true);
        }
    });
    <script
      src="https://code.jquery.com/jquery-3.2.1.slim.min.js"
      integrity="sha256-k2WSCIexGzOj3Euiig+TlR8gA0EmPjuc79OEeY5L45g="
      crossorigin="anonymous"></script>
    <link rel="stylesheet" type="text/css" href="//cdn.datatables.net/1.10.6/css/jquery.dataTables.css">
    <script type="text/javascript" language="javascript" src="//cdn.datatables.net/1.10.6/js/jquery.dataTables.min.js"></script>
    <link rel="stylesheet" type="text/css" href="//cdn.datatables.net/responsive/1.0.6/css/dataTables.responsive.css">
    <script type="text/javascript" language="javascript" src="//cdn.datatables.net/responsive/1.0.6/js/dataTables.responsive.js"></script>
    
    <h5>OR SEARCH</h5>
    <table>
      <thead>
        <tr>
            <th>A</th>
            <th>B</th>
            <th>C</th>
            <th>D</th>
        </tr>
      </thead>
      <tbody>
          <tr><td>0</td><td>0</td><td>0</td><td>10</td></tr>
          <tr><td>0</td><td>5</td><td>0</td><td>0</td></tr>
          <tr><td>0</td><td>0</td><td>0</td><td>0</td></tr>
          <tr><td>2</td><td>0</td><td>0</td><td>10</td></tr>
          <tr><td>0</td><td>0</td><td>9</td><td>10</td></tr>
          <tr><td>0</td><td>0</td><td>99</td><td>0</td></tr>
      </tbody>
    </table>
    var dataTable = $('#your_datatable').dataTable();
    var input = $(".dataTables_filter input");
    input.unbind('keyup search input').bind('keyup',
    function(e) {
        if (input.val().length > 0) {
            var keywords = input.val().trim().split(' '), filter = '';
            for (var i = 0; i < keywords.length; i++) {
                filter = (filter !== '') ? filter + '|' + keywords[i] : keywords[i];
            }
            dataTable.fnFilter(filter, null, true, false, true, true);
            //                                ^ Treat as regular expression or not                        
        } else if (input.val().length == 0) {
            dataTable.fnFilter(" ", null, true, false, true, true);
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 2014-11-22
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      相关资源
      最近更新 更多