它没有很好的记录。它似乎在(子)版本之间工作不同,或者根本不工作。我认为 dataTables 旨在自动检测 HTML 列,但出于某种原因,大多数情况下,它不会。最安全的方法是创建自己的搜索过滤器:
$.fn.dataTableExt.ofnSearch['html-input'] = function(value) {
return $(value).val();
};
这将返回值为 33 的33 on <input>,以及选择Tokyo 的 Tokyo on <select>。然后将所需的列定义为类型html-input;
var table = $("#example").DataTable({
columnDefs: [
{ "type": "html-input", "targets": [1, 2, 3] }
]
});
参见基于http://datatables.net/examples/api/form.html -> http://jsfiddle.net/a3o3yqkw/ 的演示
关于实时数据:问题是,基于类型的过滤器只被调用一次。dataTables 然后缓存返回的值,因此它不需要一遍又一遍地“计算”所有值。幸运的是,dataTables 1.10.x有一个内置函数 for cells,rows并pages调用invalidate它强制 dataTables 重置所选项目的缓存。
但是,在处理<input>'s 时也存在问题,即编辑值 not 正在更改value属性本身。因此,即使您调用invalidate(),您最终仍会过滤旧的“硬编码”值。
但我已经找到了解决方案。强制使用的当前值(新值)更改<input>的value属性<input>,然后调用invalidate:
$("#example td input").on('change', function() {
var $td = $(this).closest('td');
$td.find('input').attr('value', this.value);
table.cell($td).invalidate();
});
对于 textareas 使用text():
$("#example td textarea").on('change', function() {
var $td = $(this).closest('td');
$td.find('textarea').text(this.value);
table.cell($td).invalidate();
});
处理<select>'s时也是如此。您将需要更新selected相关的属性<option>,然后更新invalidate()单元格:
$("#example td select").on('change', function() {
var $td = $(this).closest('td');
var value = this.value;
$td.find('option').each(function(i, o) {
$(o).removeAttr('selected');
if ($(o).val() == value) $(o).attr('selected', true);
})
table.cell($td).invalidate();
});
分叉小提琴 -> http://jsfiddle.net/s2gbafuz/尝试更改输入和/或下拉列表的内容,并搜索新值...