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

点击表格父行展开子行附加信息 修复仅显示首个子行问题

问题根因

现有代码三个核心bug导致功能不符合预期:

  • jQuery选择器逻辑错误:next('.sub_row')只会匹配紧邻当前父行的第一个子行,后续连续的多条子行不会被选中,所以点击后只能展开第一条数据
  • 表格结构不规范:子行的单元格数量和主表头8列不匹配,直接插入主表会出现列错位;visibility:collapse属性在不同浏览器对table行的隐藏效果兼容性差,还会和jQuery的滑行动画冲突
  • 代码存在隐患:SQL语句直接拼接用户传入的日期、零件号参数,有SQL注入风险;主表table标签最后少写了闭合尖括号,属于语法错误
修正方案

不需要更换整体实现,只要调整三块代码即可:

1. PHP/HTML部分调整

给每个父行加唯一ID标记,同一父行下的子行加关联属性,子行单元格用colspan跨满主表列数,内部嵌独立小表格展示明细数据,同时把SQL查询改成PDO预处理避免注入,补全语法错误。

<?php
echo "
<table id='main'>
<thead>
<tr>
    <th>Part</th>
    <th>Description</th>
    <th>Location</th>
    <th>Lowest Cost Date</th>
    <th>Lowest Cost</th>
    <th>Highest Cost Date</th>
    <th>Highest Cost</th>
    <th>Difference</th>
</tr>
</thead>
<tbody>";
$rowId = 0;
while ($data = $sql->fetch(PDO::FETCH_ASSOC)){
    $rowId++;
    // 父行加标记类和唯一ID
    echo "<tr class='parent-row' data-id='".$rowId."'>
        <td>".$data['part']."</td>
        <td>".$data['description']."</td>
        <td>HS</td>
        <td>".$data['min_cost_date']."</td>
        <td>".$data['min_cost']."</td>
        <td>".$data['max_cost_date']."</td>
        <td>".$data['max_cost']."</td>
        <td>".($data['max_cost']-$data['min_cost'])."</td>
    </tr>";
    // 改用PDO预处理传参,避免SQL注入
    $sub_sql = $conn->prepare("SELECT cost, date_received, qty_received FROM v_po_history WHERE part = ? AND location = 'HS' AND date_received >= ? AND date_received <= ?");
    $sub_sql->execute([$data['part'], $fd, $sd]);
    // 子行关联对应父行ID,跨列内嵌明细表格
    echo "<tr class='sub-row' data-parent='".$rowId."'>
        <td colspan='8'>
            <table class='sub-table'>
                <thead>
                    <tr>
                        <th>采购成本</th>
                        <th>收货日期</th>
                        <th>收货数量</th>
                    </tr>
                </thead>
                <tbody>";
    while ($sub_data = $sub_sql->fetch(PDO::FETCH_ASSOC)){
        echo "<tr>
            <td>".$sub_data['cost']."</td>
            <td>".$sub_data['date_received']."</td>
            <td>".$sub_data['qty_received']."</td>
        </tr>";
    }
    echo "      </tbody>
            </table>
        </td>
    </tr>";
}
echo "</tbody>
</table>";
?>

2. jQuery部分调整

用nextUntil方法选中当前父行之后、下一个父行之前的所有连续子行,不管一个父行下挂多少条明细都能全部匹配,同时初始化时默认隐藏所有子行:

$(document).ready(function() {
    // 默认隐藏所有子行
    $('.sub-row').hide();
    $('.parent-row').click(function() {
        // 选中当前父行对应的所有子行,触发展开/收起动画
        $(this).nextUntil('.parent-row', '.sub-row').slideToggle('slow');
        // 如果需要手风琴效果(展开当前行时自动收起其他行),放开下面这行注释即可
        // $('.sub-row').not($(this).nextUntil('.parent-row', '.sub-row')).slideUp();
    });
});

3. CSS部分调整

删除原来的visibility隐藏规则,补充基础样式区分父行和子表格,提升可读性:

#main {
    width: 100%;
    border-collapse: collapse;
}
#main th, #main td {
    border: 1px solid #eee;
    padding: 8px;
    text-align: left;
}
.parent-row {
    cursor: pointer;
    background: #f8f8f8;
}
.parent-row:hover {
    background: #f0f0f0;
}
.sub-table {
    width: 90%;
    margin: 0 auto;
    border-collapse: collapse;
    background: #fff;
}
.sub-table th, .sub-table td {
    border: 1px solid #e5e5e5;
    padding: 6px;
}

调整后不管单个零件关联多少条成本、日期记录,点击父行都会全部展开/收起,不会再出现只显示第一条的问题,动态传入日期范围的查询逻辑也不会受影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:12:45