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

JavaScript收支追踪器:单选按钮值无法写入对象的问题排查

问题:单选按钮值无法写入收支对象的type属性

开发收支追踪器时,需要将选中的单选按钮值(income/expense)用于收支计算,但尝试把该值写入userExpense对象的type属性时,始终为空。在getTransactionType函数内部用console.log能正常输出选中值,但函数返回值为空,导致type属性无法赋值。

相关代码

JS代码

const TransactionType = document.getElementsByName('selector');

addbtn.addEventListener('click', function() {
  if (expense.value == '' || amount.value == '' || date.value == '') {
    alert('Please fill all the fields!!!');
    return;
  } else {
    const userExpense = {
      id: generateID(),
      type: getTransactionType(), // 此处无法获取到值
      date: date.value,
      expense: expense.value,
      amount: amount.value
    };
    userInput.push(userExpense);
    localStorage.setItem('data', JSON.stringify(userInput));
    location.reload();
  }
});

function getTransactionType() {
  TransactionType.forEach(item => {
    if (item.checked) {
      return item.value;
    }
  });
}

HTML代码

<!-- 选择交易类型的单选按钮 -->
<div class="container">
  <h3>Select the type of transaction:</h3>
  <ul>
    <li>
      <input type="radio" id="type-income" name="selector" value="income">
      <label for="type-income">Income</label>
    </li>

    <li>
      <input type="radio" id="type-expense" name="selector" value="expense">
      <label for="type-expense">Expense</label>
    </li>
    <!-- <button onclick=" getTransactionType()">see value</button> -->
  </ul>
</div>

问题原因

getTransactionType函数里用forEach循环时,回调函数中的return只会终止当前的循环迭代,不会让外层的getTransactionType函数返回值。所以函数默认返回undefined,导致userExpense.type始终为空。

解决方案

提供三种可行的修改方式,任选其一即可:

方案1:改用find方法(需先将HTMLCollection转为数组)

// 先将集合转为数组
const TransactionType = Array.from(document.getElementsByName('selector'));

function getTransactionType() {
  const selectedItem = TransactionType.find(item => item.checked);
  // 有选中项则返回值,否则返回空字符串
  return selectedItem ? selectedItem.value : '';
}

方案2:用普通for循环遍历

function getTransactionType() {
  for (let i = 0; i < TransactionType.length; i++) {
    if (TransactionType[i].checked) {
      return TransactionType[i].value;
    }
  }
  return ''; // 无选中项时的默认返回值
}

方案3:直接用querySelector查找选中项(最简洁)

这种方法无需提前获取元素集合,直接定位选中的单选按钮:

function getTransactionType() {
  const selectedItem = document.querySelector('input[name="selector"]:checked');
  return selectedItem ? selectedItem.value : '';
}

额外建议

可以在点击事件中增加单选按钮的校验,避免用户未选择类型就提交:

addbtn.addEventListener('click', function() {
  const transactionType = getTransactionType();
  if (expense.value == '' || amount.value == '' || date.value == '' || !transactionType) {
    alert('Please fill all the fields and select transaction type!!!');
    return;
  }
  // 后续逻辑不变
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:16:23