我不得不问:是什么让您相信只有在显示子行时才能在动态注入的子行内容中进行搜索?搜索应该如何column()
覆盖其他行的内容?
话虽如此,当然有一种解决方法。不要一遍又一遍地创建子行内容,而是将其保存在数组中:
var details = [];
现在,当您初始化表格时,您也会初始化子行内容:
...
columns: [{
className: 'details-control',
orderable: false,
data: null,
defaultContent: '',
render: function(data, type, row, meta) {
details[meta.row] = format(data);
}
},
...
在 format() 函数中,为 Extension Number 字段添加一个类以便于访问:
'<td class="extNo">' + d.extn + '</td>' +
当您显示子行时,插入预呈现的内容details[]
而不是调用format()
:
if (row.child.isShown()) {
row.child.hide();
tr.removeClass('shown');
} else {
row.child(details[row.index()]).show();
tr.addClass('shown');
}
创建一个过滤器,该过滤器仅返回具有包含details[]
某个 Extension Number 的子行的行:
function filterByDetailsExtNo(extNo) {
$.fn.dataTable.ext.search.push(
function(settings, data, dataIndex) {
return $(details[dataIndex]).find('.extNo').text() == extNo;
}
)
table.draw();
$.fn.dataTable.ext.search.pop();
}
使用该自定义过滤器而不是column()
输入处理程序中的搜索:
table.columns().every( function () {
$( 'input', this.footer() ).on( 'keyup change', function () {
filterByDetailsExtNo(this.value);
});
});
分叉的小提琴-> https://jsfiddle.net/7o67vhrz/
更新。要将上述过滤器应用于一般搜索框:
$('.dataTables_filter input')
.off()
.on('keyup', function() {
filterByDetailsExtNo(this.value);
});
又一个分叉的小提琴-> https://jsfiddle.net/ds3qp41g/
最后一个例子。结合详细信息搜索和“本机”搜索
function filterByDetailsExtNoAndInput(term) {
$.fn.dataTable.ext.search.push(
function(settings, data, dataIndex) {
if ($(details[dataIndex]).find('.extNo').text() == term) return true;
for (var i=0;i<data.length;i++) {
if (data[i].toLowerCase().indexOf(term.toLowerCase())>=0) {
return true
}
}
return false;
}
)
table.draw();
$.fn.dataTable.ext.search.pop();
}
小提琴-> https://jsfiddle.net/h2u4fowj/