【问题标题】:DataTables from AJAX Call来自 AJAX 调用的数据表
【发布时间】:2021-01-22 01:08:39
【问题描述】:

我可以用静态数据很好地填充数据表。但是,当我从 AJAX 检索数据并希望将其实现到表中时,我似乎无法弄清楚。

首先是我的 JSFiddle,它可以完美地处理静态数据,https://jsfiddle.net/L0287qeu/

这是我当前的 HTML 表代码,在调用检索/加载我想要填充的数据后,它可以完美运行。

    <html>
<head>
<link href="https://nightly.datatables.net/css/jquery.dataTables.css" rel="stylesheet" type="text/css" />
<title><strong>X, Y, & Z Deliverables</strong></title>
</head>
<body>
    <div class="container">
      <h4 class="text-center">X, Y, & Z Deliverables</h4>
        <table class = "display">
            <thead>
              <tr>
                <th>Program</th>
                <th>Deliverable</th>
                <th>To</th>
                <th>Date</th>
                <th>Approved</th>
                <th>Notes</th>
              </tr>
            </thead>
            <tbody>
            </tbody>
        </table>    
    </div>
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="https://nightly.datatables.net/js/jquery.dataTables.js"></script>
<script>
function loadData(source, url) {
  return fetch(url, { headers: { accept: "application/json; odata=verbose" } }) // make request
    .then((r) => {
      if (!r.ok) throw new Error("Failed: " + url);  // Check for errors
      return r.json();  // parse JSON
    })
    .then((data) => data.d.results) // unwrap to get results array
    .then((results) => {
      results.forEach((r) => (r.source = source)); // add source to each item
      return results;
    });
}

window.addEventListener("load", function () {
  Promise.all([
    loadData("XDeliverables", "/_api/web/lists/getbytitle('XDeliverables')/items?$select=Program,To,Date,Approved,Notes"),
    loadData("YDeliverables", "/_api/web/lists/getbytitle('YDeliverables')/items?$select=Program,To,Date,Approved,Notes"),
    loadData("ZDeliverables", "/_api/web/lists/getbytitle('ZDeliverables')/items?$select=Program,To,Date,Approved,Notes"),
  ])
    .then(([r1, r2, r3]) => {
      const objItems = r1.concat(r2,r3);
      var tableContent =
        '<table id="deliverablesTable" style="width:100%" border="1 px"><thead><tr><td><strong>Program</strong></td>' +
        "<td><strong>To</strong></td>" +
        "<td><strong>Date Submitted</strong></td>" +
        "<td><strong>Approved</strong></td>" +
        "<td><strong>Notes</strong></td>" +
        "</tr></thead><tbody>";

      for (var i = 0; i < objItems.length; i++) {
        tableContent += "<tr>";
        tableContent += "<td>" + objItems[i].Program + "</td>";
        tableContent += "<td>" + objItems[i].To + "</td>";
        tableContent += "<td>" + objItems[i].Date + "</td>";
        tableContent += "<td>" + objItems[i].Approved + "</td>";
        tableContent += "<td>" + objItems[i].Notes + "</td>";
        tableContent += "</tr>";
      }
      $(tableContent).appendTo("#deliverables").DataTable();
    })
    .catch((err) => {
      alert("Error: " + err);
      console.error(err);
    });
});
</script>
</body>
</html>

【问题讨论】:

  • 无法发现任何可怕的错误,尽管您可能希望使用&lt;/tbody&gt;&lt;/table&gt; 确保 HTML 格式正确。您还需要在附表上调用.DataTable(),例如$(tableContent).appendTo("#deliverables").DataTable(...);
  • 查看我最近的编辑。 Sharepoint 是说 $ 未定义,错误窗口后出现的只是标题

标签: javascript jquery ajax datatable promise


【解决方案1】:

你几乎拥有它。要像这样呈现数据表,必须先由浏览器呈现内容。

您的工作 JSFiddle 和您的非工作代码之间的区别在于,在非工作代码中,id 为 deliverablesTable 的表是字符串 tableContent 的一部分,并且在您调用 .DataTable() 时未呈现而在您使用静态数据的工作示例中,表 example 已在 HTML 部分中定义,因此已呈现。

请在下面找到代码示例。出于演示目的,我用静态数据替换了您的 Ajax 调用,但是一旦您迁移了最重要的更改(这样注释),它的工作方式相同

<html>
<head>
<link href="https://nightly.datatables.net/css/jquery.dataTables.css" rel="stylesheet" type="text/css" />
<title><strong>X, DAR-Q, & Z Deliverables</strong></title>
</head>
<body>
    <div class="container">
      <h4 class="text-center">X, DAR-Q, & Z Deliverables</h4>
        <table class = "display">
            <thead>
              <tr>
                <th>Program</th>
                <th>Deliverable</th>
                <th>To</th>
                <th>Date</th>
                <th>Approved</th>
                <th>Notes</th>
              </tr>
            </thead>
            <tbody>
            </tbody>
        </table>
    </div>
    <!-- RESERVE DIV FOR HOLDING THE DATA TABLE -->
    <div id="data" class="container">
    </div>
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="https://nightly.datatables.net/js/jquery.dataTables.js"></script>
<script>

      const objItems = [
        {
          Program: 1,
          To: 2,
          Date: 3,
          Approved: 3,
          Notes: 5
        }

      ];
      var tableContent =
        '<table id="deliverablesTable" style="width:100%" border="1 px"><thead><tr><td><strong>Program</strong></td>' +
        "<td><strong>To</strong></td>" +
        "<td><strong>Date Submitted</strong></td>" +
        "<td><strong>Approved</strong></td>" +
        "<td><strong>Notes</strong></td>" +
        "</tr></thead><tbody>";

      for (var i = 0; i < objItems.length; i++) {
        tableContent += "<tr>";
        tableContent += "<td>" + objItems[i].Program + "</td>";
        tableContent += "<td>" + objItems[i].To + "</td>";
        tableContent += "<td>" + objItems[i].Date + "</td>";
        tableContent += "<td>" + objItems[i].Approved + "</td>";
        tableContent += "<td>" + objItems[i].Notes + "</td>";
        tableContent += "</tr>";
      }
      // Insert tableContent into the div to make sure it gets rendered
      $("#data").html(tableContent);
      // Make it a datatable now
      $("#deliverablesTable").DataTable();
</script>
</body>
</html>

【讨论】:

  • 是的,用户使用相同的代码并发现它可以作为答案添加
【解决方案2】:

我使用了上面示例中的代码,请在下面找到代码示例。我在测试时 Ajax 链接正在工作。这是一个在线模拟链接。如果该 ajax 链接不起作用,您可以创建自己的模拟请求并对其进行测试。我从上面的解决方案测试它工作正常。

<html>
<head>
<link href="https://nightly.datatables.net/css/jquery.dataTables.css" rel="stylesheet" type="text/css" />
<title><strong>X, DAR-Q, & Z Deliverables</strong></title>
</head>
<body>
    <div class="container">
      <h4 class="text-center">X, DAR-Q, & Z Deliverables</h4>
        <table class = "display">
            <thead>
              <tr>
                <th>Program</th>
                <th>Deliverable</th>
                <th>To</th>
                <th>Date</th>
                <th>Approved</th>
                <th>Notes</th>
              </tr>
            </thead>
            <tbody>
            </tbody>
        </table>
    </div>
    <!-- RESERVE DIV FOR HOLDING THE DATA TABLE -->
    <div id="data" class="container">
    </div>
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="https://nightly.datatables.net/js/jquery.dataTables.js"></script>
<script>
 var objItems=[];
            $( document ).ready(function() {
       $.ajax({
            type: "GET",
            dataType: "json",
            url: "https://run.mocky.io/v3/1ee61ecd-d1ab-4ad8-8976-f94bcd296264",
            complete: function(data) {
              objItems=data.responseJSON.data;
              renderTable();
            }
        });
    });
        
function renderTable(){
     var tableContent =
        '<table id="deliverablesTable" style="width:100%" border="1 px"><thead><tr><td><strong>Program</strong></td>' +
        "<td><strong>To</strong></td>" +
        "<td><strong>Date Submitted</strong></td>" +
        "<td><strong>Approved</strong></td>" +
        "<td><strong>Notes</strong></td>" +
        "</tr></thead><tbody>";

      for (var i = 0; i < objItems.length; i++) {
        tableContent += "<tr>";
        tableContent += "<td>" + objItems[i].Program + "</td>";
        tableContent += "<td>" + objItems[i].To + "</td>";
        tableContent += "<td>" + objItems[i].Date + "</td>";
        tableContent += "<td>" + objItems[i].Approved + "</td>";
        tableContent += "<td>" + objItems[i].Notes + "</td>";
        tableContent += "</tr>";
      }
      // Insert tableContent into the div to make sure it gets rendered
      $("#data").html(tableContent);
      // Make it a datatable now
      $("#deliverablesTable").DataTable();
}
      
      
</script>
</body>
</html>

【讨论】:

    【解决方案3】:

    这是一个使用 Ajax 填充数据表的示例。在 HTML 中,表格定义为:

    <table ID=tblClients><thead><tr><th>Name</th><th>Intake Date</th><th>Counselor</th></tr></thead></table>
    

    然后在 document.ready 函数中这段代码初始化数据表:

    dtClients = $('#tblClients').DataTable({
      ajax: 'nwcs.php?proc=get_clients',
      dom: 'iftp',
      paging: true,
      pageLength: 15,
      pagingType : 'full_numbers',
      select: {style: 'single'}
    });
    

    从 PHP 返回的数据是 JSON,DataTables 需要它。它看起来像这样:

    {"data":[["Laura Jessup","02/22/2020","Michelle Putnam"],["Jackie McCord","02/24/2020","Paula Curran"],["Gary Shafer","02/25/2020","Paula Curran"]]}
    

    【讨论】:

    • 对于 ajax 请求,看起来您是从 PHP 文件中提取的,而我的不是从文件中提取的。这就是我迷路的地方
    • 我不明白您是如何获取数据的。此外,您没有说明尝试时会发生什么,是否有错误消息等。更多信息可能会有所帮助。您可能应该在 Datatables 论坛上发布此内容。
    • 我正在从一个共享点列表/多个中提取。如何获取 php?
    • 抱歉,我对sharepoint一无所知,因此无法为您提供帮助。您需要以某种方式让它以 Datatables 预期的格式返回 JSON。
    【解决方案4】:

    您的代码没有任何问题,只需检查 ajax 调用是否返回数据。 https://nightly.datatables.net/_api/web/lists/getbytitle('XDeliverables')/items?$select=Program,To,Date,Approved,Notes 在浏览器中放置一个完全限定的 url 并检查获取请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2013-09-30
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 2014-04-24
      相关资源
      最近更新 更多