You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为AJAX动态生成的表格配置DataTables插件?

解决DataTables与AJAX动态数据整合的问题

嘿,我来帮你搞定这个DataTables和AJAX动态数据整合的问题!你现在遇到的麻烦很常见——页面加载时初始化DataTables的时候,表格tbody是空的,之后通过AJAX把HTML行插入进去,但DataTables并没有“感知”到这些新数据,所以分页、排序这些核心功能就失效了。咱们换一种更规范的方式来实现,保证DataTables能完美工作。

第一步:重构后端接口,返回JSON格式数据

首先把你的filter.php改成返回JSON(而不是拼接HTML),这样DataTables能直接解析数据,同时还要修复SQL注入风险,替换已经废弃的mysql_*函数(这里用mysqli为例):

<?php
// 替换成你的数据库连接信息
$conn = mysqli_connect("localhost", "你的用户名", "你的密码", "你的数据库名");
if (!$conn) {
    die("数据库连接失败: " . mysqli_connect_error());
}

$response = ['data' => []];

if(isset($_GET['name'])){
    // 使用预处理语句彻底避免SQL注入
    $searchName = "%".$_GET['name']."%";
    $stmt = mysqli_prepare($conn, "SELECT id, card_name, phone1, region, category_cod, material_cod, trade_type, web FROM pdbp INNER JOIN bp ON(pdbp.bp_id=bp.id) WHERE bp.status= 1 AND card_name LIKE ?");
    mysqli_stmt_bind_param($stmt, "s", $searchName);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    
    $counter = 0;
    while($data = mysqli_fetch_assoc($result)){
        $counter++;
        // 按表格列顺序整理每一行数据
        $row = [
            $counter,
            $data['card_name'],
            $data['phone1'],
            $data['region'],
            $data['category_cod'],
            $data['material_cod'],
            $data['trade_type'],
            $data['web']
        ];
        array_push($response['data'], $row);
    }
    mysqli_stmt_close($stmt);
}

mysqli_close($conn);
// 设置响应头为JSON格式
header('Content-Type: application/json');
echo json_encode($response);
?>

第二步:修改前端代码,让DataTables直接管理AJAX数据

现在不需要自己写keyup的AJAX逻辑了,让DataTables自己处理数据加载和搜索,它会自动维护分页、排序等功能:

<!-- 注意thead列要和后端返回的数据顺序完全对应 -->
<table id="datatables" border="1">
    <thead>
        <tr>
            <th>Sr No.</th>
            <th>Name</th>
            <th>Telephone</th>
            <th>Region</th>
            <th>Categories</th>
            <th>Material</th>
            <th>Type</th>
            <th>Website</th>
        </tr>
    </thead>
    <tbody></tbody>
</table>

<link rel="stylesheet" type="text/css" href="css/jquery.dataTables.css">
<script type="text/javascript" language="javascript" src="js/jquery.js"></script>
<script type="text/javascript" language="javascript" src="js/jquery.dataTables.js"></script>

<script>
$(document).ready(function () {
    // 初始化DataTables,配置AJAX数据源
    var dataTable = $('#datatables').DataTable({
        "processing": true, // 显示加载提示
        "serverSide": false, // 如果数据量超1万条,改成true,后端需处理分页/排序参数
        "ajax": {
            "url": "filter.php",
            "type": "GET",
            "data": function(d){
                // 把搜索框的值传给后端
                d.name = $("#cmp_name").val();
            }
        },
        // 对应后端返回的每一列数据
        "columns": [
            { "data": 0 },
            { "data": 1 },
            { "data": 2 },
            { "data": 3 },
            { "data": 4 },
            { "data": 5 },
            { "data": 6 },
            { "data": 7 }
        ]
    });

    // 监听搜索框输入,触发DataTables重新加载数据
    $("#cmp_name").keyup(function(){
        dataTable.ajax.reload();
    });
});
</script>

为什么这样改能解决问题?

  • 原来直接操作DOM插入HTML的方式,DataTables无法跟踪新数据,导致分页、排序功能失效。现在让DataTables自己管理数据,它会自动处理所有核心功能。
  • JSON格式数据比HTML更灵活,后期修改列或者扩展功能会更方便。
  • 修复了SQL注入风险,替换了废弃的mysql_*函数,让代码更安全、兼容。

如果你的数据量特别大(比如上万条),建议开启serverSide: true,这时后端需要处理DataTables传递的分页(start、length)、排序(order)等参数,只返回当前页的数据,能大幅提升性能。

内容的提问来源于stack exchange,提问作者Haris Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:50:57