2016 年 2 月 26 日星期五

省略号渲染器

在使用 DataTables 的过程中,将出现从源信息获取的数据并非您希望向最终用户显示的格式的情形。为此,DataTables 通过 columns.render 支持 数据渲染器。此选项可以用作执行数据转换的函数(这是一种 Javascript 函数,所以您可以做任何事情!),并且每当 DataTables 需要该单元格的数据时都会调用此函数。实际上,此选项也是 DataTables 提供其 正交数据支持 的方式。

以下是渲染器可以派上用场的几种用例

  • 将日期/时间转换为本地格式
  • 对数字进行格式化以显示货币、可读性和精确度
  • 安全性以防止 XSS 攻击
  • 缩短长字符串

本文将详细介绍渲染器的操作方式,并可以通过实现上述列表中的最后一个选项作为示例进行构建:长文本将使用 省略号 显示为简短文本,以表示文本已被截断。

示例

下表显示了一个示例 - 第一列在第 10 个字符处使用省略号,并且不允许拆分单词,而第二列在第 15 个字符处使用省略号,并且允许在单词中途截断。示例表还启用了 响应式

名称职位办公室年龄开始日期薪水
Tiger Nixon系统架构师爱丁堡612011-04-25$320,800
Garrett Winters会计师东京632011-07-25$170,750
Ashton Cox初级技术作者旧金山662009-01-12$86,000
Cedric Kelly高级 Javascript 开发人员爱丁堡222012-03-29$433,060
Airi Satou会计师东京332008-11-28$162,700
Brielle Williamson集成专家纽约612012-12-02$372,000
Herrod Chandler销售助理旧金山592012-08-06$137,500
Rhona Davidson集成专家东京552010-10-14$327,900
Colleen HurstJavascript 开发人员旧金山392009-09-15$205,500
Sonya Frost软件工程师爱丁堡232008-12-13$103,600
Jena Gaines办公室经理伦敦302008-12-19$90,560
Quinn Flynn支持主管爱丁堡222013-03-03$342,000
Charde Marshall区域总监旧金山362008-10-16$470,600
Haley Kennedy高级营销设计师伦敦432012-12-18$313,500
Tatyana Fitzpatrick区域总监伦敦192010-03-17$385,750
Michael Silva营销设计师伦敦662012-11-27$198,500
Paul Byrd首席财务官 (CFO)纽约642010-06-09$725,000
Gloria Little系统管理员纽约592009-04-10$237,500
Bradley Greer软件工程师伦敦412012-10-13$132,000
Dai Rios人事主管爱丁堡352012-09-26$217,500
Jenette Caldwell开发主管纽约302011-09-03$345,000
Yuri Berry首席营销官 (CMO)纽约402009-06-25$675,000
Caesar Vance售前支持纽约212011-12-12$106,450
Doris Wilder销售助理悉尼232010-09-20$85,600
Angelica Ramos首席执行官 (CEO)伦敦472009-10-09$1,200,000
加文·乔伊斯开发人员爱丁堡422010-12-22$92,575
珍妮弗·张区域总监新加坡282010-11-14$357,650
布伦登·瓦格纳软件工程师旧金山282011-06-07$206,850
菲奥娜·格林首席运营官(COO)旧金山482010-03-11$850,000
Shou Itou区域营销东京202011-08-14$163,000
米歇尔·豪斯集成专家悉尼372011-06-02$95,400
苏琪·伯克斯开发人员伦敦532009-10-22$114,500
普雷斯科特·巴特利特技术作者伦敦272011-05-07$145,000
加文·科尔特斯团队领导旧金山222008-10-26$235,500
马尔蒂娜·麦考瑞售后支持爱丁堡462011-03-09$324,050
尤尼蒂·巴特勒营销设计师旧金山472009-12-09$85,675
霍华德·哈特菲尔德办公室经理旧金山512008-12-16$164,500
霍普·富恩特斯秘书旧金山412010-02-12$109,850
维维安·哈雷尔财务主管旧金山622009-02-14$452,500
蒂莫西·穆尼办公室经理伦敦372008-12-11$136,200
杰克逊·布拉德肖总监纽约652008-09-26$645,750
奥利维娅·梁支持工程师新加坡642011-02-03$234,500
布鲁诺·纳什软件工程师伦敦382011-05-03$163,500
樱花山本支持工程师东京372009-08-19$139,575
托尔·沃尔顿开发人员纽约612013-08-11$98,540
芬恩·卡马乔支持工程师旧金山472009-07-07$87,500
塞尔日·鲍德温数据协调员新加坡642012-04-09$138,575
塞纳达·弗兰克软件工程师纽约632010-01-04$125,250
佐里塔·塞拉诺软件工程师旧金山562012-06-01$115,000
珍妮弗·阿科斯塔初级 Javascript 开发人员爱丁堡432013-02-01$75,650
卡拉·史蒂文斯销售助理纽约462011-12-06$145,600
赫敏·巴特勒区域总监伦敦472011-03-21$356,250
莱尔·格里尔系统管理员伦敦212009-02-27$103,500
乔纳斯·亚历山大开发人员旧金山302010-07-14$86,500
沙德·德克尔区域总监爱丁堡512008-11-13$183,000
迈克尔·布鲁斯Javascript 开发人员新加坡292011-06-27$183,000
唐娜·斯奈德客户支持纽约272011-01-25$112,000
名称职位办公室年龄开始日期薪水

简易渲染器

我们从考虑最简单的情况入手 - 一个 HTML 源表,其中我们希望将第一列的字符数限制为不超过十个字符

$('#myTable').DataTable( {
    columnDefs: [ {
        targets: 0,
        render: function ( data, type, row ) {
            return data.substr( 0, 10 );
        }
    } ]
} );

上面的代码在 #myTable 元素上创建了一个 DataTable,columnDefs 用于仅为第一列分配列选项 (columnDefs.targets)。这里的重要部分是使用渲染函数 - columns.render。我们使用 substr() 将数据限制为仅 10 个字符。

此操作实施起来很简单,但有一些问题

  • 没有向最终用户指示数据已被截断
  • 搜索和排序数据也将被截断。

让我们依次解决 - 要向最终用户指示数据已被截断,我们使用省略号 ()。对字符串是否会被截断进行一次简单检查,这让我们能够决定是否应该添加省略号

render: function ( data, type, row ) {
    return data.length > 10 ?
        data.substr( 0, 10 ) +'…' :
        data;
}

为了解决第二个问题,我们可以使用传递给该函数的第二个参数,即 DataTables 的 正交数据类型 指示符 - 只有当它为 display 时,我们才希望显示省略号。现在我们有

render: function ( data, type, row ) {
    return type === 'display' && data.length > 10 ?
        data.substr( 0, 10 ) +'…' :
        data;
}

简单!

可重用渲染器

上方是几行简单的代码,但是如果您正在处理任何具有多个页面的网站,您将希望遵循良好的软件开发的 DRY(不要重复自己) 原则。

由于函数是 Javascript 中的一等元素,我们可以将渲染函数存储在变量中,然后根据需要将其分配给 columns.render 选项。DataTables 提供了一个对象,该对象可用作存储所有渲染器的公共位置:DataTable.render

如果我们继续我们的省略号示例,我们可能会拥有

DataTable.render.ellipsis = function () {
    return function ( data, type, row ) {
        return type === 'display' && data.length > 10 ?
            data.substr( 0, 10 ) +'…' :
            data;
    }
};

然后,要将其与 DataTables 一起使用,我们可以使用

$('#myTable').DataTable( {
    columnDefs: [ {
        targets: 0,
        render: DataTable.render.ellipsis()
    } ]
} );

然后该渲染函数可用于多个表格和多个页面 - 只需将渲染器代码保存到加载到您的页面上的文件中(例如 dataTables.plugins.js)。

配置选项

您会注意到我们定义的 ellipsis 是返回一个函数的函数 - 在这个简单的案例中没什么用,但对于更复杂的情况,保持着DRY(Don't Repeat Yourself)的概念,外函数可用来配置渲染器。以 ellipsis 示例为例,此功能可以定义要显示的字符数,例如

DataTable.render.ellipsis = function ( cutoff ) {
    return function ( data, type, row ) {
        return type === 'display' && data.length > cutoff ?
            data.substr( 0, cutoff ) +'…' :
            data;
    }
};

现在渲染器可用来定义如下所示的字符数

render: DataTable.render.ellipsis( 10 )
render: DataTable.render.ellipsis( 15 )
render: DataTable.render.ellipsis( 20 )
etc

即使在不需要配置选项的情况下,最好使用容器函数来保持一致性。大多数渲染函数确实需要某种配置,因此将所有渲染插件呈现为需要执行的函数会更简单。

省略号渲染插件

现在创建 DataTables 渲染插件的基础已经打牢,让我们构建省略号插件,用以下功能提供更大的实用性

  • 可变长度截断
  • 在工具提示中显示完整字符串
  • 选择拒绝在单词中间断开
  • 可以转义 HTML 以确保 XSS 安全性

以下函数提供了所有这些功能

DataTable.render.ellipsis = function ( cutoff, wordbreak, escapeHtml ) {
    var esc = function ( t ) {
        return t
            .replace( /&/g, '&' )
            .replace( /</g, '&lt;' )
            .replace( />/g, '&gt;' )
            .replace( /"/g, '&quot;' );
    };

    return function ( d, type, row ) {
        // Order, search and type get the original data
        if ( type !== 'display' ) {
            return d;
        }

        if ( typeof d !== 'number' && typeof d !== 'string' ) {
            return d;
        }

        d = d.toString(); // cast numbers

        if ( d.length < cutoff ) {
            return d;
        }

        var shortened = d.substr(0, cutoff-1);

        // Find the last white space character in the string
        if ( wordbreak ) {
            shortened = shortened.replace(/\s([^\s]*)$/, '');
        }

        // Protect against uncontrolled HTML input
        if ( escapeHtml ) {
            shortened = esc( shortened );
        }

        return '<span class="ellipsis" title="'+esc(d)+'">'+shortened+'&#8230;</span>';
    };
};

分解函数后,您将能够看到上面的是相当基础的 Javascript。只有 display 数据类型会截断其长度(如上所述),且仅处理字符串。字符串截断后,如果启用了“不换行”选项,正则表达式将用于截取最后一个单词。最后,返回一个 span,该 span 包含使用省略号缩短的字符串以及由 title 属性 提供的浏览器工具提示(如果您愿意,您也可以使用 Javascript 工具提示库)。

源代码

省略号数据渲染器在其 插件页面 上有详细说明,并且可以在 DataTables CDN 上获得(请注意,您可能希望将多个插件合并到单个文件中以提高加载效率)

JS

还可以在 GitHub 上找到源代码,并且始终欢迎您提出改进的拉取请求。

共享插件

如果您创建了一个想要与 DataTables 社区共享的渲染插件 - 首先 - 感谢您!请将拉取请求发送到 DataTables 插件存储库dataRender 目录。还应包括一个文档块来详细说明插件的作用及其使用方法(请参考现有插件获取模板)。

尽情享受!