javascript - 使用 Bootstrap 显示/隐藏嵌套动态表的行
问题描述
我正在尝试制作一个表格,显示一个体育联盟的排行榜,具有不同程度的详细信息。数据本身来自 SQL 数据库。我有多个团队,每个团队包含不同数量的玩家(注意:一个玩家可以属于超过 1 个团队),每个玩家通过参加不同数量的活动来赚钱(注意:超过 1 个玩家可以参加在一个事件中)。团队名称是唯一的。
我希望表格最初只显示每支球队的总收入,然后当点击球队的行时,只显示该球队球员的详细信息。然后,当单击球员所在的行时,将显示该球队中该球员的事件详细信息。第二次单击该行将隐藏已显示的数据。
动态设置 data-target 和 id 属性让我大吃一惊。使用我尝试过的所有选项,单击无效。如果我对这些值进行硬编码(如下所示的示例),表格会按我预期的方式工作,但显然不是我想要的方式。换句话说,它显示了所有父级的请求级别的所有数据 - 但它应该仅适用于选定的父级。在代码片段中,我使用一个简化的数组来代替对 db 的调用。
谢谢!
https://jsfiddle.net/gistewart/e9qyLv20/
const arr = [{
teamName: "team1",
teamEarnings: "$1700",
teamPlayers: [{
playerName: "player1",
playerEarnings: "$1000",
events: [{
eventName: "event1",
eventEarnings: "$400"
}, {
eventName: "event2",
eventEarnings: "$600"
}],
},
{
playerName: "player2",
playerEarnings: "$700",
events: [{
eventName: "event2",
eventEarnings: "$500"
}, {
eventName: "event3",
eventEarnings: "$200"
}],
}
],
},
{
teamName: "team2",
teamEarnings: "$2900",
teamPlayers: [{
playerName: "player1",
playerEarnings: "$900",
events: [{
eventName: "event1",
eventEarnings: "$800"
}, {
eventName: "event3",
eventEarnings: "$100"
}],
},
{
playerName: "player3",
playerEarnings: "$2000",
events: [{
eventName: "event2",
eventEarnings: "$1250"
}, {
eventName: "event3",
eventEarnings: "$750"
}],
}
],
}
]
function displayLeaderboard(arr) {
for (let i = 0; i < arr.length; i++) {
$(".leaderboard-container").append(
"<tr data-toggle='collapse' data-target='#demo1' class='clickabe'><td>" + arr[i].teamName + "</td><td>" + arr[i].teamEarnings + "</td></tr>"
)
for (let j = 0; j < arr[i].teamPlayers.length; j++) {
$(".leaderboard-container").append(
"<tr class='level2 hiddenRow collapse' id='demo1' data-toggle='collapse' data-target='#demo2' class='clickable'><td>" + arr[i].teamPlayers[j].playerName + "</td><td>" + arr[i].teamPlayers[j].playerEarnings + "</td></tr>"
)
for (let k = 0; k < arr[i].teamPlayers[j].events.length; k++) {
$(".leaderboard-container").append(
"<tr class='level3 hiddenRow collapse' id='demo2' ><td>" + arr[i].teamPlayers[j].events[k].eventName + "</td><td>" + arr[i].teamPlayers[j].events[k].eventEarnings + "</td></tr>"
)
}
}
}
}
displayLeaderboard(arr);
.level2 {
font-size: 0.9em;
color: blue;
}
.level3 {
font-size: 0.8em;
color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet" />
<body>
<div class="container">
<table class="table leaderboard-container">
<thead>
<tr>
<th scope="col">Team</th>
<th scope="col">Earnings</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
解决方案
这是您可以执行的操作,您必须从父级为每个调用的折叠元素添加特定的标识符:
function displayLeaderboard(arr) {
for (let i = 0; i < arr.length; i++) {
$(".leaderboard-container").append(
"<tr data-toggle='collapse' data-target='#demo"+ i +"' class='clickabe'><td>" + arr[i].teamName + "</td><td>" + arr[i].teamEarnings + "</td></tr>"
)
for (let j = 0; j < arr[i].teamPlayers.length; j++) {
$(".leaderboard-container").append(
"<tr class='level2 hiddenRow collapse' id='demo"+ i +"' data-toggle='collapse' data-target='#demo-"+ i +"-"+ j +"' class='clickable'><td>" + arr[i].teamPlayers[j].playerName + "</td><td>" + arr[i].teamPlayers[j].playerEarnings + "</td></tr>"
)
for (let k = 0; k < arr[i].teamPlayers[j].events.length; k++) {
$(".leaderboard-container").append(
"<tr class='level3 hiddenRow collapse' id='demo-"+ i +"-"+ j +"' ><td>" + arr[i].teamPlayers[j].events[k].eventName + "</td><td>" + arr[i].teamPlayers[j].events[k].eventEarnings + "</td></tr>"
)
}
}
}
}
displayLeaderboard(arr);
希望能帮助到你。
推荐阅读
- java - 在 Selenium Java 客户端中 addArguments 和 setPreference 方法有什么区别?
- powerbi - 有异常的索引列 - POWER BI / DAX / M
- python - 计算 Python 列表中重复的元素总数
- android - Android WebView:等待显示更新,直到页面渲染完成
- c# - 如何在winforms图表中拥有相同大小的列?
- flutter - Flutter Navigator 2.0 通过 Navigator() 路由
- plot - 用 plot_implicit 绘制两个隐式函数
- python - 如何在熊猫 groupby 之后跨列求和?
- php - 如何从录制状态回调中获取 From 和 To 号码
- amazon-web-services - 使用 S3 全球域名的 CloudFront 来源是否比区域域名表现更好?