如何重新加载/刷新jQuery dataTable?


88

我正在尝试实现一些功能,即单击屏幕上的按钮将导致我的jQuery dataTable刷新(因为自创建dataTable以来服务器端数据源可能已更改)。

这是我所拥有的:

$(document).ready(function() {
    $("#my-button").click(function() {
        $("#my-datatable").dataTable().fnReloadAjax();
    });
});

但是当我运行它时,它什么也没做。单击按钮时刷新dataTable的正确方法是什么?提前致谢!


您收到任何Javascript错误吗?使用Firebug / Chrome检查器检查,也许添加更多代码(即表和按钮代码)
Geert 2012年

Answers:


31

您可以尝试以下方法:

function InitOverviewDataTable() {
    oOverviewTable = $('#HelpdeskOverview').dataTable({
        "bPaginate": true,
        "bJQueryUI": true, // ThemeRoller-stöd
        "bLengthChange": false,
        "bFilter": false,
        "bSort": false,
        "bInfo": true,
        "bAutoWidth": true,
        "bProcessing": true,
        "iDisplayLength": 10,
        "sAjaxSource": '/Helpdesk/ActiveCases/noacceptancetest'
    });
}

function RefreshTable(tableId, urlData) {
    $.getJSON(urlData, null, function(json) {
        table = $(tableId).dataTable();
        oSettings = table.fnSettings();

        table.fnClearTable(this);

        for (var i = 0; i < json.aaData.length; i++) {
            table.oApi._fnAddData(oSettings, json.aaData[i]);
        }

        oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
        table.fnDraw();
    });
}
// Edited by Prasad
function AutoReload() {
    RefreshTable('#HelpdeskOverview', '/Helpdesk/ActiveCases/noacceptancetest');

    setTimeout(function() {
        AutoReload();
    }, 30000);
}

$(document).ready(function() {
    InitOverviewDataTable();
    setTimeout(function() {
        AutoReload();
    }, 30000);
});

http://www.meadow.se/wordpress/?p=536


这很棒!但是我发现您正在调用_fnAddData,这仅是私有函数。这有风险吗?假设将来功能签名可能会更改。
罗伊·灵

134

借助DataTables 1.10.0版,它是内置且简单的:

var table = $('#example').DataTable();
table.ajax.reload();

要不就

$('#example').DataTable().ajax.reload();

http://datatables.net/reference/api/ajax.reload()


20
要小心$('#example').DataTable(),不要使用$('#example').dataTable()
塞尔吉(Sergiu)2015年

完成此操作后,我将无法访问数据表的内容。然后说我只有2个TR(一个带有标题,一个只有1个单元格显示没有数据)。我必须先重新绘制吗?
乔恩·科特

乔恩·科特(Jon Koeter):在没有看到代码的情况下不可能回答您的问题。请与您的代码一起发布为新问题,以重现该问题。
atmelino

这可能会引发错误cannot reinitialise datatable jquery。发生这种情况是因为table一次又一次初始化了表的每个条目。为避免这种情况,请确保table 只初始化一次。
Shubham A.

4
要保留分页信息,请使用。table.ajax.reload(空,假的),这里的官方文件中提到datatables.net/reference/api/ajax.reload()
SRINIVAS Rathikrindi

27

您可以使用DataTable的扩展API通过以下方式重新加载它: ajax.reload()

如果您将数据表声明为DataTable()(新版本),则需要:

var oTable = $('#filtertable_data').DataTable( );
// to reload
oTable.ajax.reload();

如果您将数据表声明为dataTable()(旧版本),则需要:

var oTable = $('#filtertable_data').dataTable( );
// to reload
oTable.api().ajax.reload();

27

首先销毁数据表,然后绘制数据表。

$('#table1').DataTable().destroy();
$('#table1').find('tbody').append("<tr><td><value1></td><td><value1></td></tr>");
$('#table1').DataTable().draw();

为什么事情如此复杂?
Akmal)

谢谢。这是实际可行的唯一答案。
塞林

24

我有同样的问题,这就是我解决的方法:

首先使用您选择的方法获取数据,我在提交将对表进行更改的结果后使用ajax。然后清除并添加新数据:

var refreshedDataFromTheServer = getDataFromServer();

var myTable = $('#tableId').DataTable();
myTable.clear().rows.add(refreshedDataFromTheServer).draw();

这是来源:https : //datatables.net/reference/api/clear()


1
最后一个非ajax的答案!
Fabio Venturi牧师

是fnServerData:getDataFromServer吗?
李德礼18'Mar

使用简单的JS对象作为数据对我来说唯一有效的答案。谢谢!
Banzy

13
var ref = $('#example').DataTable();
ref.ajax.reload();

如果要向DataTables 1.10添加重新加载/刷新按钮,请使用drawCallback

参见下面的示例(我将DataTables与Bootstrap CSS结合使用)

var ref= $('#hldy_tbl').DataTable({
        "responsive": true,
        "processing":true,
        "serverSide":true,
        "ajax":{
            "url":"get_hotels.php",
            "type":"POST"
        },
        "drawCallback": function( settings ) {
            $('<li><a onclick="refresh_tab()" class="fa fa-refresh"></a></li>').prependTo('div.dataTables_paginate ul.pagination');
        }
    });

function refresh_tab(){
    ref.ajax.reload();
}


10

我建议使用以下代码。

table.ajax.reload(null, false); 

这样做的原因是,用户分页不会在重新加载时重置。
例:

<button id='refresh'> Refresh </button>

<script>
    $(document).ready(function() {

        table = $("#my-datatable").DataTable();
        $("#refresh").on("click", function () { 
         table.ajax.reload(null, false); 
        });

   });
</script>

有关此细节,请参见此处


正确的那个。对于刷新表后不更改页码
曼森·帕特尔

等于table.ajax.reload();
CodeToLife

是的,它的确与上述相同,但是您遗漏了要点。table.ajax.reload(); 会刷新并重置表格(如果您在第5页上,然后刷新它)。它将带您返回首页。
Ad Kahn

3

这就是我的方法...可能不是最好的方法,但是它绝对简单(IMHO),不需要任何其他插件。

的HTML

<div id="my-datatable"></div>

jQuery的

function LoadData() {
    var myDataTable = $("#my-datatable").html("<table><thead></thead><tbody></tbody></table>");
    $("table",myDataTable).dataTable({...});
}
$(document).ready(function() {
    $("#my-button").click(LoadData);
    LoadData();
});

注意:在我使用jQuery dataTable的情况下,有时如果没有的<thead></thead><tbody></tbody>话它是行不通的。但是,如果没有它,您也许可以渡过难关。我还没有弄清楚什么是必需的,什么不是必需的。


3

尝试先销毁数据表,然后重新设置它,例如

var table;
$(document).ready(function() {
    table = $("#my-datatable").datatable()
    $("#my-button").click(function() {
        table.fnDestroy();
        table = $("#my-datatable").dataTable();
    });
});


3

当您要刷新数据表时,请使用以下代码:

 $("#my-button").click(function() {
    $('#my-datatable').DataTable().clear().draw();
 });

2

好吧,您没有显示加载脚本的方式/位置,但是要使用插件API函数,必须在加载DataTables库之后但在初始化DataTable之前将其包含在页面中。

像这样

<script type="text/javascript" src="jquery.dataTables.js"></script>
<script type="text/javascript" src="dataTables.fnReloadAjax.js"></script>

1

Allan Jardine的DataTables是一个非常强大且精巧的jQuery插件,用于显示表格数据。它具有许多功能,可以满足您的大部分需求。但是,令人感到奇怪的一件事是如何以一种简单的方式刷新内容,因此,作为我自己的参考,也可能是对其他人的好处,这里是一种这样做的完整示例:

的HTML

<table id="HelpdeskOverview">
  <thead>
    <tr>
      <th>Ärende</th>
      <th>Rapporterad</th>
      <th>Syst/Utr/Appl</th>
      <th>Prio</th>
      <th>Rubrik</th>
      <th>Status</th>
      <th>Ägare</th>
    </tr>
  </thead>
  <tbody>
  </tbody>
</table>

Java脚本

function InitOverviewDataTable()
{
  oOverviewTable =$('#HelpdeskOverview').dataTable(
  {
    "bPaginate": true,
    "bJQueryUI": true,  // ThemeRoller-stöd
    "bLengthChange": false,
    "bFilter": false,
    "bSort": false,
    "bInfo": true,
    "bAutoWidth": true,
    "bProcessing": true,
    "iDisplayLength": 10,
    "sAjaxSource": '/Helpdesk/ActiveCases/noacceptancetest'
  });
}

function RefreshTable(tableId, urlData)
{
  $.getJSON(urlData, null, function( json )
  {
    table = $(tableId).dataTable();
    oSettings = table.fnSettings();

    table.fnClearTable(this);

    for (var i=0; i<json.aaData.length; i++)
    {
      table.oApi._fnAddData(oSettings, json.aaData[i]);
    }

    oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
    table.fnDraw();
  });
}

function AutoReload()
{
  RefreshTable('#HelpdeskOverview', '/Helpdesk/ActiveCases/noacceptancetest');

  setTimeout(function(){AutoReload();}, 30000);
}

$(document).ready(function () {
  InitOverviewDataTable();
  setTimeout(function(){AutoReload();}, 30000);
});

资源



0
        if(data.length==0){
            alert("empty");
              $('#MembershipTable > tbody').empty();
            // $('#MembershipTable').dataTable().fnDestroy();
                    $('#MembershipTable_info').empty(); 
                    $("#MembershipTable_length").empty();
                    $("#MembershipTable_paginate").empty();

             html="<tr><td colspan='20'><b>No data available in Table</b> </td></tr>";
           $("#MembershipTable").append(html);
        }

        else{
             $('#MembershipTable').dataTable().fnDestroy();
            $('#MembershipTable > tbody').empty();

         for(var i=0; i<data.length; i++){
            //

.......}


0

根据DataTable的帮助,我可以为我的表做准备。

我想将多个数据库添加到我的DataTable中。

例如:data_1.json> 2500条记录-data_2.json> 300条记录-data_3.json> 10265条记录

var table;
var isTableCreated= false;

if (isTableCreated==true) {
    table.destroy();
    $('#Table').empty(); // empty in case the columns change
}
else
    i++;

table = $('#Table').DataTable({
        "processing": true,
        "serverSide": true,
        "ordering": false,
        "searching": false,
        "ajax": {
            "url": 'url',
            "type": "POST",
            "draw": 1,
            "data": function (data) {
                data.pageNumber = (data.start / data.length);
            },
            "dataFilter": function (data) {
                return JSON.stringify(data);
            },
            "dataSrc": function (data) {
                if (data.length > 0) {
                    data.recordsTotal = data[0].result_count;
                    data.recordsFiltered = data[0].result_count;
                    return data;
                }
                else
                    return "";
            },

            "error": function (xhr, error, thrown) {
                alert(thrown.message)
            }
        },
        columns: [
           { data: 'column_1' },
           { data: 'column_2' },
           { data: 'column_3' },
           { data: 'column_4' },
           { data: 'column_5' }
        ]
    });

0

如果使用datatable v1.10.12,则只需调用.draw()method并传递所需的绘制类型,即full-resetpage则您将使用新数据重新绘制dt

let dt = $("#my-datatable").datatable()

//做一些动作

dt.draw('full-reset')

有关更多信息,请查看数据表文档


0

我做了一些与此相关的事情...下面是一个示例javascript,它可以满足您的需求。在此处有一个演示:http : //codersfolder.com/2016/07/crud-with-php-mysqli-bootstrap-datatables-jquery-plugin/

//global the manage member table 
var manageMemberTable;

function updateMember(id = null) {
    if(id) {
        // click on update button
        $("#updatebutton").unbind('click').bind('click', function() {
            $.ajax({
                url: 'webdesign_action/update.php',
                type: 'post',
                data: {member_id : id},
                dataType: 'json',
                success:function(response) {
                    if(response.success == true) {                      
                        $(".removeMessages").html('<div class="alert alert-success alert-dismissible" role="alert">'+
                              '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>'+
                              '<strong> <span class="glyphicon glyphicon-ok-sign"></span> </strong>'+response.messages+
                            '</div>');

                        // refresh the table

                        manageMemberTable.ajax.reload();

                        // close the modal
                        $("#updateModal").modal('hide');

                    } else {
                        $(".removeMessages").html('<div class="alert alert-warning alert-dismissible" role="alert">'+
                              '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>'+
                              '<strong> <span class="glyphicon glyphicon-exclamation-sign"></span> </strong>'+response.messages+
                            '</div>');

                        // refresh the table                        
                        manageMemberTable.ajax.reload();

                        // close the modal
                        $("#updateModal").modal('hide');
                    }
                }
            });
        }); // click remove btn
    } else {
        alert('Error: Refresh the page again');
    }
}



-2
    function autoRefresh(){
        table.ajax.reload(null,false); 
        alert('Refresh');//for test, uncomment
    }

    setInterval('autoRefresh()', 5000); 

-6

用init重新初始化数据表,并将检索结果写为true ..done..so非常简单

例如。

TableAjax.init();
retrieve: true,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.