如何进行单独的列搜索延迟。因此它会在几秒钟后自动搜索列输入,而不是按键。我通过互联网阅读。这是stackoverflow jQuery DataTable column filters with delay search until 3+ characters or enter key上的重复问题,但没有人为它发布解决方案。
jQuery.fn.dataTableExt.oApi.fnSetFilteringDelay = function ( oSettings, iDelay ) {
var _that = this;
if ( iDelay === undefined ) {
iDelay = 500;
}
this.each( function ( i ) {
$.fn.dataTableExt.iApiIndex = i;
var
$this = this,
oTimerId = null,
sPreviousSearch = null,
anControl = $( 'input', _that.fnSettings().aanFeatures.f );
anControl.unbind( 'keyup search input' ).bind( 'keyup', function() {
var $$this = $this;
if (sPreviousSearch === null || sPreviousSearch != anControl.val()) {
window.clearTimeout(oTimerId);
sPreviousSearch = anControl.val();
oTimerId = window.setTimeout(function() {
$.fn.dataTableExt.iApiIndex = i;
_that.fnFilter( anControl.val() );
}, iDelay);
}
});
return this;
} );
return this;
};
以上代码用于全局搜索延迟。有人可以提供延迟单个列过滤器字段搜索的解决方案吗?
答案 0 :(得分:1)
我找不到一个简单的解决方案,并且不想使用插件,所以我用几行JavaScript解决了这个问题。我基本上首先延迟AJAX调用,然后在调用它之前检查是否在延迟期间按下了任何键。如果是,我不执行AJAX调用。如果不是,则执行AJAX调用。这是我的代码剪辑:
var start = new Date();
table.columns().every( function () {
var first = this;
$( 'input', this.header() ).on( 'keyup change', function () {
start=new Date();
var second = this;
if ( first.search() !== this.value ) {
setTimeout(function(){if ((new Date() - start)>250) {first.search( second.value ).draw();}}, 250);
}
} );
} );
答案 1 :(得分:0)
数据表的yadcf插件提供了开箱即用+它有 10种不同的过滤器类型
其名为filter_delay
,您可以在行动yadcf - Server side source example
p.s我是yadcf
的作者答案 2 :(得分:0)
如果您使用的是DataTables 1.10.3+,则可以使用docs中列出的节流工具功能:
https://datatables.net/reference/api/%24.fn.dataTable.util.throttle()
我有2-5列的表格,其中标题搜索输入需要进行限制,因此我一直在使用:
const searchColumns = [1,2,3,4];
dataTable.columns(searchColumns).every(function (i) {
let throttledSearch = $.fn.dataTable.util.throttle(
function () {
dataTable
.column(i)
.search(this.value)
.draw();
},
2000
);
$('input', dataTable.column(i).header()).on('keyup change clear', throttledSearch);
});
这将在上次更改后2秒钟内阻止ajax触发。论坛中还有Allan的一个示例,在此处提供了一个很好的示例: