字母输入搜索 - 第一部分
搜索是 DataTables 的核心功能 - 实际上,它是 2007 年首批在代码中实现的功能,因为它是 DataTables 设计目标的关键:让用户快速轻松地在复杂数据集内查找信息。自这项最初的工作以来,DataTables 的搜索选项已经取得了长足的发展,并通过 search()
方法和其他方法提供了一系列选项。
然而,经常需要根据您自己的需求自定义 DataTables 的搜索选项。最简单的可能就是提供一个能与您网站的总体 UX 完美契合的自定义输入,或者使用一个复杂的搜索算法。
为了满足这一需求,DataTables 提供了一个自定义搜索 API,可用于执行任何您想要的搜索逻辑。在这三部分系列文章中,我将介绍此 API,展示如何使用它并提供与您的具体需求匹配的自定义搜索函数。作为工作示例,本系列文章将会开发一个字母搜索栏,为您展示 DataTables 插件系统工作的各个方面。
- 第一部分(这篇博文):介绍自定义搜索并展示一个可点击的字母筛选器
- 第二部分:添加用户信息,在筛选器中显示每个选项的搜索结果数
- 第三部分:为 DataTables 创建一个功能插件,将先前开发的代码合并进去,以实现灵活的重用。
字母搜索
我们从最后开始,看看我们在本博文中要创建什么 - 一系列位于 DataTable 上方的字母,点击字母后,将激活一个表格搜索,查找第一列中以点击的字母开头的字符串
姓名 | 职位 | 办公室 | 年龄 | 开始日期 | 工资 |
---|---|---|---|---|---|
Tiger Nixon | 系统架构师 | 爱丁堡 | 61 | 2011-04-25 | $320,800 |
Garrett Winters | 会计 | 东京 | 63 | 2011-07-25 | $170,750 |
Ashton Cox | 初级技术撰稿人 | 旧金山 | 66 | 2009-01-12 | $86,000 |
Cedric Kelly | 高级 JavaScript 开发人员 | 爱丁堡 | 22 | 2012-03-29 | $433,060 |
Airi Satou | 会计 | 东京 | 33 | 2008-11-28 | $162,700 |
Brielle Williamson | 集成专家 | 纽约 | 61 | 2012-12-02 | $372,000 |
Herrod Chandler | 销售助理 | 旧金山 | 59 | 2012-08-06 | $137,500 |
Rhona Davidson | 集成专家 | 东京 | 55 | 2010-10-14 | $327,900 |
Colleen Hurst | JavaScript 开发人员 | 旧金山 | 39 | 2009-09-15 | $205,500 |
Sonya Frost | 软件工程师 | 爱丁堡 | 23 | 2008-12-13 | $103,600 |
Jena Gaines | 办公室经理 | 伦敦 | 30 | 2008-12-19 | $90,560 |
Quinn Flynn | 支持主管 | 爱丁堡 | 22 | 2013-03-03 | $342,000 |
Charde Marshall | 区域总监 | 旧金山 | 36 | 2008-10-16 | $470,600 |
Haley Kennedy | 高级营销设计师 | 伦敦 | 43 | 2012-12-18 | $313,500 |
Tatyana Fitzpatrick | 区域总监 | 伦敦 | 19 | 2010-03-17 | $385,750 |
Michael Silva | 营销设计师 | 伦敦 | 66 | 2012-11-27 | $198,500 |
Paul Byrd | 首席财务官 (CFO) | 纽约 | 64 | 2010-06-09 | $725,000 |
Gloria Little | 系统管理员 | 纽约 | 59 | 2009-04-10 | $237,500 |
Bradley Greer | 软件工程师 | 伦敦 | 41 | 2012-10-13 | $132,000 |
Dai Rios | 人事主管 | 爱丁堡 | 35 | 2012-09-26 | $217,500 |
Jenette Caldwell | 开发主管 | 纽约 | 30 | 2011-09-03 | $345,000 |
Yuri Berry | 首席营销官 (CMO) | 纽约 | 40 | 2009-06-25 | $675,000 |
Caesar Vance | 售前支持 | 纽约 | 21 | 2011-12-12 | $106,450 |
Doris Wilder | 销售助理 | 悉尼 | 23 | 2010-09-20 | $85,600 |
Angelica Ramos | 首席执行官 (CEO) | 伦敦 | 47 | 2009-10-09 | $1,200,000 |
Gavin Joyce | 开发者 | 爱丁堡 | 42 | 2010-12-22 | $92,575 |
Jennifer Chang | 区域总监 | 新加坡 | 28 | 2010-11-14 | $357,650 |
Brenden Wagner | 软件工程师 | 旧金山 | 28 | 2011-06-07 | $206,850 |
Fiona Green | 首席运营官 (COO) | 旧金山 | 48 | 2010-03-11 | $850,000 |
Shou Itou | 地区营销 | 东京 | 20 | 2011-08-14 | $163,000 |
Michelle House | 集成专家 | 悉尼 | 37 | 2011-06-02 | $95,400 |
Suki Burks | 开发者 | 伦敦 | 53 | 2009-10-22 | $114,500 |
Prescott Bartlett | 技术作者 | 伦敦 | 27 | 2011-05-07 | $145,000 |
Gavin Cortez | 团队领导 | 旧金山 | 22 | 2008-10-26 | $235,500 |
Martena Mccray | 售后支持 | 爱丁堡 | 46 | 2011-03-09 | $324,050 |
Unity Butler | 营销设计师 | 旧金山 | 47 | 2009-12-09 | $85,675 |
Howard Hatfield | 办公室经理 | 旧金山 | 51 | 2008-12-16 | $164,500 |
Hope Fuentes | 秘书 | 旧金山 | 41 | 2010-02-12 | $109,850 |
Vivian Harrell | 财务总监 | 旧金山 | 62 | 2009-02-14 | $452,500 |
Timothy Mooney | 办公室经理 | 伦敦 | 37 | 2008-12-11 | $136,200 |
Jackson Bradshaw | 董事 | 纽约 | 65 | 2008-09-26 | $645,750 |
Olivia Liang | 支持工程师 | 新加坡 | 64 | 2011-02-03 | $234,500 |
Bruno Nash | 软件工程师 | 伦敦 | 38 | 2011-05-03 | $163,500 |
Sakura Yamamoto | 支持工程师 | 东京 | 37 | 2009-08-19 | $139,575 |
Thor Walton | 开发者 | 纽约 | 61 | 2013-08-11 | $98,540 |
Finn Camacho | 支持工程师 | 旧金山 | 47 | 2009-07-07 | $87,500 |
Serge Baldwin | 数据协调员 | 新加坡 | 64 | 2012-04-09 | $138,575 |
Zenaida Frank | 软件工程师 | 纽约 | 63 | 2010-01-04 | $125,250 |
Zorita Serrano | 软件工程师 | 旧金山 | 56 | 2012-06-01 | $115,000 |
Jennifer Acosta | 初级 JavaScript 开发人员 | 爱丁堡 | 43 | 2013-02-01 | $75,650 |
Cara Stevens | 销售助理 | 纽约 | 46 | 2011-12-06 | $145,600 |
Hermione Butler | 区域总监 | 伦敦 | 47 | 2011-03-21 | $356,250 |
Lael Greer | 系统管理员 | 伦敦 | 21 | 2009-02-27 | $103,500 |
Jonas Alexander | 开发者 | 旧金山 | 30 | 2010-07-14 | $86,500 |
Shad Decker | 区域总监 | 爱丁堡 | 51 | 2008-11-13 | $183,000 |
Michael Bruce | JavaScript 开发人员 | 新加坡 | 29 | 2011-06-27 | $183,000 |
Donna Snider | 客户支持 | 纽约 | 27 | 2011-01-25 | $112,000 |
姓名 | 职位 | 办公室 | 年龄 | 开始日期 | 工资 |
搜索插件
DataTables 的搜索插件附加到 $.fn.dataTable.ext.search
数组。只要向此数组 push()
一个函数后,DataTables 便会在执行搜索操作时,执行此函数作用于表中的每一行。然后此函数应返回 true
或 false
,告知 DataTables 该行是否应包含在结果集(true
)中或不包含(false
)。
对于字母搜索,我们只需检查数据第一列的第一个字母(可通过函数中传入的第二个参数与 charAt()
方法结合获得),并与存储了用户已对之激活搜索的字符(称为 _alphabetSearch
)的变量进行对比。
这样,我们便得到了此简单的小函数
var _alphabetSearch;
$.fn.dataTable.ext.search.push( function ( settings, searchData ) {
if ( ! _alphabetSearch ) { // No search term - all results shown
return true;
}
if ( searchData[0].charAt(0) === _alphabetSearch ) {
return true;
}
return false;
} );
如果您有兴趣详细了解此 API,DataTables 手册 中包含有关 搜索插件 API 的详细说明。
界面
我们要在此展示给最终用户的界面实际上非常简单。只是包含 A-Z 的字母列表。这里没有特定的 DataTables 代码,只有简单的 jQuery DOM 处理来创建一个包含一系列 span
的 div
元素,每个字母一个,因此我不会详细介绍此代码,不过有几点值得注意
- 包括一个 无 选项来清除搜索词,允许显示表中的所有条目。
- 使用
String.formCharCode
来将 ASCII 代码转换为字母。 - 使用数据属性
letter
来存储要用于搜索词的字母。
// DataTables initialisation
var table = $('#example').DataTable();
var alphabet = $('<div class="alphabet"/>').append( 'Search: ' );
$('<span class="clear active"/>')
.data( 'letter', '' )
.html( 'None' )
.appendTo( alphabet );
for ( var i=0 ; i<26 ; i++ ) {
var letter = String.fromCharCode( 65 + i );
$('<span/>')
.data( 'letter', letter )
.html( letter )
.appendTo( alphabet );
}
alphabet.insertBefore( table.table().container() );
上述情况是对仅使用拉丁字母的情况的一个简单案例,不过它很容易扩展为使用其他任何字母中的字符,或包括数字。
行为
为了激活搜索,我们会使用 标准 jQuery $().on()
点击控制器来侦听点击事件。侦听器将为该元素读取 letter
数据属性,并将其分配给我们上方搜索功能中定义的 _alphabetSearch
变量,然后使用 draw()
重绘表格,并让新的搜索项得到考虑。它还执行一点类操作,以直观显示哪个元素是活动搜索项。
alphabet.on( 'click', 'span', function () {
alphabet.find( '.active' ).removeClass( 'active' );
$(this).addClass( 'active' );
_alphabetSearch = $(this).data('letter');
table.draw();
} );
样式
为我们的字母列表,我们有一个非常简单的 DOM 结构,它包含一个带有 span
元素的 div
。为了清晰显示,我们可以使用 CSS display: table
属性 将字母显示为灵活的宽度,明了地布置成网格。还添加了一些其他样式,只是给最终用户一些视觉反馈。
div.alphabet {
display: table;
width: 100%;
margin-bottom: 1em;
}
div.alphabet span {
display: table-cell;
color: #3174c7;
cursor: pointer;
text-align: center;
width: 3.5%
}
div.alphabet span:hover {
text-decoration: underline;
}
div.alphabet span.active {
color: black;
}
完整代码
上方所示的 Javascript 已经完整,但是如果你想要一个即复制即粘贴的解决方案,而不是要组装代码,则下方所示的是用于此例子的完整代码块
var _alphabetSearch = '';
$.fn.dataTable.ext.search.push( function ( settings, searchData ) {
if ( ! _alphabetSearch ) {
return true;
}
if ( searchData[0].charAt(0) === _alphabetSearch ) {
return true;
}
return false;
} );
$(document).ready(function() {
var table = $('#example').DataTable();
var alphabet = $('<div class="alphabet"/>').append( 'Search: ' );
$('<span class="clear active"/>')
.data( 'letter', '' )
.html( 'None' )
.appendTo( alphabet );
for ( var i=0 ; i<26 ; i++ ) {
var letter = String.fromCharCode( 65 + i );
$('<span/>')
.data( 'letter', letter )
.html( letter )
.appendTo( alphabet );
}
alphabet.insertBefore( table.table().container() );
alphabet.on( 'click', 'span', function () {
alphabet.find( '.active' ).removeClass( 'active' );
$(this).addClass( 'active' );
_alphabetSearch = $(this).data('letter');
table.draw();
} );
} );