我想知道是否可以通过其中一个数据属性而不是其单元格的内容来过滤jQuery DataTable。要将过滤器动态应用于列,可以使用此调用:
$table.fnFilter('^(Some value)$', columnIndex, true, false);
这将使用正则表达式默认过滤单元格的确切内容。但是,假设我的单元格是这样构造的:
<td data-label="Active"><i class="fa fa-check fa-lg"></i></td>
或者
<td data-label="Active">Active<br /><span class="mute">Some text</span></td>
我希望能够通过属性data-label
的确切内容而不是单元格内容来使用DataTable过滤器。是否在表init上设置列时定义搜索类型?或者有没有办法定义按属性而不是内容过滤?
答案 0 :(得分:10)
如果要按代码触发过滤器,请创建自定义过滤器:
$.fn.dataTable.ext.search.push(
function(settings, data, dataIndex) {
var dataLabel = table
.row(dataIndex) //get the row to evaluate
.nodes() //extract the HTML - node() does not support to$
.to$() //get as jQuery object
.find('td[data-label]') //find column with data-label
.data('label'); //get the value of data-label
return dataLabel == 'Active';
}
);
演示 - &gt;的 http://jsfiddle.net/x83zm7qq/ 强>
如果您只是希望能够在用户在搜索框中输入时使用data-label
作为过滤目标,则可以将data-label
重命名为data-search
或data-filter
:
<td data-search="Active"><i class="fa fa-check fa-lg"></i></td>
dataTables将其称为orthogonal data。
答案 1 :(得分:2)
您还可以通过将其存储在initComplete回调的“settings”中,然后从公共搜索处理程序下的实例的“settings”对象中调用来定义每表自定义回调。这是代码:
$(function(){
// the common/unified plugin (for all datatables)
$.fn.DataTable.ext.search.push(
function(settings, columnsOutput, dataIndex, data, outputIndex) {
// this = ext.search array (all custom search functions (including this one)
if (settings._myFilter){
return settings._myFilter.call(settings, {
data: data,
dataIndex: dataIndex,
outputIndex: outputIndex,
columnsOutput: columnsOutput,
settings: settings
});
} else {
return true;
}
}
);
// exact datatable initialization
var dTable = $("#example").DataTable({
// some sample data
data: [{name: "John"}, {name: "Jack"}, {name: "Andy"}],
columns: [{data: 'name'}],
// setting our custom function under the initComplete callback
initComplete: function(settings, json) {
settings._myFilter = function(info){
if ($('#jFilter').prop('checked')){
return (info.data.name.toLowerCase().indexOf('j') >= 0);
} else {
return true;
}
}
}
});
$('#jFilter').on('click', function(){
dTable.draw(); // redraw will apply all the filters
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://cdn.datatables.net/1.10.0/js/jquery.dataTables.js"></script>
<link href="https://cdn.datatables.net/1.10.0/css/jquery.dataTables.css" rel="stylesheet"/>
<h2>Click checkbox below to filter by data using a callback</h2>
<label><input id="jFilter" type="checkbox"> J only</label>
<table id="example">
</table>
答案 2 :(得分:0)
var detailDT = $("#staging-detail-table").DataTable();
var selectedHeaderId = $(...).click...
$.fn.dataTable.ext.search.push(
function (settings, searchData, dataIndex, rowData) {
// This is a global call-back, so check what table is getting sent thru
// for different search logic.
// This is triggered any time any table is re-drawn.
// Detail grid
if (settings.nTable.id == "staging-detail-table") {
if (!selectedHeaderId) {
// no header was selected. show everything
return true;
} else {
var $trDetailDT = $(detailDT.row(dataIndex).node());
var headerId = $trDetailDT.data("headerid");
return selectedHeaderId == headerId;
}
}
return true; // it wasnot the staging data table. Don't filter/limit.
}
)
detailDT
是对我要过滤的数据表的引用。
selectedHeaderId
是我要过滤的值-在调用detailDT.draw()触发搜索之前,该值是由其他jQuery用户交互等设置的。
关键部分正在调用$(detailDT.row(dataIndex).node());
,它使用当前行的回调参数dataIndex。这基本上将行放入普通的jQuery对象中,以获取数据属性等。