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

如何在PHP页面中点击li元素切换展示单/双Datatable?

实现点击切换不同Datatable的方案

我来帮你搞定这个需求,咱们分几个部分一步步实现:

1. 完善HTML结构

先把你的列表补全,同时添加Datatable的容器(初始全部隐藏,点击后再显示对应内容):

<ul class="content-box-tab order_type" style="float: right;margin: 0 !important;padding: 10px 15px 0 0 !important;">
    <li><a sub="paid" class="active">已支付</a></li>
    <li><a sub="unpaid">未支付</a></li>
</ul>

<!-- 已支付Datatable容器 -->
<div id="paid-table-container" style="display: block;">
    <table id="paid-table" class="display" width="100%"></table>
</div>

<!-- 未支付Datatable容器 -->
<div id="unpaid-tables-container" style="display: none;">
    <h3>未支付记录组1</h3>
    <table id="unpaid-table-1" class="display" width="100%"></table>
    <br>
    <h3>未支付记录组2</h3>
    <table id="unpaid-table-2" class="display" width="100%"></table>
</div>

2. JavaScript逻辑(结合jQuery和DataTables)

这里用jQuery绑定点击事件,根据点击的选项加载对应的表格。注意要处理表格的销毁与重新初始化,避免重复渲染:

// 全局存储Datatable实例,方便后续销毁/刷新
let paidTableInstance = null;
let unpaidTable1Instance = null;
let unpaidTable2Instance = null;

$(document).ready(function() {
    // 页面加载完成后默认加载已支付表格
    loadPaidTable();

    // 绑定tab点击切换事件
    $('.order_type a').on('click', function(e) {
        e.preventDefault();
        // 切换tab的active样式
        $('.order_type a').removeClass('active');
        $(this).addClass('active');
        
        const tabType = $(this).attr('sub');
        
        // 切换容器显示状态
        if (tabType === 'paid') {
            $('#paid-table-container').show();
            $('#unpaid-tables-container').hide();
            // 表格未初始化则加载,否则刷新数据
            if (!paidTableInstance) {
                loadPaidTable();
            } else {
                paidTableInstance.ajax.reload();
            }
        } else if (tabType === 'unpaid') {
            $('#paid-table-container').hide();
            $('#unpaid-tables-container').show();
            // 加载两个未支付表格
            if (!unpaidTable1Instance) {
                loadUnpaidTable1();
            } else {
                unpaidTable1Instance.ajax.reload();
            }
            if (!unpaidTable2Instance) {
                loadUnpaidTable2();
            } else {
                unpaidTable2Instance.ajax.reload();
            }
        }
    });
});

// 加载已支付表格
function loadPaidTable() {
    paidTableInstance = $('#paid-table').DataTable({
        ajax: {
            url: 'get_paid_records.php', // 后端接口地址
            type: 'POST',
            dataType: 'json'
        },
        columns: [
            { title: '订单ID', data: 'order_id' },
            { title: '支付金额', data: 'amount' },
            { title: '支付时间', data: 'pay_time' },
            // 其他列根据你的业务需求添加
        ],
        language: {
            url: '//cdn.datatables.net/plug-ins/1.13.6/i18n/zh-CN.json' // 中文语言包,可按需调整
        },
        destroy: true // 允许销毁重绘,避免重复初始化报错
    });
}

// 加载未支付表格1
function loadUnpaidTable1() {
    unpaidTable1Instance = $('#unpaid-table-1').DataTable({
        ajax: {
            url: 'get_unpaid_records_1.php', // 第一个未支付数据接口
            type: 'POST',
            dataType: 'json'
        },
        columns: [
            { title: '订单ID', data: 'order_id' },
            { title: '应付金额', data: 'amount' },
            { title: '创建时间', data: 'create_time' },
            // 其他列
        ],
        language: {
            url: '//cdn.datatables.net/plug-ins/1.13.6/i18n/zh-CN.json'
        },
        destroy: true
    });
}

// 加载未支付表格2
function loadUnpaidTable2() {
    unpaidTable2Instance = $('#unpaid-table-2').DataTable({
        ajax: {
            url: 'get_unpaid_records_2.php', // 第二个未支付数据接口
            type: 'POST',
            dataType: 'json'
        },
        columns: [
            { title: '订单ID', data: 'order_id' },
            { title: '客户名称', data: 'customer_name' },
            { title: '逾期天数', data: 'overdue_days' },
            // 其他列
        ],
        language: {
            url: '//cdn.datatables.net/plug-ins/1.13.6/i18n/zh-CN.json'
        },
        destroy: true
    });
}

3. PHP后端接口示例

以get_paid_records.php为例,连接数据库并返回JSON格式的已支付数据:

<?php
// 数据库连接配置(根据你的实际环境调整)
$servername = "localhost";
$username = "your_db_username";
$password = "your_db_password";
$dbname = "your_db_name";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("数据库连接失败: " . $conn->connect_error);
}

// 查询已支付记录(这里的表名和字段请根据你的实际业务调整)
$sql = "SELECT order_id, amount, pay_time FROM orders WHERE status = 'paid'";
$result = $conn->query($sql);

$records = [];
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        $records[] = $row;
    }
}

// 返回DataTables要求的JSON格式数据
echo json_encode([
    'data' => $records
]);

$conn->close();
?>

get_unpaid_records_1.php和get_unpaid_records_2.php的逻辑类似,只需修改查询条件或数据源即可,记得做好SQL注入防护(比如使用预处理语句)。

几点注意事项

  • 确保你已经引入了jQuery和DataTables的CSS、JS文件(可以用CDN或者本地文件)
  • 如果两个未支付表格的数据可以从同一个接口返回,也可以修改JS逻辑,一次请求获取两个数据集,减少HTTP请求
  • 可以添加加载动画,提升用户体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:15:51