【问题标题】:Datatables "footerCallback" function not displaying results in footer数据表“footerCallback”函数未在页脚中显示结果
【发布时间】:2017-02-01 15:34:25
【问题描述】:

我尝试获取每列的总和并在页脚中显示结果。我正在使用 Datatables 提供的 "footerCallback" 函数。但是它没有在页脚中显示任何内容

数据表解释

"注意如果表格没有tfoot元素,这个回调 不会被解雇。”

所以我已将 tfoot 添加到表中,以便触发回调

<table id="monthlytable" class="display" cellspacing="0" width="100%">  
<thead></thead><tfoot></tfoot></table>

回调函数:

"footerCallback": function ( tfoot, data, start, end, display ) {
var api = this.api(), data;

// Remove the formatting to get integer data for summation
var intVal = function ( i ) {
return typeof i === 'string' ?
    i.replace(/[\$,]/g, '')*1 :
    typeof i === 'number' ?
    i : 0;
};

// Total over all pages
total = api
  .column( 3 )
  .data()
  .reduce( function (a, b) {
        return intVal(a) + intVal(b);
    }, 0 );

// Update footer
var numFormat = $.fn.dataTable.render.number( '\,', '.', 2, '£' ).display;
    $( api.column( 3 ).footer() ).html(numFormat(total));
}

我已经尝试使用 "headerCallback" 与上面相同的代码(更改为在标题中显示)并且它工作得非常好。

headerCallback 有效但 footerCallback 无效的原因是什么?

【问题讨论】:

    标签: javascript jquery html datatable callback


    【解决方案1】:

    添加这个:

    buttons: [{ extend: 'print',
                footer: true }]
    

    【讨论】:

      【解决方案2】:

      问题是没有找到页脚。

      我必须使用 $("#monthlytable").append('&lt;tfoot&gt;&lt;th&gt;&lt;/th&gt;&lt;/tfoot&gt;'); 添加页脚

      您需要确保&lt;tfoot&gt;&lt;th&gt; 标记的数量与您的表格具有的表格标题数量相匹配(这还需要包括隐藏列)。所以 5 个表标题表示 5 个&lt;th&gt; 标签,例如: $("#monthlytable").append('&lt;tfoot&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;/tfoot&gt;');

      还需要在初始化数据表的地方加上$("#monthlytable").append('&lt;tfoot&gt;&lt;th&gt;&lt;/th&gt;&lt;/tfoot&gt;');。例如:

      $("#monthlytable").append('<tfoot><th></th></tfoot>');
      var table = $('#monthlytable').DataTable({
      // datatable elements 
      });
      

      【讨论】:

      • 谢谢,这对我有用!我更新了你的答案,因为起初它没有用,我的表格中有 6 个标题,所以我在页脚中添加了 6 列,但我收到了一个 JavaScript 错误,然后我意识到你甚至必须添加一个列用于数据表中的隐藏列。
      【解决方案3】:
      //Below code worked for me
      //Bootstrap table 
      //Below scripts required
      <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
      <script src="js/jquery.dataTables.min.js"></script>
      $('#divID').html('<table id="tableID"><tr><th>head</th></tr><thead></thead><tbody><tr><td>some data</td</tr><tfoot><tr id="foot"></tr><tfoot></tbody></table>');
      
      var table = $('#tableID').DataTable( {
                          "dom": '<"top"if>t<"bottom"><"clear">',
                          "bSort": false,
                          "paging": false,
                          "bFilter": false,
                      "footerCallback": function(row, data, start, end, display) {
                        var api = this.api();
                       var rcnt=0;
                        api.columns('.sum', {
                          page: 'current'
                        }).every(function() {
                          var sum = this
                            .data()
                            .reduce(function(a, b) {
                              var x = parseFloat(a) || 0;
                              var y = parseFloat(b) || 0;
                              return x + y;
                            }, 0);
                          console.log(sum); //alert(sum);
      
                          if(rcnt==0){
                              $("#foot").append('<td style="background:#a1eaed;color:black; text-align: center;">Total</td>');
                          }else{
                              $("#foot").append('<td style="background:#a1eaed;color:black; text-align: center;">'+sum+'</td>');
                          }
                          rcnt++;
                          //$(this.footer()).html(sum);
                        });
                      }
                  } );
      

      【讨论】:

        【解决方案4】:
          "footerCallback": function ( row, data, start, end, display ) {
                                  var api = this.api();
                                  nb_cols = api.columns().nodes().length;
                                  var j = 2;
                                  while(j < nb_cols){
                                    var pageTotal = api
                                          .column( j, { page: 'current'} )
                                          .data()
                                          .reduce( function (a, b) {
                                              return Number(Number(a) + Number(b)).toFixed(2);
                                          }, 0 );
                                      // Update footer
                                      $( api.column( j ).footer() ).html(pageTotal);
                                    j++;
                                  }
                                },
        

        【讨论】:

        • 请为您的答案添加一些解释
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多