使用jQuery的nextUntil('.clicked','.sub_row')替代next(),并用display:none隐藏子行,解决点击主行仅显示首条子行问题。PHP需确保子行连续输出,jQuery精准定位,注意SQL预处理与性能优化。
本文详解如何通过 jQuery 动态控制表格中父子行的显示与隐藏,解决“点击主行后仅显示首条子行”的常见问题,确保每个主行能正确关联并展开其全部关联子数据。
在构建动态数据报表,尤其是采购或库存类数据时,经常需要做一种“主-子”结构的展示。简单说就是一行的零件信息下面,得挂上这个零件的所有采购明细,包括每一次的进货成本和到货时间。这个需求本身不复杂,但实际编码时很容易踩个坑——点了主行,只弹出来第一个子行,后面跟着的那一堆明细纹丝不动。
问题的根源出在哪里?其实就两点。第一,用了 $(this).next('.sub_row'),这个选择器只匹配紧挨着主行的第一个子行,后面的概不认账。第二,CSS 上用了 visibility: collapse,这东西不光在视觉上有问题,还会在布局里继续占着位置,动画效果也容易闹别扭。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
所以,真正的解决思路并不复杂,关键看三个环节是否做到位。
.next(),改用 .nextUntil('.clicked', '.sub_row')。这个选择器的意思是——从当前主行开始,一直往后找,直到碰上下一个 .clicked 行之前,中间所有的 .sub_row 全部拿下。正好匹配多条子数据的场景。display: none 替代 visibility: collapse。后者在布局中会留白,而前者彻底释放空间,配合 toggle() 或 slideToggle() 也能自然过渡。PHP 输出(关键改进:fetchAll() + foreach 确保全部子行输出)
echo "
| Part | Description | Location | Lowest Cost Date | Lowest Cost | Highest Cost Date | Highest Cost | Difference |
|---|---|---|---|---|---|---|---|
| {$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;
}
$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);
aria-expanded 属性,在点击时同步更新 true/false,这样屏幕阅读器也能正确识别折叠状态。这三板斧砍下去,一个主行带多条子行的展开效果就能稳定跑通。每次点击只动当前主行相关的子行,结构清晰、逻辑报错也更好排查,维护起来省心不少。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述