You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现主下拉菜单联动切换子下拉菜单选项(健身卡片开发)

嘿,兄弟,我帮你搞定这个联动下拉菜单的功能!作为健身爱好者+JS开发者,这个需求太懂了😎。咱们一步步来,先把你的代码补全并实现联动效果:

第一步:定义训练数据结构

先把肌群和对应的动作整理成一个对象,这样方便后续联动时快速查找:

// 定义肌群与对应动作的映射关系
const workoutData = {
  "胸部": ["平板卧推", "上斜卧推", "双杠臂屈伸", "夹胸器"],
  "肩部": ["哑铃推举", "侧平举", "前平举", "俯身飞鸟"],
  "背部": ["引体向上", "高位下拉", "划船", "硬拉"],
  "腿部": ["深蹲", "腿举", "腿屈伸", "腿弯举"],
  "手臂": ["弯举", "臂屈伸", "锤式弯举", "绳索下压"]
};
第二步:修改HTML结构,替换下拉菜单

把你表格里的"dropdown"替换成真正的<select>元素,给主下拉(肌群)和子下拉(动作)加上类名,方便JS批量操作:

<html>
<link rel="stylesheet" type="text/css" href="scratch.css">
<header>
</header>
<body>
<h1>SNAP YA MF WORKOUT & SEND TO YA HOMIES!</h1>
<table id="first">
  <tr>
    <th>Lift(肌群)</th>
    <th>Weight(重量)</th>
    <th>Exercise(动作)</th>
  </tr>
  <tr>
    <!-- 主下拉:选择肌群 -->
    <td><select class="muscle-group-select"></select></td>
    <td><input type="number" placeholder="输入重量"></td>
    <!-- 子下拉:显示对应动作 -->
    <td><select class="exercise-select"></select></td>
  </tr>
</table>
<div id="t1button">
  <button onclick="myFunction()">+</button>
</div>
<div id="t1pre">
  <button onclick="preFunction()">-</button>
</div>
<script type="text/javascript">
// 这里写JS逻辑
</script>
</body>
</html>

注:我把表头的"no idea"改成了"Exercise",更贴合健身场景,你可以按需调整~

第三步:实现联动逻辑的JS代码

现在写核心的JS功能,包括初始化下拉菜单、联动更新、新增行的处理:

// 定义训练数据
const workoutData = {
  "胸部": ["平板卧推", "上斜卧推", "双杠臂屈伸", "夹胸器"],
  "肩部": ["哑铃推举", "侧平举", "前平举", "俯身飞鸟"],
  "背部": ["引体向上", "高位下拉", "划船", "硬拉"],
  "腿部": ["深蹲", "腿举", "腿屈伸", "腿弯举"],
  "手臂": ["弯举", "臂屈伸", "锤式弯举", "绳索下压"]
};

// 页面加载完成后初始化所有下拉菜单
window.onload = function() {
  // 初始化第一行的下拉菜单
  initDropdowns(document.querySelector(".muscle-group-select"));
};

// 初始化单个肌群下拉菜单的选项
function initDropdowns(muscleSelect) {
  // 清空原有选项
  muscleSelect.innerHTML = "";
  
  // 添加默认提示选项
  const defaultOption = document.createElement("option");
  defaultOption.value = "";
  defaultOption.textContent = "选择肌群";
  muscleSelect.appendChild(defaultOption);
  
  // 遍历肌群数据,添加选项
  Object.keys(workoutData).forEach(muscle => {
    const option = document.createElement("option");
    option.value = muscle;
    option.textContent = muscle;
    muscleSelect.appendChild(option);
  });
  
  // 绑定联动事件
  muscleSelect.addEventListener("change", function() {
    updateExerciseDropdown(this);
  });
  
  // 初始化对应的动作下拉菜单
  updateExerciseDropdown(muscleSelect);
}

// 根据选中的肌群更新动作下拉菜单
function updateExerciseDropdown(muscleSelect) {
  // 获取当前行的动作下拉菜单
  const exerciseSelect = muscleSelect.parentElement.parentElement.querySelector(".exercise-select");
  const selectedMuscle = muscleSelect.value;
  
  // 清空原有选项
  exerciseSelect.innerHTML = "";
  
  if (!selectedMuscle) {
    // 如果没选肌群,显示提示
    const defaultOption = document.createElement("option");
    defaultOption.value = "";
    defaultOption.textContent = "请先选肌群";
    exerciseSelect.appendChild(defaultOption);
    return;
  }
  
  // 添加选中肌群对应的动作选项
  workoutData[selectedMuscle].forEach(exercise => {
    const option = document.createElement("option");
    option.value = exercise;
    option.textContent = exercise;
    exerciseSelect.appendChild(option);
  });
}

// 新增行的函数(修改你的myFunction)
function myFunction() {
  const table = document.getElementById("first");
  const tr = document.createElement("tr");
  
  // 创建肌群下拉单元格
  const muscleTd = document.createElement("td");
  const muscleSelect = document.createElement("select");
  muscleSelect.className = "muscle-group-select";
  muscleTd.appendChild(muscleSelect);
  
  // 创建重量输入单元格
  const weightTd = document.createElement("td");
  const weightInput = document.createElement("input");
  weightInput.type = "number";
  weightInput.placeholder = "输入重量";
  weightTd.appendChild(weightInput);
  
  // 创建动作下拉单元格
  const exerciseTd = document.createElement("td");
  const exerciseSelect = document.createElement("select");
  exerciseSelect.className = "exercise-select";
  exerciseTd.appendChild(exerciseSelect);
  
  // 添加到行里,再添加到表格
  tr.appendChild(muscleTd);
  tr.appendChild(weightTd);
  tr.appendChild(exerciseTd);
  table.appendChild(tr);
  
  // 初始化新行的下拉菜单
  initDropdowns(muscleSelect);
}

// 删除行的函数(补全你的preFunction)
function preFunction() {
  const table = document.getElementById("first");
  // 至少保留表头+1行数据
  if (table.rows.length > 2) {
    table.deleteRow(table.rows.length - 1);
  }
}
功能说明
  • 页面加载后,第一行的肌群下拉会自动填充所有选项,动作下拉默认显示提示
  • 选中某个肌群后,对应的动作下拉会立刻更新为该肌群的训练动作,无关动作完全隐藏
  • 点击+按钮新增的行,同样具备完整的联动功能
  • 点击-按钮可以删除最后一行(保留至少一行训练项)

你可以根据自己的需求修改workoutData里的肌群和动作,比如添加更多动作或者调整肌群名称~

内容的提问来源于stack exchange,提问作者Postman507

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:49:08