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

如何优化单选按钮取值JS代码 消除重复冗余逻辑

套餐联动代码优化方案

当然有,核心思路就是把硬编码在if分支里的配置抽离,把重复的DOM操作合并,改完之后不仅没有重复代码,后续改价格、加套餐都方便很多。

原有代码的冗余问题

  • 初始加载赋值和选中周套餐的赋值逻辑完全重复,写了两遍一模一样的DOM写入操作
  • 三个if分支逻辑完全同构,只是写入的数值不同,属于典型的重复代码
  • 三个独立if没有加else if或者终止逻辑,每次点击就算命中第一个分支,也会跑完后面两个无意义的判断
  • 每个分支都单独写三次DOM赋值,代码非常啰嗦

优化后完整实现

JavaScript代码

// 一次性拿到所有要更新的结果节点,存为数组
const resultEls = Array.from(document.querySelectorAll('.table tr:nth-child(2) span'));

// 套餐配置表,索引和radio的value一一对应,改数值直接调整这里即可
const planMap = [
  ['50 %', '100 $', '150 $'],   // 周套餐 对应value=0
  ['150 %', '200 $', '350 $'],  // 月套餐 对应value=1
  ['250 %', '300 $', '450 $']   // 年套餐 对应value=2
];

// 抽离统一渲染函数,初始加载和切换套餐时复用
function updatePlan(planIndex) {
  resultEls.forEach((el, i) => {
    el.textContent = planMap[planIndex][i];
  });
}

// 初始化渲染默认选中的周套餐
updatePlan(0);

// 绑定切换事件
document.querySelector('div.btn-group').addEventListener('click', e => {
  if (e.target.type === 'radio') {
    // 直接拿radio的value当索引查配置,不需要任何if判断
    updatePlan(Number(e.target.value));
  }
});

这里把获取结果节点的方式改成了通过CSS选择器从表格里批量获取,连原来硬写的三个getElementById都省了,后续加套餐列只要同步改planMap里的数组就行,不用调整节点获取逻辑。如果你不想改DOM获取逻辑,换回原来的三个getElementById拼成数组也完全可以。另外这里用textContent替代innerHTML,因为写入的都是纯文本,性能更好也更安全。

HTML部分

原有HTML不需要做任何修改就能直接运行上面的JS,连原本写死的checked默认选中状态都能完美兼容。

后续扩展提示

如果之后要加季度套餐、终身套餐这类新选项,你只需要做三件事:

  • 在btn-group里加对应的radio选项,value按顺序递增即可
  • 在表格里加对应的展示列
  • 在planMap里加对应位置的数值数组
    全程不需要修改事件绑定和渲染的逻辑代码,维护成本比原来堆if分支的写法低很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:36:19