【问题标题】:dataTables custom filtering by class name of <tr>dataTables 按类名自定义过滤 <tr>
【发布时间】:2023-04-01 07:11:01
【问题描述】:

我阅读了http://datatables.net/examples/plug-ins/range_filtering.html 的文档以按范围过滤,但我不太了解如何按行的类过滤项目。

我想要几个按钮,当单击时,按每行的类(字符串值)过滤数据表。例如,如果你有

<tr class="dont_filter">
<tr class="do_filter">

默认情况下它们都会显示。当有人单击其中一个按钮时,所有带有“do_filter”的行都将被隐藏,并且 dataTables 会重新绘制列表,以便此更改发生在所有页面中。

【问题讨论】:

    标签: jquery datatables jquery-datatables


    【解决方案1】:

    这是一个用于完全不同的东西的数据表小提琴的分支。

    http://jsfiddle.net/72xGx/

    此示例以数据表站点上的“范围过滤”示例为起点。 它使用复选框来确定是否应应用过滤器,并且默认情况下所有过滤器都处于打开状态。当您选中和取消选中复选框时,表中的数据应相应过滤。毫无疑问,这可以进行一些清理,但我相信您会发现这是实现您既定目标的一种途径。

    JavaScript

    /* Custom filtering function which will filter data in column four between two values */
    $.fn.dataTableExt.afnFiltering.push(
    
    function (oSettings, aData, iDataIndex) {
        var gA = $('#ckb-gradeA').is(':checked'),
            gC = $('#ckb-gradeC').is(':checked'),
            gU = $('#ckb-gradeU').is(':checked'),
            gX = $('#ckb-gradeX').is(':checked');
    
        var myRowClass = oSettings.aoData[iDataIndex].nTr.className;
    
        if (myRowClass === 'gradeA' || myRowClass === 'gradeA even' || myRowClass === 'gradeA odd') {
            return gA === true ? true : false;
        } else if (myRowClass === 'gradeC' || myRowClass === 'gradeC even' || myRowClass === 'gradeC odd') {
            return gC === true ? true : false;
        } else if (myRowClass === 'gradeU' || myRowClass === 'gradeU even' || myRowClass === 'gradeU odd') {
            return gU === true ? true : false;
        } else if (myRowClass === 'gradeX' || myRowClass === 'gradeX even' || myRowClass === 'gradeX odd') {
            return gX === true ? true : false;
        } else {
            return false;
        }
    });
    
    $(function () {
        /* Initialise datatables */
        var oTable = $('#example').dataTable();
    
        /* Add event listeners to the two range filtering inputs */
        $('#ckb-gradeA').change(function () {
            oTable.fnDraw();
        });
        $('#ckb-gradeC').change(function () {
            oTable.fnDraw();
        });
        $('#ckb-gradeU').change(function () {
            oTable.fnDraw();
        });
        $('#ckb-gradeX').change(function () {
            oTable.fnDraw();
        });
    });
    

    html表格结构的一部分
    (以便注意&lt;tr&gt; 元素上的一些css 类)

        <tr class="gradeC">
            <td>Trident</td>
            <td>Internet Explorer 5.0</td>
            <td>Win 95+</td>
            <td class="center">5</td>
            <td class="center">C</td>
        </tr>
        <tr class="gradeA">
            <td>Trident</td>
            <td>Internet Explorer 5.5</td>
            <td>Win 95+</td>
            <td class="center">5.5</td>
            <td class="center">A</td>
        </tr>
        <tr class="gradeA">
            <td>Trident</td>
            <td>Internet Explorer 6</td>
            <td>Win 98+</td>
            <td class="center">6</td>
            <td class="center">A</td>
        </tr>
    

    【讨论】:

    • 谢谢你 - oSettings.aoData[iDataIndex].nTr.className; 是我拼图中缺失的一块。几点说明:我认为您缺少$.fn.dataTableExt.afnFiltering.push(); - 应该在$(function () { 之前。此外,如果其他人(如我)使用 DataTables 1.10 及更高版本,您需要调用 table.draw() 而不是 table.fnDraw() 以使表格自行刷新。
    • 另外,一种更简洁的测试类的方法是将其拆分为一个类名数组,并查看该数组是否包含您正在测试的类。所以,你可以说var myRowClasses = oSettings.aoData[iDataIndex].nTr.className.split(" ");,然后像if(myRowClasses.indexOf('gradeA') &gt; -1)一样测试
    猜你喜欢
    • 2015-08-09
    • 1970-01-01
    • 2015-04-26
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2019-11-24
    相关资源
    最近更新 更多