首页 > 编程语言 >点击表格行展开多条子行数据

点击表格行展开多条子行数据

来源:互联网 2026-07-12 08:11:06

使用jQuery的nextUntil('.clicked','.sub_row')替代next(),并用display:none隐藏子行,解决点击主行仅显示首条子行问题。PHP需确保子行连续输出,jQuery精准定位,注意SQL预处理与性能优化。

本文详解如何通过 jQuery 动态控制表格中父子行的显示与隐藏,解决“点击主行后仅显示首条子行”的常见问题,确保每个主行能正确关联并展开其全部关联子数据。

在构建动态数据报表,尤其是采购或库存类数据时,经常需要做一种“主-子”结构的展示。简单说就是一行的零件信息下面,得挂上这个零件的所有采购明细,包括每一次的进货成本和到货时间。这个需求本身不复杂,但实际编码时很容易踩个坑——点了主行,只弹出来第一个子行,后面跟着的那一堆明细纹丝不动。

问题的根源出在哪里?其实就两点。第一,用了 $(this).next('.sub_row'),这个选择器只匹配紧挨着主行的第一个子行,后面的概不认账。第二,CSS 上用了 visibility: collapse,这东西不光在视觉上有问题,还会在布局里继续占着位置,动画效果也容易闹别扭。

长期稳定更新的攒劲资源: >>>点此立即查看<<<

所以,真正的解决思路并不复杂,关键看三个环节是否做到位。

正确实现的关键点

  1. HTML 结构要讲规矩:所有子行必须紧跟在对应主行后面,中间不能被其他 .clicked 主行打断。PHP 在输出的时候,需要把同一个零件的子行连续打印在主行下面,一条都不要漏。
  2. jQuery 选择器升级:放弃 .next(),改用 .nextUntil('.clicked', '.sub_row')。这个选择器的意思是——从当前主行开始,一直往后找,直到碰上下一个 .clicked 行之前,中间所有的 .sub_row 全部拿下。正好匹配多条子数据的场景。
  3. CSS 隐藏方式调整:用 display: none 替代 visibility: collapse。后者在布局中会留白,而前者彻底释放空间,配合 toggle()slideToggle() 也能自然过渡。

修正后的核心代码示例

PHP 输出(关键改进:fetchAll() + foreach 确保全部子行输出)

echo "";
while ($data = $sql->fetch(PDO::FETCH_ASSOC)) {
    // 主行
    echo "";

    // 查询所有关联子记录(防 SQL 注入推荐使用 PDO 预处理,此处为逻辑示意)
    $sub_sql = $conn->query("SELECT cost, date_received FROM v_po_history
                              WHERE part = '{$data['part']}'
                                AND location = 'HS'
                                AND date_received BETWEEN '$fd' AND '$sd'");
    $sub_rows = $sub_sql->fetchAll(PDO::FETCH_ASSOC);
    foreach ($sub_rows as $row) {
        // 子行:4列布局(标签+值成对),确保结构清晰
        echo "";
    }
}
echo "
PartDescriptionLocation Lowest Cost DateLowest Cost Highest Cost DateHighest CostDifference
{$data['part']} {$data['description']} HS {$data['min_cost_date']} {$data['min_cost']} {$data['max_cost_date']} {$data['max_cost']} " . ($data['max_cost'] - $data['min_cost']) . "
Cost: {$row['cost']} Date Received: {$row['date_received']}
";

jQuery 交互逻辑(精准定位所有子行)

$(document).ready(function() {
    $('.clicked').click(function() {
        // 查找当前行之后、下一个.clicked行之前的所有.sub_row
        $(this).nextUntil('.clicked', '.sub_row').toggle('slow');
    });
});

CSS 样式(基础隐藏 + 可选视觉区分)

.sub_row {
    display: none; /* 必须用 display:none */
    background-color: #f9f9f9;
    border-bottom: 1px solid #eee;
}

/* 可选:为主行添加悬停提示 */
.clicked:hover {
    background-color: #eef7ff;
    cursor: pointer;
}

重要注意事项

  • 安全性警示:上面示例里的 SQL 拼接写法,只是为了说明逻辑结构,放在生产环境就是妥妥的注入靶子。务必换成 PDO 预处理:
    $stmt = $conn->prepare("SELECT cost, date_received FROM v_po_history
                             WHERE part = ? AND location = ? AND date_received BETWEEN ? AND ?");
    $stmt->execute([$data['part'], 'HS', $fd, $sd]);
    $sub_rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
  • 性能优化:如果主表有几百行,每个下面再挂十几条子行,一次性渲染所有子行会让页面沉重不堪。数据量大时,可以改用 AJAX 按需加载,点击主行再去请求对应的明细。
  • 无障碍访问:给 .clicked 行加上 aria-expanded 属性,在点击时同步更新 true/false,这样屏幕阅读器也能正确识别折叠状态。
  • 样式隔离:.sub_row 这个类名,别和表格里的 th 或其他功能行搅在一起。否则 nextUntil() 匹配的时候容易翻车。

这三板斧砍下去,一个主行带多条子行的展开效果就能稳定跑通。每次点击只动当前主行相关的子行,结构清晰、逻辑报错也更好排查,维护起来省心不少。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。