【问题标题】:DataTables break on last "Next" or any "Previous" paginate buttonDataTables 在最后一个“下一个”或任何“上一个”分页按钮上中断
【发布时间】:2017-10-29 23:12:58
【问题描述】:

我有以下 DataTable,它调用 status_icons() 函数来用图标替换 0 和 1 值。

在第一个结果页面(在 initComplete 上)我调用 status_icons() 进行替换,然后我在 DataTables 范围外触发,以便为下一个分页结果重新执行我的函数为每个分页的 DataTable DOM 重建行为。

我得到的错误是当您单击任何分页或编号分页上的“上一个”按钮时,在当前图标上重新添加状态图标盒子。

我用图标替换值的功能

function status_icons() {

    $('table tr').each(function() {
        if ($(this).find('td').eq(0).text() == '1') {
            $(this).find('td').eq(0).replaceWith('<i class="fa fa-3 fa-check-circle-o datatable-paid-1"></i>');
        } else {
            $(this).find('td').eq(0).replaceWith('<i class="fa fa-3 fa-exclamation-circle datatable-paid-0"></i>');
        }
    });
}

DataTable 构造 - 在 initComplete 上调用函数获取第一页和第二页结果

setTimeout(function() {
  $('#invoices-table').DataTable({
    responsive: true,
    columnDefs: [{ orderable: false, targets: [-1, -2, -3] }],
    dom: 'Bfrtip',  
    initComplete: function() {
      status_icons() // it executes my function for the first page of results
      var api = this.api();
      // some irrelevant code that uses api and does not cause my issue
      // ...

    }
  });
}, 1000);

jQuery 事件用于在每次点击 .paginate_button 时执行我的函数,因为 DataTable 重建

$(document).on('click','.paginate_button', function() {
  if( !$(this).hasClass("disabled") ){
    status_icons(); // it executes for the rest paginations
  }
});

https://codepen.io/anon/pen/Wjqbbd

【问题讨论】:

    标签: jquery pagination datatables


    【解决方案1】:

    一般来说,将事件委托给document 对象是really bad thing。此外,dataTables 完全窃取了点击事件,阻止您向.paginate_buttons 添加额外的点击事件处理程序。 .paginate_button 上的工作事件处理程序将是

    $('body').on('mousedown','.paginate_button', function() {
      ...
    })
    

    但是,就您想要实现的目标而言,您的方法有些夸大或“错误”。 dataTables 有一个columns.render 回调来处理这些问题。只需将此添加到您的 columDefs 部分:

    columnDefs: [
      { orderable: false, targets: [-1, -2, -3] },
      { targets : 0, 
        render: function(data, type) {
          if (type == 'display') {
            return data == '1' 
              ? '<i class="fa fa-3 fa-check-circle-o datatable-paid-1"></i>'
              : '<i class="fa fa-3 fa-exclamation-circle datatable-paid-0"></i>'
          } else {
            return data
          }
        }
      }
    ],
    

    你很好。它解决了这两个问题:一个没有点击操作,您根本不必担心页面更改 - 一个重复插入的字体真棒图标。

    当dataTables想要显示列的内容时,它只是通过返回正确的&lt;i&gt;字体真棒标记来工作。

    已将您的代码移植到 jsfiddle -> http://jsfiddle.net/2tzp19se/

    【讨论】:

    • 好答案! +1 ...但是小提琴中的setTimeout({...},0);有什么理由吗?
    • 嘿@LouysPatriceBessette,不 - 只需从 OP 的 codepen 复制粘贴即可。我只是将 1000ms 更改为 0ms(因为我真的看不到超时的原因),但希望保持代码对 OP 可识别,所以保留原始结构。
    • 我在你的回答中唯一没有得到的部分是targets: [-1, -2, -3]。你可以解释吗?我敢肯定,OP也不知道;)哈……算了,我发现了。这些负数是列索引,从右边开始计数,以禁用排序。
    • @LouysPatriceBessette,是的!这也是 OP 原始代码的一部分。刚刚更改了事件处理程序(作为答案第一部分的示例),然后将status_icons() 注释掉并添加了一个针对第一列的新columnDefs 部分。
    • 毫无疑问,您的答案/解决方案为问题提供了额外的价值,太棒了!现在targets: 0 是第一列,怎么可能在这个参数中加入一个额外的语句,等待`data == "1"` 也会影响第3 列,假设将其类更改为禁用。似乎没有为同时直接转到其他列的多个语句提供空间
    【解决方案2】:

    只需使用.html() 而不是.replaceWith()

    .replaceWith() 不仅替换了td 内容...
    但将 td 本身替换为传递的参数(字符串或对象)。

    更新CodePen

    【讨论】:

    • Louy 感谢您的回复!您的解决方案修复了以前的问题,但导致了一个新问题。当您进入最后一个结果(第 4 页,状态栏中为 1)然后返回(第 3 页)时,所有 1 都会丢失其替换字体图标(绿色复选标记)并仅呈现感叹号(替换0s)
    • 我在 CodePen 中修复了它...我只是为else 添加了一个条件。 ---但老实说,另一个答案比我的要好。 ;)
    • 嗯,它可能会......但老实说,你直接回答了我的问题,这样你的回答就得到了严格的指导,而不是更少+它也很有效:)
    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多