首页 文章

jQuery DataTables 'OR'搜索/过滤

提问于
浏览
11

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

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

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

搜索 10 99 将显示第1,5和6行 .

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

非常感谢任何帮助 .

编辑:搜索应该是'或'搜索 .

4 回答

  • 17

    AND -filter(包括存在所有搜索词的行) . 这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 -filter(包括至少存在一个搜索词的行) . 这是另一种方法,主要是试图简化上述this answer . 而不是使用 oSearch 和硬编码的搜索术语,默认过滤事件将替换为标记搜索短语的事件,然后执行高级 fnFilter() . 作为可选实验,现在只在用户点击输入时执行搜索 - 感觉更自然 .

    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/

  • 3

    我通过使用regEx搜索得到了这个 . 我使用以下regEx在整个表中搜索关键字 10 99

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

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

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

  • 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();
        }
    });
    
  • 2

    相同但触发搜索“每个”按键而不是按Enter键:

    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);
        }
    });
    

相关问题