Jquery 数据表日期范围过滤器

Posted

技术标签:

【中文标题】Jquery 数据表日期范围过滤器【英文标题】:Jquery Datatables Date Range Filter 【发布时间】:2017-06-25 01:54:56 【问题描述】:

下面的代码运行良好,但我需要添加一个新功能,以允许用户根据开始日期和结束日期过滤一系列记录,用户应该能够获取介于两者之间的所有记录,我能够找到一个数据表页面教程来实现这个,但我无法将它添加到代码中,你能帮我吗,这是链接

https://datatables.net/plug-ins/filtering/row-based/range_dates

$(document).ready(function() 
  $(function() 
    $("#datepickerStart").datepicker();
    $("#datepickerEnd").datepicker();
  );

  // Setup - add a text input to each footer cell
  $('#example tfoot th').each(function() 
    var title = $(this).text();
    if (title === "Start date") 
      $(this).html('<input type="text" id="datepickerStart" placeholder="Search ' + title + '" />');
     else if (title === "End date") 
      $(this).html('<input type="text" id="datepickerEnd" placeholder="Search ' + title + '" />');
     else 
      $(this).html('<input type="text" placeholder="Search ' + title + '" />');
    
  );

  // DataTable
  var table = $('#example').DataTable(


  );







  $('#example tbody').on('click', 'tr', function() 
    $(this).toggleClass('selected');
  );


  $('#example tbody')
    .on('mouseenter', 'td', function() 
      var colIdx = table.cell(this).index().column;

      $(table.cells().nodes()).removeClass('highlight');
      $(table.column(colIdx).nodes()).addClass('highlight');
    );


  $('#button').click(function() 
    alert(table.rows('.selected').data().length + ' row(s) selected');
  );

  // Apply the search
  table.columns().every(function() 
    var that = this;

    $('input', this.footer()).on('keyup change', function() 
      if (that.search() !== this.value) 
        that
          .search(this.value)
          .draw();
      
    );
  );
);
tfoot input 
  width: 100%;
  padding: 3px;
  box-sizing: border-box;


tr.highlight 
  background-color: blue !important;
<script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="https://cdn.datatables.net/1.10.13/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/plug-ins/9dcbecd42ad/integration/jqueryui/dataTables.jqueryui.js"></script>
<link rel="stylesheet" href="https://code.jquery.com/ui/1.10.13/themes/smoothness/jquery-ui.css">
<link rel="stylesheet" href="https://cdn.datatables.net/plug-ins/9dcbecd42ad/integration/jqueryui/dataTables.jqueryui.css">
<link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">


<table id="example" class="display" cellspacing="0" >

  <thead>
    <tr>
      <th>Name</th>
      <th>Position</th>
      <th>Office</th>
      <th>Age</th>
      <th>Start date</th>
      <th>End date</th>
      <th>Salary</th>
    </tr>
  </thead>
  <tfoot>
    <tr>
      <th>Name</th>
      <th>Position</th>
      <th>Office</th>
      <th>Age</th>
      <th id="min">Start date</th>
      <th id="max">End date</th>
      <th>Salary</th>
    </tr>
  </tfoot>
  <tbody>
    <tr>
      <td>Tiger Nixon</td>
      <td>System Architect</td>
      <td>Edinburgh</td>
      <td>61</td>
      <td>2011/04/25</td>
      <td>2011/04/27</td>
      <td>$320,800</td>
    </tr>
    <tr>
      <td>Garrett Winters</td>
      <td>Accountant</td>
      <td>Tokyo</td>
      <td>63</td>
      <td>2011/07/25</td>
      <td>2011/04/29</td>
      <td>$170,750</td>
    </tr>
    <tr>
      <td>Ashton Cox</td>
      <td>Junior Technical Author</td>
      <td>San Francisco</td>
      <td>66</td>
      <td>2009/01/12</td>
      <td>2011/04/28</td>
      <td>$86,000</td>
    </tr>
    <tr>
      <td>Cedric Kelly</td>
      <td>Senior javascript Developer</td>
      <td>Edinburgh</td>
      <td>22</td>
      <td>2012/03/29</td>
      <td>2012/03/30</td>
      <td>$433,060</td>
    </tr>
    <tr>
      <td>Airi Satou</td>
      <td>Accountant</td>
      <td>Tokyo</td>
      <td>33</td>
      <td>2008/11/28</td>
      <td>2008/11/30</td>
      <td>$162,700</td>
    </tr>
    <tr>
      <td>Brielle Williamson</td>
      <td>Integration Specialist</td>
      <td>New York</td>
      <td>61</td>
      <td>2012/12/02</td>
      <td>2012/12/21</td>
      <td>$372,000</td>
    </tr>

  </tbody>
</table>

【问题讨论】:

【参考方案1】:
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script> 
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    <script src="https://cdn.datatables.net/1.10.13/js/jquery.dataTables.min.js"></script>
    <script src="//cdn.datatables.net/plug-ins/1.10.13/filtering/row-based/range_dates.js"></script>
    <script src="https://cdn.datatables.net/plug-ins/9dcbecd42ad/integration/jqueryui/dataTables.jqueryui.js"></script>
    <link rel="stylesheet" href="https://code.jquery.com/ui/1.10.13/themes/smoothness/jquery-ui.css">
    <link rel="stylesheet" href="https://cdn.datatables.net/plug-ins/9dcbecd42ad/integration/jqueryui/dataTables.jqueryui.css">
    <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
    <script type="text/javascript" >

    $(document).ready(function() 
        $( function() 
         $( "#datepickerStart" ).datepicker();
          $( "#datepickerEnd" ).datepicker();
         );

        // Setup - add a text input to each footer cell
        $('#example tfoot th').each( function () 
            var title = $(this).text();
            if (title === "Start date") 
                $(this).html( '<input type="text" id="datepickerStart" placeholder="Search '+title+'" />' );
                
            else if (title === "End date") 
                $(this).html( '<input type="text" id="datepickerEnd" placeholder="Search '+title+'" />' );
                
                else 
                                    $(this).html( '<input type="text" placeholder="Search '+title+'" />' );
                
         );

        // DataTable
        var table = $('#example').DataTable( 

      $('#min').keyup( function()  table.draw();  );
      $('#max').keyup( function()  table.draw();  );

        
        );


        var iFini = document.getElementById('datepickerStart').value; 
        var iFfin = document.getElementById('datepickerEnd').value; 
        var iStartDateCol = 4; 
        var iEndDateCol = 5; 


        $.fn.dataTableExt.afnFiltering.push(
    function( oSettings, aData, iDataIndex ) 
        var iFini = document.getElementById('fini').value;
        var iFfin = document.getElementById('ffin').value;
        var iStartDateCol = 6;
        var iEndDateCol = 7;

        iFini=iFini.substring(6,10) + iFini.substring(3,5)+ iFini.substring(0,2);
        iFfin=iFfin.substring(6,10) + iFfin.substring(3,5)+ iFfin.substring(0,2);

        var datofini=aData[iStartDateCol].substring(6,10) + aData[iStartDateCol].substring(3,5)+ aData[iStartDateCol].substring(0,2);
        var datoffin=aData[iEndDateCol].substring(6,10) + aData[iEndDateCol].substring(3,5)+ aData[iEndDateCol].substring(0,2);

        if ( iFini === "" && iFfin === "" )
        
            return true;
        
        else if ( iFini <= datofini && iFfin === "")
        
            return true;
        
        else if ( iFfin >= datoffin && iFini === "")
        
            return true;
        
        else if (iFini <= datofini && iFfin >= datoffin)
        
            return true;
        
        return false;
    
);




        $('#example tbody').on( 'click', 'tr', function () 
        $(this).toggleClass('selected');
         );


         $('#example tbody')
            .on( 'mouseenter', 'td', function () 
                var colIdx = table.cell(this).index().column;

                $( table.cells().nodes() ).removeClass( 'highlight' );
                $( table.column( colIdx ).nodes() ).addClass( 'highlight' );
             );


        $('#button').click( function () 
            alert( table.rows('.selected').data().length +' row(s) selected' );
         );

        // Apply the search
        table.columns().every( function () 
            var that = this;

            $( 'input', this.footer() ).on( 'keyup change', function () 
                if ( that.search() !== this.value ) 
                    that
                        .search( this.value )
                        .draw();
                
             );
         );
     );






    </script>

    <style>
    tfoot input 
            width: 100%;
            padding: 3px;
            box-sizing: border-box;
        
    tr.highlight 
        background-color: blue !important;
    

    </style>





    <table id="example" class="display" cellspacing="0" >

            <thead>
                <tr>
                    <th>Name</th>
                    <th>Position</th>
                    <th>Office</th>
                    <th>Age</th>
                    <th>Start date</th>
                    <th>End date</th>
                    <th>Salary</th>
                </tr>
            </thead>
            <tfoot>
                <tr>
                    <th>Name</th>
                    <th>Position</th>
                    <th>Office</th>
                    <th>Age</th>
                    <th id="min">Start date</th>
                    <th id="max">End date</th>
                    <th>Salary</th>
                </tr>
            </tfoot>
            <tbody>
                <tr>
                    <td>Tiger Nixon</td>
                    <td>System Architect</td>
                    <td>Edinburgh</td>
                    <td>61</td>
                    <td>2011/04/25</td>
                    <td>2011/04/27</td>
                    <td>$320,800</td>
                </tr>
                <tr>
                    <td>Garrett Winters</td>
                    <td>Accountant</td>
                    <td>Tokyo</td>
                    <td>63</td>
                    <td>2011/07/25</td>
                    <td>2011/04/29</td>
                    <td>$170,750</td>
                </tr>
                <tr>
                    <td>Ashton Cox</td>
                    <td>Junior Technical Author</td>
                    <td>San Francisco</td>
                    <td>66</td>
                    <td>2009/01/12</td>
                    <td>2011/04/28</td>
                    <td>$86,000</td>
                </tr>
                <tr>
                    <td>Cedric Kelly</td>
                    <td>Senior Javascript Developer</td>
                    <td>Edinburgh</td>
                    <td>22</td>
                    <td>2012/03/29</td>
                    <td>2012/03/30</td>
                    <td>$433,060</td>
                </tr>
                <tr>
                    <td>Airi Satou</td>
                    <td>Accountant</td>
                    <td>Tokyo</td>
                    <td>33</td>
                    <td>2008/11/28</td>
                    <td>2008/11/30</td>
                    <td>$162,700</td>
                </tr>
                <tr>
                    <td>Brielle Williamson</td>
                    <td>Integration Specialist</td>
                    <td>New York</td>
                    <td>61</td>
                    <td>2012/12/02</td>
                    <td>2012/12/21</td>
                    <td>$372,000</td>
                </tr>

            </tbody>
        </table>

【讨论】:

谢谢,你能加载那个 html 页面吗?我只是复制/粘贴了您的代码,但页面没有为我加载...【参考方案2】:

构建表格后,您应该能够将该代码放在 javascript 中的任何位置。

您只需像这样更改这些行:

    $.fn.dataTableExt.afnFiltering.push(
function( oSettings, aData, iDataIndex ) 
  var iFini = document.getElementById('datepickerStart').value; 
  var iFfin = document.getElementById('datepickerEnd').value; 
  var iStartDateCol = 4; 
  var iEndDateCol = 5; 

    iFini=iFini.substring(6,10) + iFini.substring(3,5)+ iFini.substring(0,2);
    iFfin=iFfin.substring(6,10) + iFfin.substring(3,5)+ iFfin.substring(0,2);

    var datofini=aData[iStartDateCol].substring(6,10) + aData[iStartDateCol].substring(3,5)+ aData[iStartDateCol].substring(0,2);
    var datoffin=aData[iEndDateCol].substring(6,10) + aData[iEndDateCol].substring(3,5)+ aData[iEndDateCol].substring(0,2);

    if ( iFini === "" && iFfin === "" )
    
        return true;
    
    else if ( iFini <= datofini && iFfin === "")
    
        return true;
    
    else if ( iFfin >= datoffin && iFini === "")
    
        return true;
    
    else if (iFini <= datofini && iFfin >= datoffin)
    
        return true;
    
    return false;

);

【讨论】:

您好,我已经添加了代码和您的行以及该插件的cdn,但是页面加载不正确,请参见下面的完整代码 该代码位于以下位置:function( oSettings, aData, iDataIndex ) 查看更新后的答案。【参考方案3】:

我不知道是否有帮助,但我会按照你的要求做这样的事情

编辑

这里有更多解释。 $.fn.DataTable.ext.search 是为Datatables提供的API,用于扩展过滤功能。首先有一个数组,其中包含必须应用以下函数的表的名称(这是在同一页面上有多个表的情况下),然后从 de datepickers 获取值并拆分以创建另一个 Date 谁在三种情况下(From、To 和 StartDate)具有相同的格式。然后比较它们之间的日期并根据需要进行过滤。 StartDate 来自表的当前记录。

在 datepickers 我添加了类 date-range-filter

var allowFilter = ['tableOT'];

$('.date-range-filter').change(function() 
            oTable.draw();
        );

$.fn.dataTable.ext.search.push(
      function(settings, data, dataIndex) 
          // check if current table is part of the allow list
          if ( $.inArray( settings.nTable.getAttribute('id'), allowFilter ) == -1 )
          
              // if not table should be ignored
              return true;
          
          var min = $("#<%=txtFechaDesde.ClientID %>").val();
          var max = $("#<%=txtFechaHasta.ClientID %>").val();
          var fromDate;
          var toDate;
          // need to change str order before making  date obect since it uses a new Date("mm/dd/yyyy") format for short date.
          var d = data[0].split("/");
          var startDate = new Date(d[1]+ "/" +  d[0] +"/" + d[2]);
          if(min != "")
              var fd = min.split("/");
              fromDate =  new Date(fd[1]+ "/" +  fd[0] +"/" + fd[2]);
          
          if(max != "")
              var td = max.split("/");
              toDate =  new Date(td[1]+ "/" +  td[0] +"/" + td[2]);
          

          if (fromDate == null && toDate == null)  return true; 
          if (fromDate == null && startDate <= toDate)  return true;
          if(toDate == null && startDate >= fromDate) return true;
          if (startDate <= toDate && startDate >= fromDate)  return true; 
          return false;
      
    );

【讨论】:

您能提供更多解释吗?

以上是关于Jquery 数据表日期范围过滤器的主要内容,如果未能解决你的问题,请参考以下文章

数据表日期范围过滤器不起作用

Google 数据洞察:日期范围过滤器错误

数据表日期范围过滤器,但是,我想删除分页,并可能添加或删除一些其他功能

日期范围过滤器中的 AND 语句

带有两个范围滑块过滤器的 jQuery 数据表

根据日期范围过滤火花数据框[重复]