2024 年 7 月 26 日,星期五
Allan Jardine 发表于

排序顺序插件

最近,我收到一个开发人员提出的一个有趣的问题,他希望向其最终用户展示将多列排序应用于 DataTable 时所应用的排序顺序的直观表示。例如,如果你在排序中使用了两个列,那么了解 DataTables 用哪一列作主排序和次排序是很有用的。

DataTables 的默认样式确实包括对已排序列中的单元格进行阴影处理,但主次排序之间的差异是故意很细微的。为了让它更突出,我想出了在排序指示符旁边显示编号标签的主意。在下面的示例中,第一列和第二列分别用于主排序和次排序,你可以在每列顶部看到编号

姓名职位办公室工资
Tiger Nixon系统架构师爱丁堡$320,800
Garrett Winters会计东京$170,750
Ashton Cox初级技术作者旧金山$86,000
Cedric Kelly高级 JavaScript 开发者爱丁堡$433,060
Airi Satou会计东京$162,700
Brielle Williamson集成专家纽约$372,000
Herrod Chandler销售助理旧金山$137,500
Rhona Davidson集成专家东京$327,900
Colleen HurstJavaScript 开发者旧金山$205,500
Sonya Frost软件工程师爱丁堡$103,600
Jena Gaines办公室经理伦敦$90,560
Quinn Flynn支持负责人爱丁堡$342,000
Charde Marshall区域总监旧金山$470,600
Haley Kennedy高级营销设计师伦敦$313,500
Tatyana Fitzpatrick区域总监伦敦$385,750
Michael Silva营销设计师伦敦$198,500
Paul Byrd首席财务官 (CFO)纽约$725,000
Gloria Little系统管理员纽约$237,500
Bradley Greer软件工程师伦敦$132,000
Dai Rios人事负责人爱丁堡$217,500
Jenette Caldwell开发负责人纽约$345,000
Yuri Berry首席营销官 (CMO)纽约$675,000
Caesar Vance售前支持纽约$106,450
Doris Wilder销售助理悉尼$85,600
Angelica Ramos首席执行官 (CEO)伦敦$1,200,000
Gavin Joyce开发人员爱丁堡$92,575
Jennifer Chang区域总监新加坡$357,650
Brenden Wagner软件工程师旧金山$206,850
Fiona Green首席运营官 (COO)旧金山$850,000
Shou Itou区域营销东京$163,000
Michelle House集成专家悉尼$95,400
Suki Burks开发人员伦敦$114,500
Prescott Bartlett技术作者伦敦$145,000
Gavin Cortez团队负责人旧金山$235,500
Martena Mccray售后支持爱丁堡$324,050
Unity Butler营销设计师旧金山$85,675
Howard Hatfield办公室经理旧金山$164,500
Hope Fuentes秘书旧金山$109,850
Vivian Harrell财务控制旧金山$452,500
Timothy Mooney办公室经理伦敦$136,200
Jackson Bradshaw董事纽约$645,750
Olivia Liang支持工程师新加坡$234,500
Bruno Nash软件工程师伦敦$163,500
Sakura Yamamoto支持工程师东京$139,575
Thor Walton开发人员纽约$98,540
Finn Camacho支持工程师旧金山$87,500
Serge Baldwin数据协调员新加坡$138,575
Zenaida Frank软件工程师纽约$125,250
Zorita Serrano软件工程师旧金山$115,000
Jennifer Acosta初级 JavaScript 开发者爱丁堡$75,650
Cara Stevens销售助理纽约$145,600
Hermione Butler区域总监伦敦$356,250
Lael Greer系统管理员伦敦$103,500
Jonas Alexander开发人员旧金山$86,500
Shad Decker区域总监爱丁堡$183,000
Michael BruceJavaScript 开发者新加坡$183,000
Donna Snider客户支持纽约$112,000

在列标题上使用Shift 单击来触发表格中的多列排序,并注意指示符的更改。当排序仅应用于一列时,将不显示其他指示符。

用量

在详细说明如何创建此效果之前,让我们探讨如何使用 OrderNumber 插件。

初始化

此示例的初始化通过在 DataTables 配置中启用新的 orderNumbers 选项非常简单地完成

new DataTable('#myTable', {
    orderNumbers: true
});

就是这样!

可在 DataTables CDN 上获取要直接包含在页面上的发行文件

CSS
JS

如果你正在使用 bundler,这个插件可在 npm 上作为 datatables.net-feature-ordernumbers 获得。要将其与 ES 模块一起使用,只需包含该程序包,它将自动注册为可用功能

import DataTable from 'datatables.net-dt';
import 'datatables.net-feature-ordernumbers';

new DataTable('#myTable', {
    orderNumbers: true
});

此 StackBlitz 示例演示了在 Typescript + Vite 构建环境中使用的新插件。

DataTables 插件 Git 仓库 中提供了此插件的源代码,并已根据 MIT 许可证发布。

样式

序数的默认 CSS 非常粗体,并且为黑白,既有暗色模式的样式,也有亮色模式的样式。你可能非常希望修改样式以适应自己的配色方案。这可使用 CSS 变量在样式表中轻松地完成。

OrderNumbers 定义了用于自定义指示器颜色的四个变量

table {
    --dt-order-numbers-light-color: white;
    --dt-order-numbers-light-background: #555;
    --dt-order-numbers-dark-color: black;
    --dt-order-numbers-dark-background: #d3d3d3;
}

根据需要修改并包含在自己的 CSS 中。

创建插件

此插件主要由 draw 事件驱动 - 侦听主机 DataTable 上的该事件并在对其执行排序时将元素插入页眉单元格。我们可以使用 order() 获取当前顺序。因此,插件真正可以归结为

table.on('draw', function () {
    var order = table.order();

    if (order.length > 1) {
        for (var i = 0; i < order.length; i++) {
            var col = table.column(order[i][0]);
            var cell = col.header();

            if (! col.visible()) {
                continue;
            }

            $('<span>')
                .addClass('dt-order-number')
                .text(i + 1)
                .appendTo(cell);
        }
    }
});

此处我们遍历 order 给出的 2D 数组,并为每个条目获取相关列。第 9 行确认该列在显示数字前实际上是可见的,第 13-16 行创建一个简单的 span 并将其插入列的页眉单元格(由 column().header() 给出 - 第 7 行)。

除了创建新元素外,我们还需要删除它们。在每次绘制时,我们可以使用单行 jQuery 从页眉中选择旧元素 (table().header()) 并将其从文档中删除

$('span.dt-order-number', table.table().header()).remove();

唯一缺失的部分是侦听 DataTables 初始化,以便我们可以检查初始化选项,看看是否应该添加 draw 事件侦听器。我们使用 document 中的 init 侦听器执行此操作,因此我们知道任何 DataTable 何时初始化。接下来,检查初始化对象 (init()) 中是否存在 orderNumbers 或是否已默认启用 - 如果是这样,请添加侦听器

$(document).on('init.dt', function (e, settings) {
    var api = new DataTable.Api(settings);

    var enable = api.init().orderNumbers || DataTable.defaults.orderNumbers;

    if (enable) {
        orderNumbers(api);
    }
});

创建自己的插件

这是一个有趣的插件,希望能为尝试对 DataTables 进行自定义感兴趣的人提供一个有趣的起点。或许它会激发你想要看到的内容的想法。如果您这样做,请与我们联系并与社区分享!