【问题标题】:Bootstrap Datatable is no longer functioning after loading content via Ajax通过 Ajax 加载内容后,Bootstrap 数据表不再起作用
【发布时间】:2018-08-03 11:37:45
【问题描述】:

在有人说它是一个重复的问题之前,我知道它是。我只是无法找到任何与我相似的脚本,而且由于我对 JavaScript 和 JQuery(习惯于 php)完全陌生,我真的不知道自己在做什么。

我的数据表在使用 php 加载数据时工作得很好(在页面加载之前),但现在它在页面加载之后加载,表格已经失去了所有的过滤和分页。

这是我的表格的加载方式。

<div class="table-responsive">
    <table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
        <thead>
            <tr>
                <?php echo $tableheader;?>
            </tr>
        </thead>
        <tfoot>
            <tr>
                <?php echo $tableheader;?>
            </tr>
        </tfoot>
        <tbody id="data"> <!--data will be inputed here-->

        </tbody>
    </table>
</div>

这是获取数据并将其放入表中的脚本。

<script>
    //call ajax
    var ajax = new XMLHttpRequest ();
    var method = "GET";
    var url = "data_assets.php";
    var asynchronous = true;

    setInterval(function(){
        ajax.open(method, url, asynchronous);
        //sending ajax request
        ajax.send();
    }, 250)

    //receiving response from data_assets.php
    ajax.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200) {
            //convert JSON back to array
            var data = JSON.parse(this.responseText);
            //console.log(data); //for debugging

            //html value for <tbody>
            var html ="";

            //looping through the data
            for (var a = 0; a < data.length; a++) {
                var asset_number = data[a].asset_number;
                var id = data[a].id;
                var room = data[a].room;
                var _location = data[a]._location;
                var sku = data[a].sku;
                var qty = data[a].qty;
                var _value = data[a]._value;
                var date = data[a].date;
                var po_number = data[a].po_number;
                var purchaced_from = data[a].purchaced_from;
                var notes = data[a].notes;
                var total = data[a].total;

                //storing in html
                html += "<tr>";
                    html += "<td style='vertical-align: middle;'>" + asset_number + "</td>";
                    html += "<td style='vertical-align: middle;'>" + id + "</td>";
                    html += "<td style='vertical-align: middle;'>" + room + "</td>";
                    html += "<td style='vertical-align: middle;'>" + _location + "</td>";
                    html += "<td style='vertical-align: middle;'>" + sku + "</td>";
                    html += "<td style='vertical-align: middle;'>" + qty + "</td>";
                    html += "<td style='vertical-align: middle;'>" + _value + "</td>";
                    html += "<td style='vertical-align: middle;'>" + total + "</td>";
                    html += "<td style='text-align: center; vertical-align: middle;'>" + date + "</td>";
                    html += "<td style='vertical-align: middle;'>" + po_number + "</td>";
                    html += "<td style='vertical-align: middle;'>" + purchaced_from + "</td>";
                    html += "<td style='vertical-align: middle;'>" + notes + "</td>";
                    html += "<td style='text-align: center; vertical-align: middle;'>";
                        html += "<a href='?id=" + id + "&room=" + room + "&asset=" + asset_number + "&location=" + _location + "&sku=" + sku + "&qty=" + qty + "&value=" + _value + "&date=" + date + "&po=" + po_number + "&where=" + purchaced_from + "&notes=" + notes + "#editModal' class=''><i class='far fa-edit fa-lg'></i></a>";
                    html += "</td>";
                    html += "<td style='text-align: center; vertical-align: middle;'>";
                        html += "<a href='?id=" + id + "&room=" + room + "&asset=" + asset_number + "&location=" + _location + "&sku=" + sku + "&qty=" + qty + "&value=" + _value + "&date=" + date + "&po=" + po_number + "&where=" + purchaced_from + "&notes=" + notes + "#duplicateModal' class=''><i class='far fa-clone fa-lg'></i></a>";
                    html += "</td>";
                html += "</tr>";
            }

            //replacing the <tbody> 
            document.getElementById("data").innerHTML = html;
        }
    }
</script>

如果有人能告诉我如何在我的示例中使用它,我将不胜感激,我真的很想像这样在这个网站上加载我的所有表格,所以我不需要刷新保存数据(这会刷新每 250 毫秒,因此表中的数据始终与数据库保持同步)。

更新:

没错,我进行了 250 毫秒的刷新,现在桌子可以正常工作了!现在有人可以帮助我解决下一个问题吗?当新数据输入数据库时​​,如何在不刷新整个页面的情况下刷新表

【问题讨论】:

  • 更新了很多。像 1200 在 5 分钟内
  • 如果你取消注释这一行//console.log(data); //for debugging 它会输出什么?你能用这些信息更新答案吗?
  • 它在检查元素控制台中显示数组中的数据。它只包含表中的数据
  • @LegenJerry 有这么多刷新有问题吗?我查看了我的电脑上的负载,它似乎没有做任何重大的事情,服务器很强大。它只运行一个 mysql 查询,所以我认为这不是一个主要问题。是否有另一种方法让它在创建新数据库条目时显示新的数据库条目?还是只喜欢我是怎么做到的?
  • @CarlPiper 查看我的答案,我更新了它。根据 DataTables API,有一种刷新表格的方法。我提供的小提琴需要修改以适合您的应用,但如果它回答了您的问题,您能否将其标记为已接受?

标签: javascript jquery ajax datatables bootstrap-4


【解决方案1】:

我建议用 HTML 或 PHP(不是 Javascript)创建表结构。然后用ajax将数据加载到表中。除非创建元素的事件绑定到已经存在的元素,例如 bodydocument 或表格的其他父元素,否则这些 DOM 元素不容易被 javascript 使用。

更新:

我个人对 DataTables 插件没有太多经验。因此,插件将根据从 ajax 返回的 data 对象或您指定的属性自动创建您的 DOM 元素(表结构)。 DataTables 确实使用 jQuery 的 ajax() 方法进行 ajax 调用,但是您不应该覆盖 success 回调。在按照文档中的说明进行 ajax 调用时,有一种正确的方法可以使用他们的 API。还有一种适当的方法可以按时间间隔重新加载数据以刷新表。

请查看此fiddle

当然,必须更新 ajax url, method, data 属性以适合您的应用程序(这是在 jsFiddle 上模拟 ajax 调用的唯一方法。请注意,您必须具有正确格式化的 JSON。

【讨论】:

  • 对不起,我不确定我明白你的意思。我以为我是在 php 中制作表结构,只使用 javascript 添加 。当我说我是 javascript 新手时,我真的非常陌生。我了解为什么以及何时使用它,并且大致可以使用它,但我自己无法编写代码,目前只能使用教程。当然我真的很想知道这就是为什么我开始在我的项目中更多地暗示它。
  • 好的。我正在做一个小提琴,看看能不能帮到你
  • 非常感谢!
  • 我通过演示更新了我的答案。检查控制台以查看数据是否应继续重新加载。你应该在你的服务器上通过在你的应用程序运行时更新数据库中的行来验证它是否真的有效。
【解决方案2】:

您是否尝试在 Datatables 上显式设置 pagelength 属性?

$('#datatable').dataTable( {
  "pageLength": 50
} );

【讨论】:

  • 表格和数据加载得很好,只是它破坏了 Datatables 分页之类的东西。表格就在那里,里面填满了数据
  • 您的意思是通过分页来自定义限制Datatable中显示的行数?
  • 在我用 php 加载数据之前,表格被限制为每页 10 个项目,您可以单击页面。但现在所有数据都显示在页面上
猜你喜欢
相关资源
最近更新 更多
热门标签