
本教程详细介绍了如何利用纯j*ascript实现html下拉菜单与表格内容的动态联动。通过一个维修表单示例,我们将学习如何根据下拉菜单选择的模型,实时过滤并展示兼容的新旧零件数据。内容涵盖了数据结构定义、下拉菜单和表格的动态填充、事件监听、以及现代j*ascript的最佳实践,确保即使在本地环境也能高效运行。
在前端开发中,根据用户在下拉菜单中的选择动态更新页面内容是一种常见的交互需求。本教程将以一个维修表单为例,演示如何使用原生J*aScript实现这一功能,即当用户选择不同的产品型号时,两个相关零件表格(新零件和旧零件)能够实时显示与该型号兼容的零件列表。
首先,我们需要搭建基本的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结构关键点:
J*aScript部分将负责数据的管理、下拉菜单的填充、以及根据选择动态更新表格。
<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) {
tot
alValue += 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>J*aScript关键点:
数据声明 (const / let):
来画数字人|直播|
来画数字人自动化|直播|,无需请真人主播,即可实现24小时|直播|,无缝衔接各大|直播|平台。
57
查看详情
populateDropdowns() 函数:
populateTables() 函数:
checkValue() 函数:
通过本教程,我们学习了如何使用纯J*aScript和HTML实现一个动态的维修表单。核心在于理解如何通过下拉菜单的 onchange 事件触发J*aScript函数,该函数负责根据选定值过滤数据,并动态生成或更新HTML表格内容。同时,我们强调了现代J*aScript变量声明的最佳实践,以及如何通过CSS优化页面布局,以构建一个功能完善且用户友好的前端应用。
以上就是使用J*aScript实现下拉菜单动态更新表格内容的教程的详细内容,更多请关注其它相关文章!
相关文章:
处理嵌套交互式控件:前端可访问性指南
Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择
WooCommerce产品页高级定制:实现基于分类的交叉销售
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法
sublime怎么设置启动时打开的窗口_sublime会话管理与热退出
Mac怎么使用表情符号_Mac Emoji快捷键面板
外媒分析《GTA6》定价:卖100美元可以但真没必要!
抖音从哪里进入网页版_抖音官方入口链接
Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】
蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】
Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程
离线运行Go语言之旅:本地部署与GOPATH配置指南
QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录
Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】
C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用
Angular响应式表单:实现提交后表单及按钮的禁用与只读化
Python多线程中正确使用sigwait处理SIGALRM信号
163邮箱注册官网 免费申请163个人邮箱
J*a递归快速排序中静态变量的状态管理与陷阱
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
mysql备份恢复性能优化_mysql备份恢复性能优化方法
Go RPC HTTP服务正确实现与常见陷阱解析
星露谷物语官网入口 星露谷物语游戏官网入口
理解J*aScript Promise的微任务队列与执行顺序
Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法
J*a里如何使用forEach遍历Map_Map遍历方法说明
如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置
Python异步编程实践:使用Binance API构建实时交易数据流
深入理解J*aScript中的B样条曲线与节点向量生成
Excel文件在线转换快速入口 Excel在线格式转换网站
新三国志曹操传110级星符试炼夏侯渊极难攻略
yandex入口引擎手机版 yandex安卓版下载入口
PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践
QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】
126邮箱账号注册 电脑版登录入口
俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达
uc浏览器网页版入口 uc浏览器网页版最新网址
age动漫网站入口 age动漫官网直接访问入口
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】
J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明
修复二维数组索引越界异常:一维循环到二维坐标的正确映射
Pygame教程:解决用户输入与游戏状态更新不同步问题
126邮箱网页版官方入口 126邮箱账号在线登录平台
Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量
在PHP脚本中通过SSHFS挂载远程文件系统的最佳实践与常见问题解决