2014 年 10 月 22 日星期三

搜索结果高亮

DataTables 内置的搜索功能允许终端用户非常快速地搜索表中包含的数据,过滤结果直至仅剩他们正在查找的相关结果。但是,用户仍需要扫描结果以找到他们搜索到的特定数据。通常,这对于用户而言并非艰巨的过程,但对于复杂的表,这可能会花费他们几秒钟时间,而我们可以通过在结果集中突出显示搜索词来节省几秒钟时间!

Bartek Szopka 编写了一个 用于突出显示任何指定 jQuery 节点集合中文本的 jQuery 插件,这非常适合我们的高亮需求。这篇博文详细说明了如何将高亮插件与 DataTables 轻松集成,并最终为 DataTables 创建一个可重用的功能插件,该插件可在任何表上轻松使用。

使用此功能插件的示例表如下所示,已经输入了一个初始搜索词以立即显示结果,并且在您更改搜索词时,突出显示将自动更新。

姓名职位办公室年龄开始日期工资
虎妮克松系统架构师爱丁堡612011-04-25$320,800
加勒特·温特斯会计东京632011-07-25$170,750
阿什顿·考克斯初级技术作者旧金山662009-01-12$86,000
西德里克·凯利高级 Javascript 开发人员爱丁堡222012-03-29$433,060
爱丽佐藤会计东京332008-11-28$162,700
布里埃尔·威廉姆森集成专家纽约612012-12-02$372,000
赫罗德·钱德勒销售助理旧金山592012-08-06$137,500
罗娜·戴维森集成专家东京552010-10-14$327,900
科琳·赫斯特Javascript 开发人员旧金山392009-09-15$205,500
索尼娅·弗罗斯特软件工程师爱丁堡232008-12-13$103,600
吉娜·盖恩斯办公室经理伦敦302008-12-19$90,560
昆恩·弗林支持主管爱丁堡222013-03-03$342,000
查德·马歇尔地区总监旧金山362008-10-16$470,600
海莉·肯尼迪高级营销设计师伦敦432012-12-18$313,500
塔蒂安娜·菲茨帕特里克地区总监伦敦192010-03-17$385,750
迈克尔·席尔瓦营销设计师伦敦662012-11-27$198,500
保罗·伯德首席财务官 (CFO)纽约642010-06-09$725,000
格洛丽亚·利特尔系统管理员纽约592009-04-10$237,500
布莱德利·格里尔软件工程师伦敦412012-10-13$132,000
戴·里奥斯人事主管爱丁堡352012-09-26$217,500
珍妮特·考德威尔开发主管纽约302011-09-03$345,000
尤里·贝瑞首席营销官 (CMO)纽约402009-06-25$675,000
凯撒·万斯售前支持纽约212011-12-12$106,450
多丽丝·怀尔德销售助理悉尼232010-09-20$85,600
安吉丽卡·拉莫斯首席执行官 (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
秀一藤区域营销东京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
姓名职位办公室年龄开始日期工资

简单的集成

jQuery Highlight 插件的基本操作非常简单 - 有两种方法

  • $().highlight() - 突出显示搜索词
  • $().unhighlight() - 去除现有的高亮

仅需一对 DataTables API 方法和一个事件来创建几乎完全的集成

  • draw - 当表格被重新绘制时将触发此事件,我们便可以执行所需的突出显示操作
  • search() - 获取搜索词
  • table().body() - 获得表格的 tbody 元素。

利用它,我们可以构建

$(document).ready( function () {
    var table = $('#myTable').DataTable();

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

        body.unhighlight();
        body.highlight( table.search() );   
    } );
} );

在上述代码中

  • 第 2 行:创建 DataTable
  • 第 4 行:监听 draw 事件
  • 第 5 行:获取对表格 tbody 节点的引用,因为应该仅突出此元素中的节点。
  • 第 7 行:去除由前次搜索创建的任何现有的高亮
  • 第 8 行:使用 search() 获取搜索词并对其进行高亮。

为了完整性,还应添加对 column-visibility 事件的监听器,因为切换列可见性不需要触发绘制,而我们需要高亮应用于变得可见的任何列。

最后,如果用户输入诸如“records”之类的搜索词并且未找到任何行,则不应高亮显示 DataTables 的“未找到任何记录”消息!这可以使用 rows() 方法来实现,并使用 selector-modifier 修饰器来仅将结果集中的过滤行包括在内

body.unhighlight();

if ( table.rows( { filter: 'applied' } ).data().length ) {
    body.highlight( table.search() );
}

特征插件

虽然在这一点上完全有可能会停止,但我们软件工程师们讨厌需要复制和粘贴代码才能重新使用一项功能(这是有道理的,因为它在未来会成为维护工作的噩梦!),所以现在让我们将上述代码包装到一个可重用的 DataTables 特征插件中。

为此可以使用另一个 DataTables 事件:init 事件,该事件在创建新 DataTable 时触发。此事件通过 DOM 冒泡,因此作用于 document 的监听器将看到文档中的每个新创建的 DataTable,即

$(document).on( 'init.dt', function (e, settings, json) {
    ...
} );

下一步是检查是否应该在表格上启用行高亮,如果应该,则运行上面开发的高亮代码。

有三种方法可以激活此插件

  • 将类 searchHighlight 添加到 HTML 表格
  • 将 DataTables 初始化中的 searchHighlight 参数设置为真
  • searchHighlight 参数在 DataTables 默认设置中设置为真(从而导致所有表格都具有此功能),即 $.fn.dataTable.defaults.searchHighlight = true

为了达到此目的,可以将上面 init 代码扩展开来

$(document).on( 'init.dt.dth', function (e, settings, json) {
    var table = new $.fn.dataTable.Api( settings );
    var body = $( table.table().body() );

    if (
        $( table.table().node() ).hasClass( 'searchHighlight' ) || // table has class
        settings.oInit.searchHighlight                          || // option specified
        $.fn.dataTable.defaults.searchHighlight                    // default set
    ) {
       ...
    }
} );
  • 第 1 行:侦听 DataTable 的初始化
  • 第 2 行:从传入事件的 DataTable.Settings 对象获取一个 DataTables API 实例
  • 第 3 行:获取表格的主体标签,因为我们将在其中使用它
  • 第 6 行:检查表格是否具有 searchHighlight
  • 第 7 行:检查初始化选项是否具有 searchHighlight(稍后将会为此提供公用 API)
  • 第 8 行:检查默认值中是否设置了 searchHighlight
  • 第 10 行:运行上述高亮代码

初始化

最简单的方法是,若要激活表格中搜索结果的高亮显示,现在只需在初始化表格时指定 searchHighlight 词语即可

$(document).ready( function () {
    $('#example').DataTable( {
        searchHighlight: true
    } );
} );

其他方法是提供一个默认值或使用如上定义的类名,效果也很不错。

发布的代码

此处开发的功能插件代码可在 DataTables CDN 上立即使用

JS
CSS

此外,请注意,此插件依赖于 jQuery Highlight 插件

JS

它还托管在 GitHub 上的 DataTables 插件代码库 中。十分欢迎提交分叉、拉取请求等!