1. 代码
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Dynamic Tabs with Table Data</title>
<style> /* 简单的样式 */ .tab-content { display: none; border: 10px solid #ccc; padding: 30px; margin-top: 30px; } .tab-content.active { display: block; } table { width: 100%; border-collapse: collapse; } th, td { border: 10px solid #ddd; padding: 30px; text-align: left; } th { background-color: #f2f2f2; }
</style>
</head>
<body>
<div id="tabs"> <!-- 选项卡头部将在这里动态生成 -->
</div>
<div id="tab-contents"> <!-- 选项卡内容(表格)将在这里动态生成 -->
</div> <script>
// 假设这是从后端获取的数据
const data = { "fenceNum": 2, "datasets": [ { "name": "Dataset 1", "data": [ { "num1": 1234, "num2": 5678, "status1": "on", "status2": "active" }, // 更多数据... ] }, { "name": "Dataset 2", "data": [ { "num1": 3456, "num2": 7890, "status1": "off", "status2": "inactive" }, // 更多数据... ] } ]
}; // 动态生成选项卡头部和内容
const tabsDiv = document.getElementById('tabs');
const tabContentsDiv = document.getElementById('tab-contents'); data.datasets.forEach((dataset, index) => { const tabButton = document.createElement('button'); tabButton.textContent = `Tab ${index + 1} (${dataset.name})`; tabButton.onclick = () => showTabContent(index); tabsDiv.appendChild(tabButton); const tabContent = document.createElement('div'); tabContent.className = 'tab-content'; // 创建表格 const table = document.createElement('table'); const thead = table.createTHead(); const headerRow = thead.insertRow(); ['Num1', 'Num2', 'Status1', 'Status2'].forEach(text => { let th = document.createElement('th'); th.textContent = text; headerRow.appendChild(th); }); const tbody = table.createTBody(); dataset.data.forEach(item => { let row = tbody.insertRow(); ['num1', 'num2', 'status1', 'status2'].forEach(key => { let cell = row.insertCell(); cell.textContent = item[key]; }); }); tabContent.appendChild(table); if (index === 0) tabContent.classList.add('active'); // 默认显示第一个选项卡的内容 tabContentsDiv.appendChild(tabContent);
}); function showTabContent(index) { const tabContents = document.querySelectorAll('.tab-content'); tabContents.forEach(tabContent => tabContent.classList.remove('active')); tabContents[index].classList.add('active');
}
</script>
</body>
</html>
2.解释
1213
L结构
数据定义:data对象包含两个数据集(datasets),每个数据集都有一个名称(name)和一个包含多个数据项(data)的数组。每个数据项都有四个属性:num1、num2、status1、status2。
动态生成选项卡头部:遍历data.datasets数组,为每个数据集创建一个按钮(button),按钮的文本内容包含选项卡的编号和数据集的名称。每个按钮都绑定了一个点击事件监听器,当按钮被点击时,会调用showTabContent函数并传入当前选项卡的索引。
动态生成选项卡内容:对于每个数据集,创建一个div元素作为选项卡的内容容器,并为其添加.tab-content类。然后,在这个div内部创建一个表格(table),并动态生成表头和表体。表头(th)根据数据项的属性名(Num1、Num2、Status1、Status2)来设置,表体(td)则根据数据项的实际值来填充。
默认显示第一个选项卡的内容:通过检查索引(index),如果它是第一个数据集(index === 0),则给对应的.tab-content元素添加.active类,使其内容被显示。
显示/隐藏选项卡内容:showTabContent函数负责根据传入的索引来显示对应的选项卡内容,并隐藏其他所有选项卡的内容。它通过查询所有.tab-content元素,移除它们的.active类,然后只给目标索引对应的.tab-content元素添加.active类来实现。
注意事项
在这个例子中,数据是硬编码在JavaScript中的,但在实际应用中,这些数据可能会通过AJAX请求从后端API获取。
表格的列标题(th)使用了大写的属性名(Num1、Num2等),而数据项(item)的键是小写的(num1、num2等)。虽然JavaScript是大小写敏感的,但在这个例子中,由于我们直接通过字符串字面量来访问对象的属性,所以不会出现问题。然而,为了保持一致性,最好确保列标题和数据项键的大小写一致。
默认情况下,只有第一个选项卡的内容是可见的,其他选项卡的内容都是隐藏的。当用户点击不同的选项卡时,相应的内容会被显示,而其他内容会被隐藏。