【问题标题】:Datatables Filter columns on background colour数据表过滤背景颜色的列
【发布时间】:2019-12-23 21:51:35
【问题描述】:

我在 jQuery 中有一个表格,非常标准,但我使用 rowcallback 根据标准更改某些单元格的背景颜色。这发生在 3 列 6,7 和 8。rowcallback 可以根据我的需要完善和着色单元格。

但是,有时我的表中可能有很多数据,所以我想通过一个按钮过滤/搜索以仅显示第 6,7 和 8 列具有石灰背景色的行。

我尝试使用标准搜索并包含术语“lime”或 css

table.columns(8).search("style=background-color: lime").draw();
rowCallback: function (row, data, index) {
    if ((data["nextover"] > 85 && data["sno"] > 14) || (data["nextover"] > 70 && data["sno"] > 10 && data["time"] >= 70) || (data["nextover"] > 55 && data["sno"] > 5 && data["time"] >= 81)) {
        $(row)
        .find('td:eq(6)')
        .css('background-color', 'lime');
    } else {
        $(row)
        .find('td:eq(6)')
        .css('background-color', 'mistyrose');
    }
    var chars = data["pi2"].split(':');
    if (Number(chars[0]) + Number(chars[1]) > 15) {
        $(row)
        .find('td:eq(8)')
        .css('background-color', 'lime');
    } else {
        $(row)
        .find('td:eq(8)')
        .css('background-color', 'mistyrose');
    }
    var chars2 = data["pi1"].split(':');
    if (Number(chars2[0]) + Number(chars2[1]) > 70) {
        $(row)
        .find('td:eq(7)')
        .css('background-color', 'lime');
    } else {
        $(row)
        .find('td:eq(7)')
        .css('background-color', 'mistyrose');
    }
}

我想要的是一个我可以点击的按钮,它只会显示第 7,8 和 9 列中的任何一个具有石灰背景颜色的单元格

【问题讨论】:

    标签: datatables javascript jquery filter colors datatables


    【解决方案1】:

    自定义搜索plug-in 可能会解决您的问题。这样,您可以根据行是否包含具有必要类的单元格(例如“石灰”)来过滤行:

    $.fn.DataTable.ext.search.push((_,__,rowIdx) => $(dataTable.row(rowIdx).node()).has('td.lime').length || !$('#showLime').hasClass('limeOnly'));
    

    因此,您提到的按钮只需重新绘制表格即可。

    完成演示,您可以在下面找到:

    //src data
    const srcData = [
      {item: 'apple', qty: 15},
      {item: 'banana', qty: 8},
      {item: 'mango', qty: 4},
      {item: 'kiwi', qty: 11},
      {item: 'pear', qty: 12}
    ];
    
    //datatables initialization
    const dataTable = $('table').DataTable({
      dom: 't',
      data: srcData,
      columns: [
        {title: 'item', data: 'item'},
        {
          title: 'qty', 
          data: 'qty',
          createdCell: (td,_,rowData) => rowData.qty < 10 ? $(td).addClass('lime') : true
        }
      ]
    });
    
    //custom filtering based on matching class 'lime'
    //and 'show/hide' button state (class 'limeOnly')
    $.fn.DataTable.ext.search.push((_,__,rowIdx) => $(dataTable.row(rowIdx).node()).has('td.lime').length || !$('#showLime').hasClass('limeOnly'));
    
    //toggle class 'limeOnly' on the button and re-draw table
    $('#showLime').on('click', function(){
      $(this).toggleClass('limeOnly');
      dataTable.draw();
    });
    .lime {background-color: lime}
    &lt;!doctype html&gt;&lt;html&gt;&lt;head&gt;&lt;link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/dt/jq-3.3.1/dt-1.10.18/rg-1.1.0/datatables.min.css" /&gt;&lt;script type="application/javascript" src="https://code.jquery.com/jquery-3.3.1.min.js"&gt;&lt;/script&gt;&lt;script type="text/javascript" src="https://cdn.datatables.net/v/dt/jq-3.3.1/dt-1.10.18/rg-1.1.0/datatables.min.js"&gt;&lt;/script&gt;&lt;/head&gt;&lt;body&gt;&lt;table&gt;&lt;/table&gt;&lt;button id="showLime"&gt;Show/Hide lime&lt;/button&gt;&lt;/body&gt;&lt;/html&gt;

    【讨论】:

    • 谢谢,我得到了事件传播,虽然它很复杂,但它是有道理的,我按照你的建议更改了我的事件处理程序,但我仍然只看到第一页上的结果code$('body ').on('change', '#showLime', function () { $(this).toggleClass('limeOnly'); table.draw(); }); code 现在应该可以将其应用于应该覆盖所有页面的文档正文,但是它仍然只返回第一页上的结果
    • 嗨 Yevgen,没有仍然无法正常工作,请在此处编写代码 codepen.io/mikehobson/pen/RwbGJJX
    • @MikeHobson :我不明白这个问题 - 无论当前表格页面如何,您的“开/关”开关都能完美地来回过滤突出显示的条目。您能否更详细地解释哪些功能不符合预期?
    • 嗨 Yevgen,当我运行那个 codepen 并且什么都不做但单击开/关开关时,我只看到 1 个结果,这是前 10 个结果。如果我将页面大小更改为 100 并且单击我看到 4 的开关,如果我从第 1 页移动到第 2 页并单击我看到 2 的开关。在我看来,数据在显示之前不会加载,一旦加载,则开关按预期工作。
    • 我目前将这样的字符串传递给变量 pi2 :"20:30",我拆分,如果它超过 15,我会突出显示 var chars = data["pi2"].split(':'); if(Number(chars[0])+Number(chars[1])&gt;15) { $(row).find('td:eq(8)').addClass('lime'); } 查看您的示例我不确定这将如何工作它会似乎建议我需要在 colulms 部分添加 { data: 'pi2', createdCell: (td,_,rowData) =&gt; rowData.pi2 &gt; 15 ? $(td).addClass('lime') : true } 当我添加此数据表时失败
    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 2014-09-19
    • 1970-01-01
    • 2019-11-29
    • 2015-08-05
    • 2017-12-28
    • 2020-10-01
    相关资源
    最近更新 更多