【问题标题】:Search multiple tables using Datatables使用 Datatables 搜索多个表
【发布时间】:2013-12-28 19:54:31
【问题描述】:

好的,在我开始之前 jquery 业余提醒。

我正在使用Datatables 并且似乎无法让fnFilterAll API 发挥作用,即使使用他们网站上给出的示例也是如此。昨晚我在几个小时内用尽了在线谷歌操作,令我沮丧的是,我找不到 fnFilterAll 的实际工作示例。

fnFilterAll API 允许搜索多个表(对于那些想知道的人)。

目前为了简单起见,我创建了一个包含两个表格的拆分页面。我想我错过了一些非常基本的东西,比如我可能必须指定列,但不确定在哪里这样做(在 this.value 区域?)。无论如何,这是我的代码作为起点:

非常感谢任何帮助。感谢您的宝贵时间。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

    <head>
        <meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type">
        <title>Testing Multi-Table Search Filter</title>
        <style type="text/css" title="currentStyle">
            @import"DataTables/media/css/demo_page.css";
            @import"DataTables/media/css/demo_table.css";
            #div1 {
                background: #FFFDE0;
                width: 49%;
                height: 50%;
                float: left;
            }
            #div2 {
                background: #E2FFE0;
                width: 49%;
                height: 50%;
                float: left;
            }
            #div-mid-spacer {
                width: 2%;
                height: auto;
                float: left;
            }
        </style>
        <script type="text/javascript" language="javascript" src="DataTables/media/js/jquery.js"></script>
        <script type="text/javascript" language="javascript" src="DataTables/media/js/jquery.dataTables.js"></script>
        <script type="text/javascript" charset="utf-8">
            $.fn.dataTableExt.oApi.fnFilterAll = function(oSettings, sInput, iColumn, bRegex, bSmart) {
                var settings = $.fn.dataTableSettings;

                for (var i = 0; i < settings.length; i++) {
                    settings[i].oInstance.fnFilter(sInput, iColumn, bRegex, bSmart);
                }
            };

            $(document).ready(function() {
                $('#table1').dataTable({
                    "bPaginate": false,

                });
                var oTable0 = $("#table1").dataTable();

                $("#table1").keyup(function() {
                    // Filter on the column (the index) of this element
                    oTable0.fnFilterAll(this.value);
                });
            });

            $(document).ready(function() {
                $('#table2').dataTable({
                    "bPaginate": false,

                });
                var oTable1 = $("#table2").dataTable();

                $("#table2").keyup(function() {
                    // Filter on the column (the index) of this element
                    oTable1.fnFilterAll(this.value);
                });
            });
        </script>
    </head>

    <body>
        <div id="dt_example">
            <div id="div1" style="overflow: auto;"> <b>Current</b>:
                <br>
                <table class='display' id='table1'>
                    <thead>
                        <tr>
                            <th valign='top' width='175'>Fname</th>
                            <th valign='top' width='100'>Lname</th>
                            <th valign='top' width='50'>Age</th>
                            <th valign='top' width='100'>Check</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>John</td>
                            <td>Smith</td>
                            <td>44</td>
                            <td>--</td>
                        </tr>
                        <tr>
                            <td>Mary</td>
                            <td>Doe</td>
                            <td>54</td>
                            <td>--</td>
                        </tr>
                    </tbody>
                </table>
            </div>
            <div id="div-mid-spacer">&nbsp;</div>
            <div id="div2"> <b>Last</b>:
                <br>
                <table class='display' id='table2'>
                    <thead>
                        <tr>
                            <th valign='top' width='175'>Fname</th>
                            <th valign='top' width='100'>Lname</th>
                            <th valign='top' width='50'>Age</th>
                            <th valign='top' width='100'>Check</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>John</td>
                            <td>Smith</td>
                            <td>44</td>
                            <td>--</td>
                        </tr>
                        <tr>
                            <td>Mary</td>
                            <td>Doe</td>
                            <td>54</td>
                            <td>--</td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
        </div>
    </body>

</html>

【问题讨论】:

    标签: jquery datatables


    【解决方案1】:

    如果我明白你在寻找什么,那么你就快到了。我采用了您的代码并对其进行了小幅调整,以便一次搜索/过滤所有表格。

    我在jsFiddle上放了一个demo http://jsfiddle.net/bhSv9/

    数据表的搜索过滤器是分配的表的本地过滤器。我所做的是添加另一个输入并将全局搜索指向它。

    HTML 补充

     <input type="text" id="Search_All">
    

    JavaScript 变化

     $("#Search_All").keyup(function () {
        oTable1.fnFilterAll(this.value);
     });
    

    希望对你有帮助。

    【讨论】:

    • 如此简单!非常感谢凯霍根。不胜感激。也许这也会对其他人有所帮助。我将答案勾选为“已接受”。不过,我不能“投票”你的答案,因为我没有代表(新成员,到目前为止只有第一个问题)。
    【解决方案2】:

    Bob 给出的解决方案有效。我只是想进一步简化它,您不必多次编写 keyup() 和 $(document).ready() 函数。这对我有用。

    $(document).ready(function () {
      .....
      .....
      var oTable0 = $("#table1").dataTable();
      var oTable1 = $("#table2").dataTable();
       $("#Search_All").keyup(function () {
         oTable0.fnFilterAll(this.value);              
         oTable1.fnFilterAll(this.value);
      });
     });

    【讨论】:

      【解决方案3】:

      从 DataTables 1.10 开始,API 可用,首选方式是使用API search function

      $("#SearchTables").keyup(function () {
          $('table').DataTable().search(this.value).draw();
      });
      

      【讨论】:

        【解决方案4】:

        我基于@bob 工作制作了另一个版本,但是我清理了代码以保持整洁,并且只有一个搜索框并使用更高版本的 dataTables。

        Fiddle source

                   $.fn.dataTableExt.oApi.fnFilterAll = function(oSettings, sInput, iColumn, bRegex, bSmart) {
                     var settings = $.fn.dataTableSettings;
        
                     for (var i = 0; i < settings.length; i++) {
                       settings[i].oInstance.fnFilter(sInput, iColumn, bRegex, bSmart);
                     }
                   };
        
                   $(document).ready(function() {
                     $('.display').dataTable({
                       "bPaginate": false,
                       "sDom": "<'dt-toolbar'<'col-sm-6 col-xs-12 hidden-xs'l>r>" +
                         "t" + "<'dt-toolbar-footer'<'col-sm-6 col-xs-12 hidden-xs'i><'col-xs-12 col-sm-6'p>>",
        
                     });
                     var oTable0 = $("#table1").dataTable();
                     var oTable1 = $("#table2").dataTable();
                     $("#Search_All").keyup(function() {
                       oTable0.fnFilterAll(this.value);
                       oTable1.fnFilterAll(this.value);
                     });
                   });
                    #div1 {
                      background: #FFFDE0;
                      width: 49%;
                      height: 50%;
                      float: left;
                    }
        
                    #div2 {
                      background: #E2FFE0;
                      width: 49%;
                      height: 50%;
                      float: left;
                    }
        
                    #div-mid-spacer {
                      width: 2%;
                      height: auto;
                      float: left;
                    }
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <title>Testing Multi-Table Search Filter2</title>Search All Tables
        <input type="text" id="Search_All">
        <br>
        <br>
        <div id="dt_example">
          <div id="div1" style="overflow: auto;"> <b>Current</b>:
            <br>
            <table class='display' id='table1'>
              <thead>
                <tr>
                  <th valign='top' width='175'>Fname</th>
                  <th valign='top' width='100'>Lname</th>
                  <th valign='top' width='50'>Age</th>
                  <th valign='top' width='100'>Check</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td>John</td>
                  <td>Smith</td>
                  <td>44</td>
                  <td>--</td>
                </tr>
                <tr>
                  <td>Mary</td>
                  <td>Doe</td>
                  <td>54</td>
                  <td>--</td>
                </tr>
              </tbody>
            </table>
          </div>
          <div id="div-mid-spacer">&nbsp;</div>
          <div id="div2"> <b>Last</b>:
            <br>
            <table class='display' id='table2'>
              <thead>
                <tr>
                  <th valign='top' width='175'>Fname</th>
                  <th valign='top' width='100'>Lname</th>
                  <th valign='top' width='50'>Age</th>
                  <th valign='top' width='100'>Check</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td>John</td>
                  <td>Smith</td>
                  <td>44</td>
                  <td>--</td>
                </tr>
                <tr>
                  <td>Mary</td>
                  <td>Doe</td>
                  <td>54</td>
                  <td>--</td>
                </tr>
              </tbody>
            </table>
          </div>
        </div>
        <script type="text/javascript" src='https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.19/js/jquery.dataTables.min.js'></script>

        【讨论】:

          【解决方案5】:

          有一种更简单的方法可以做到这一点(正如 Janis 所说的那样进行编辑),在搜索输入上设置一个事件,以搜索多个表的类而不是 id。在这里它将在所有数据表中搜索 class="datatable"

          $('#oversearch').on( 'keyup', function () {
                  $('.datatable').DataTable().search( this.value ).draw();
              });
          
          <input id="oversearch" type="text">
          

          现在我需要用结果突出显示表格。这样做的方法如下:

              $('#oversearch').on( 'keyup', function () {
                  $('.table').DataTable().search( this.value ).draw();
          
                  var row = $('.table').DataTable().$('tr', { "filter": "applied" });
                  var parent_div = row.parents("div").eq(1);
                  parent_div.addClass("highlight");
              });
          

          然后您可以使用 parents() jquery 导航到您需要的任何父级。 (这里我选择遇到的第二个 div 父级 = div.eq(1))

          【讨论】:

            猜你喜欢
            • 2016-02-21
            • 2017-09-09
            • 2019-06-09
            • 2011-08-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多