它没有很好的记录。在(子)版本之间,它的工作方式似乎不同,或者根本不工作。我认为 dataTables 旨在自动检测 HTML 列,但由于某种原因,大多数时候,它不会。最安全的方法是创建自己的搜索过滤器:
$.fn.dataTableExt.ofnSearch['html-input'] = function(value) {
return $(value).val();
};
这将在 <input> 上返回 33,值为 33,在 <select> 上返回 Tokyo,其中选择了东京。然后将所需的列定义为 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 有一个用于cells、rows 和pages 的内置函数,称为invalidate,它强制dataTables 重置所选项目的缓存。
但是,在处理<input> 时也存在问题,即编辑值不是更改value 属性本身。因此,即使您调用invalidate(),您仍将最终过滤旧的“硬编码”值。
但是我已经找到了解决方案。强制使用<input> 的当前值(新值)更改<input> 的value 属性,然后然后 调用invalidate:
$("#example td input").on('change', function() {
var $td = $(this).closest('td');
$td.find('input').attr('value', this.value);
table.cell($td).invalidate();
});
对于文本区域,请改用text():
$("#example td textarea").on('change', function() {
var $td = $(this).closest('td');
$td.find('textarea').text(this.value);
table.cell($td).invalidate();
});
在处理<select> 时也是如此。您需要更新相关<option> 的selected 属性,然后还需要更新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();
});
forked fiddle -> http://jsfiddle.net/s2gbafuz/ 尝试更改输入和/或下拉列表的内容,然后搜索新值...