
本教程详细介绍了如何利用纯javascript实现html下拉菜单与表格内容的动态联动。通过一个维修表单示例,我们将学习如何根据下拉菜单选择的模型,实时过滤并展示兼容的新旧零件数据。内容涵盖了数据结构定义、下拉菜单和表格的动态填充、事件监听、以及现代javascript的最佳实践,确保即使在本地环境也能高效运行。
在前端开发中,根据用户在下拉菜单中的选择动态更新页面内容是一种常见的交互需求。本教程将以一个维修表单为例,演示如何使用原生JavaScript实现这一功能,即当用户选择不同的产品型号时,两个相关零件表格(新零件和旧零件)能够实时显示与该型号兼容的零件列表。
首先,我们需要搭建基本的HTML骨架,包括表单元素、下拉菜单以及用于显示零件的表格。
<!DOCTYPE html>
<html>
<head>
<title>维修表单</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
form {
display: flex;
flex-direction: column;
gap: 15px; /* 使用gap代替br来控制间距 */
width: 300px;
padding: 20px;
border: 1px solid #ccc;
border-radius: 8px;
background-color: #f9f9f9;
}
label {
font-weight: bold;
margin-bottom: 5px;
}
input[type="text"], select {
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 14px;
width: calc(100% - 16px); /* 考虑padding */
}
h1, h2 {
color: #333;
margin-top: 20px;
margin-bottom: 10px;
}
.table {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
background-color: #fff;
}
.table th, .table td {
border: 1px solid #ccc;
padding: 8px;
text-align: left;
}
.table th {
background-color: #eee;
font-weight: bold;
}
.green-button {
background-color: #4CAF50; /* 绿色 */
color: white;
padding: 10px 15px;
font-size: 16px;
border: none;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s ease;
}
.green-button:hover {
background-color: #45a049;
}
.red-button {
background-color: #f44336; /* 红色 */
color: white;
padding: 10px 15px;
font-size: 16px;
border: none;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s ease;
}
.red-button:hover {
background-color: #da190b;
}
</style>
</head>
<body onload="populateDropdowns()">
<h1>维修表单</h1>
<form onsubmit="return false;"> <!-- 阻止表单默认提交行为 -->
<label for="technician">技术员:</label>
<input type="text" id="technician" name="technician" required>
<label for="sku">SKU:</label>
<select id="sku" name="sku" required></select>
<label for="serial">序列号:</label>
<input type="text" id="serial" name="serial" required>
<label for="model">型号:</label>
<select id="model" name="model" required onchange="populateTables()">
<option value="">请选择型号</option> <!-- 添加默认选项 -->
</select>
<h2>新零件</h2>
<table class="table" id="new-parts-table"></table>
<h2>旧零件</h2>
<table class="table" id="salvaged-parts-table"></table>
<input type="submit" value="提交" id="submit-button" onclick="checkValue()">
</form>
</body>
</html>HTML结构关键点:
JavaScript部分将负责数据的管理、下拉菜单的填充、以及根据选择动态更新表格。
立即学习“Java免费学习笔记(深入)”;
<script>
// 使用let或const声明变量,推荐使用const对于固定数据,let对于可能改变的数据
const skuData = [
["SKU1", "Description 1", "Value 1"],
["SKU2", "Description 2", "Value 2"],
["SKU3", "Description 3", "Value 3"]
];
const modelData = [
["Brand 1", "Gen 1", "Model 1"],
["Brand 2", "Gen 2", "Model 2"],
["Brand 3", "Gen 3", "Model 3"]
];
const newPartsData = [
["Part 1", "10", "5", "Model 1,Model 2"],
["Part 2", "20", "3", "Model 1,Model 3"],
["Part 3", "30", "2", "Model 2,Model 3"]
];
const salvagePartsData = [
["Part 4", "15", "4", "Model 1,Model 3"],
["Part 5", "25", "6", "Model 2,Model 3"],
["Part 6", "35", "2", "Model 1,Model 2"]
];
/**
* 填充SKU和型号下拉菜单
*/
function populateDropdowns() {
const skuDropdown = document.getElementById('sku');
const modelDropdown = document.getElementById('model');
// 填充SKU下拉菜单
skuData.forEach(item => {
const option = document.createElement('option');
option.value = item[0];
option.textContent = `${item[1]} - ${item[2]}`;
skuDropdown.appendChild(option);
});
// 填充型号下拉菜单
// 关键修正:option.value 应该设置为型号名称 (item[2])
modelData.forEach(item => {
const option = document.createElement('option');
option.value = item[2]; // 将型号名称作为option的值
option.textContent = `${item[0]} - ${item[1]} - ${item[2]}`;
modelDropdown.appendChild(option);
});
// 页面加载时,如果modelDropdown有默认值(例如通过服务器渲染),则可以立即填充表格
// 如果没有,则在用户选择后populateTables()会被onchange触发
// 此处不再立即调用populateTables,因为我们添加了“请选择型号”的默认空选项
// populateTables();
}
/**
* 根据选择的型号填充新零件和旧零件表格
*/
function populateTables() {
const modelSelection = document.getElementById('model').value;
// 如果没有选择型号,则清空表格并返回
if (!modelSelection) {
document.getElementById('new-parts-table').innerHTML = "";
document.getElementById('salvaged-parts-table').innerHTML = "";
return;
}
// 填充新零件表格
const newPartsTable = document.getElementById('new-parts-table');
// 清空现有内容并添加表头
newPartsTable.innerHTML = "<thead><tr><th>零件</th><th>数量</th><th>选择</th></tr></thead><tbody></tbody>";
const newPartsTableBody = newPartsTable.querySelector('tbody');
newPartsData.forEach(item => {
// 检查零件是否兼容当前选择的型号
if (item[3].includes(modelSelection)) {
const row = document.createElement('tr');
const partCell = document.createElement('td');
partCell.textContent = item[0];
row.appendChild(partCell);
const quantityCell = document.createElement('td');
quantityCell.textContent = item[2]; // 假设item[2]是库存数量
row.appendChild(quantityCell);
const selectCell = document.createElement('td');
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.name = 'new_parts[]';
checkbox.value = item[0];
// 添加事件监听器,以便在选择零件时更新总价值和按钮状态
checkbox.addEventListener('change', checkValue);
selectCell.appendChild(checkbox);
row.appendChild(selectCell);
newPartsTableBody.appendChild(row);
}
});
// 填充旧零件表格 (逻辑与新零件表格类似)
const salvagePartsTable = document.getElementById('salvaged-parts-table');
salvagePartsTable.innerHTML = "<thead><tr><th>零件</th><th>数量</th><th>选择</th></tr></thead><tbody></tbody>";
const salvagePartsTableBody = salvagePartsTable.querySelector('tbody');
salvagePartsData.forEach(item => {
if (item[3].includes(modelSelection)) {
const row = document.createElement('tr');
const partCell = document.createElement('td');
partCell.textContent = item[0];
row.appendChild(partCell);
const quantityCell = document.createElement('td');
quantityCell.textContent = item[2]; // 假设item[2]是库存数量
row.appendChild(quantityCell);
const selectCell = document.createElement('td');
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.name = 'salvaged_parts[]';
checkbox.value = item[0];
checkbox.addEventListener('change', checkValue);
selectCell.appendChild(checkbox);
row.appendChild(selectCell);
salvagePartsTableBody.appendChild(row);
}
});
}
/**
* 检查选定零件的总价值并更新提交按钮状态
*/
function checkValue() {
// 将SKU的值从字符串转换为整数,并处理可能为空的情况
const skuDropdown = document.getElementById('sku');
const skuValue = parseInt(skuDropdown.options[skuDropdown.selectedIndex].text.split(' - ')[2]) || 0; // 假设SKU的值在描述的第三部分
const newParts = document.getElementsByName('new_parts[]');
const salvagedParts = document.getElementsByName('salvaged_parts[]');
let totalValue = 0;
// 计算新零件的总价值
for (let i = 0; i < newParts.length; i++) {
if (newParts[i].checked) {
const partName = newParts[i].value;
const part = newPartsData.find(item => item[0] === partName);
if (part) {
totalValue += parseInt(part[1]); // 假设item[1]是零件的价值
}
}
}
// 计算旧零件的总价值
for (let i = 0; i < salvagedParts.length; i++) {
if (salvagedParts[i].checked) {
const partName = salvagedParts[i].value;
const part = salvagePartsData.find(item => item[0] === partName);
if (part) {
totalValue += parseInt(part[1]); // 假设item[1]是零件的价值
}
}
}
const submitButton = document.getElementById('submit-button');
if (totalValue < skuValue) {
submitButton.classList.remove('red-button');
submitButton.classList.add('green-button');
submitButton.textContent = '通过';
} else {
submitButton.classList.remove('green-button');
submitButton.classList.add('red-button');
submitButton.textContent = '不通过';
}
}
</script>JavaScript关键点:
数据声明 (const / let):
populateDropdowns() 函数:
populateTables() 函数:
checkValue() 函数:
通过本教程,我们学习了如何使用纯JavaScript和HTML实现一个动态的维修表单。核心在于理解如何通过下拉菜单的 onchange 事件触发JavaScript函数,该函数负责根据选定值过滤数据,并动态生成或更新HTML表格内容。同时,我们强调了现代JavaScript变量声明的最佳实践,以及如何通过CSS优化页面布局,以构建一个功能完善且用户友好的前端应用。
以上就是使用JavaScript实现下拉菜单动态更新表格内容的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号