我正在使用带有ajax源数据的jQuery DataTables。
我必须每30秒保持数据最新而不刷新页面,ajax.reload()
是我需要的功能。
我将ajax.reload()
放在setInterval
函数中。
一切正常(如果你留在第1页)。但是当你在第2页或第3页上冲浪时,当setInterval
被触发时,它会让你回到第1页。
所以...... 在此网址查看文档:{{3}}
如果我将“false”作为第二个参数传递它保持当前的分页位置,并且在重新加载时不重置分页。宾果!
有效!但是......我有一个新问题,试图整天解决,现在我被卡住了。这就是我发布这个问题的原因。
它保持分页,但如果你不在第1页,那么每次ajax.reload()
被触发时,页面都会滚动(直接跳转)到底部。
它非常不友好,不可读,无法使用。 我不知道为什么页面滚动到最后底部。
我发布了一个链接到我在页面上使用的简单数据表js。 http://datatables.net/reference/api/ajax.reload()
var url = table.data('url');
var filterType = table.data('filtertype');
var options = {
"ajax": {
"url": url,
"type": "GET",
"data": function (d) {
d.contact_type = filterType
// this variable will set by server when page load. It should be "lead", "prospect", "client". Leave empty to get all.
}
},
"columns": [
{"data": "html_is_company"},
{"data": "name"},
{"data": "html_type_label"},
{"data": "created"},
{"data": "last_update"},
{"data": "html_actions"},
{"data": "tsu"},
{"data": "business_name"}
],
"bLengthChange": false,
"pageLength": 20,
"lengthMenu": [[10, 25, 50, 100, -1], [10, 25, 50, 100, "All"]],
"columnDefs": [
{
"targets": [ 7 ],
"visible": false,
"searchable": true,
},
{
"targets": [ 6, 7 ],
"searchable": false,
"visible": false
},
{
"targets": [0, 5],
"searchable": false,
"orderable": false
},
{
"targets": [ 4 ],
"render": function (data, type, row) {
return moment(data, IN_DATE_TIME_FORMAT, 'it').fromNow();//.format(DATE_TIME_FORMAT);////;
}
},
{
// Sort column 4 (formatted date) by column 6 (hidden seconds)
"orderData":[ 6 ],
"targets": [ 4 ]
}],
"order": [[4, "desc"]],
"search": "_INPUT_",
"language": {
"sSearchPlaceholder": "Cerca...",
"paginate": {
"previous": '<i class="icon wb-chevron-left-mini"></i>',
"next": '<i class="icon wb-chevron-right-mini"></i>'
},
//"url": "//cdn.datatables.net/plug-ins/1.10.9/i18n/Italian.json"
}
};
var datatable = table.DataTable(options);
this.setDataTable(datatable);
setInterval(function(){
datatable.ajax.reload(null, false);
}, 5000);
答案 0 :(得分:1)
我稍微重写了他的代码:
$(window).scroll(function(){
$(".paginate_button > a").blur();
});
页面滚动后,分页栏上的按钮将“未聚焦”。 所以你的最终代码应如下所示:
var url = table.data('url');
var filterType = table.data('filtertype');
var options = {
"ajax": {
"url": url,
"type": "GET",
"data": function (d) {
d.contact_type = filterType
// this variable will set by server when page load. It should be "lead", "prospect", "client". Leave empty to get all.
}
},
"columns": [
{"data": "html_is_company"},
{"data": "name"},
{"data": "html_type_label"},
{"data": "created"},
{"data": "last_update"},
{"data": "html_actions"},
{"data": "tsu"},
{"data": "business_name"}
],
"bLengthChange": false,
"pageLength": 20,
"lengthMenu": [[10, 25, 50, 100, -1], [10, 25, 50, 100, "All"]],
"columnDefs": [
{
"targets": [ 7 ],
"visible": false,
"searchable": true,
},
{
"targets": [ 6, 7 ],
"searchable": false,
"visible": false
},
{
"targets": [0, 5],
"searchable": false,
"orderable": false
},
{
"targets": [ 4 ],
"render": function (data, type, row) {
return moment(data, IN_DATE_TIME_FORMAT, 'it').fromNow();//.format(DATE_TIME_FORMAT);////;
}
},
{
// Sort column 4 (formatted date) by column 6 (hidden seconds)
"orderData":[ 6 ],
"targets": [ 4 ]
}],
"order": [[4, "desc"]],
"search": "_INPUT_",
"language": {
"sSearchPlaceholder": "Cerca...",
"paginate": {
"previous": '<i class="icon wb-chevron-left-mini"></i>',
"next": '<i class="icon wb-chevron-right-mini"></i>'
},
//"url": "//cdn.datatables.net/plug-ins/1.10.9/i18n/Italian.json"
}
};
var datatable = table.DataTable(options);
this.setDataTable(datatable);
$(window).scroll(function(){
$(".paginate_button > a").blur();
});
setInterval(function(){
datatable.ajax.reload(null, false);
}, 5000);
答案 1 :(得分:1)
我的解决方案:
"fnDrawCallback": function(data) {
$(".paginate_button > a").on("focus", function() {
$(this).blur();
});
}
答案 2 :(得分:0)
我找到了一个适合我的解决方案。
问题在于对DataTables分页链接的“关注”。
当用户点击链接页面时,它会将焦点设置在该链接上,当ajax.reload()
被触发时,浏览器会将焦点元素放在哪里。我的表是页面的最后一个元素,因此页面滚动到底部。
点击第2页链接后,当我点击页面的其他区域时,我得到了它。 “跳跃”问题消失了。
因此,当DataTables完成初始化并且blur()
完成时,我解决了触发ajax.reload()
的问题(感谢第一个允许您定义函数的参数)。
在DataTables选项中,我添加了这个:
"initComplete": function(settings, json) {
$(".paginate_button > a").on("focus", function(){
$(this).blur();
});
},
然后,在setInterval
:
setInterval(function(){
datatable.ajax.reload(function(){
$(".paginate_button > a").on("focus", function(){
$(this).blur();
});
}, false);
}, 30000);
不知道这是否是“最佳解决方案”......但它有效,可以帮助某人。