需要完成的三个步骤如下:
- 创建用户界面
- 编写筛选函数
- 设置事件以在用户界面更改时重新绘制DataTable
首先创建用户界面。对我来说,捕捉用户意图最简单的方法是使用一个选择框,让用户选择他想要使用的比较运算符:
<select id="filter_comparator">
<option value="eq">=</option>
<option value="gt">>=</option>
<option value="lt"><=</option>
<option value="ne">!=</option>
</select>
<input type="text" id="filter_value">
现在,您需要将一个函数推入过滤器集合中。该函数简单地获取指定的比较运算符,并使用它将行数据与输入的值进行比较。如果某一行应该保持可见,则应返回 true;如果基于过滤条件该行应该消失,则应返回 false。如果用户未输入有效数字,则函数应返回 true。请将 column_index 更改为适当的值:
$.fn.dataTableExt.afnFiltering.push(
function( oSettings, aData, iDataIndex ) {
var column_index = 2;
var comparator = $('#filter_comparator').val();
var value = $('#filter_value').val();
if (value.length > 0 && !isNaN(parseInt(value, 10))) {
value = parseInt(value, 10);
var row_data = parseInt(aData[column_index], 10);
switch (comparator) {
case 'eq':
return row_data == value ? true : false;
break;
case 'gt':
return row_data >= value ? true : false;
break;
case 'lt':
return row_data <= value ? true : false;
break;
case 'ne':
return row_data != value ? true : false;
break;
}
}
return true;
}
);
最后,在创建DataTable的时候,设置UI元素上的事件,以便在用户进行更改时重新绘制表格:
$(document).ready(function() {
var oTable = $('#example').dataTable();
$('#filter_comparator').change( function() { oTable.fnDraw(); } );
$('#filter_value').keyup( function() { oTable.fnDraw(); } );
});
另一方面,如果您希望用户输入比较运算符而不是选择它,则需要解析用户的输入。如果您有一个简单的文本框:
<input type="text" id="filter">
然后,您可以像这样在筛选函数中解析输入:
$.fn.dataTableExt.afnFiltering.push(
function( oSettings, aData, iDataIndex ) {
var filter = $('#filter').val().replace(/\s*/g, '');
var row_data = aData[3] == "-" ? 0 : aData[3]*1;
if (filter.match(/^<\d+$/)) {
var num = filter.match(/\d+/);
return row_data < num ? true : false;
}
else if (filter.match(/^>\d+$/)) {
var num = filter.match(/\d+/);
return row_data > num ? true : false;
}
else if (filter.match(/^<>\d+$/)) {
var num = filter.match(/\d+/);
return row_data != num ? true : false;
}
else if (filter.match(/^\d+$/)) {
var num = filter.match(/\d+/);
return row_data == num ? true : false;
}
else if (filter.match(/^\d+-\d+$/)) {
var num1 = filter.match(/^\d+/);
var num2 = filter.match(/\d+$/);
return (row_data >= num1 && row_data <= num2) ? true : false;
}
return true;
}
);
并且文档已准备好:
$(document).ready(function() {
var oTable = $('#example').dataTable();
$('#filter').keyup( function() { oTable.fnDraw(); } );
});
这个过滤器只能用于正整数。支持小数和负数需要更多的工作。你也可以扩展该函数以添加 >= 和 <= 支持,或者根据用户期望将它们作为 > 和 < 的默认行为。
我还把事件监听器再次附加到了一个自由浮动的输入文本框上。我已经尝试了使用基本 DataTable,它可以工作。您需要将该行为附加到列底部的那些文本框上,但我不确定您是如何放置它们的 - 我从未在 DataTable 中这样做过。