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

JavaScript匹配表单输入id与数组对象id仅匹配最后一项问题排查

问题原因

  • 代码的核心问题是onfocus事件被重复覆盖:遍历errorMsg数组时,每一轮都会调用formElements函数,而这个函数会给所有.form-control输入框重新赋值onfocus回调。第一轮传fname时绑定的判断逻辑会被第二轮传lname的逻辑完全覆盖,最终所有输入框的焦点事件只会判断是否等于lname,因此只有最后一个输入框能匹配成功打印true。
  • 额外HTML语法问题:lname输入框外层多写了一个多余的闭合div标签,建议修正。

修复方案

调整逻辑,只给所有输入框绑定一次焦点事件,直接判断当前输入框的id是否存在于errorMsg数组中即可,修复后的代码如下:

修复后JS代码

let items = document.querySelectorAll('.form-control');
let errorMsg = [
  {
    'id': 'fname',
    'msg': 'first name is required'
  },
  {
    'id': 'lname',
    'msg': 'last name is required'
  }
];
// 提前提取所有需要校验的id,简化后续判断逻辑
let validIds = errorMsg.map(item => item.id);

// 仅绑定一次焦点事件即可
items.forEach(input => {
  input.onfocus = function(e) {
    console.log(validIds.includes(e.target.id));
    // 如果需要获取对应错误提示,可使用下面的代码
    // let currentMsg = errorMsg.find(item => item.id === e.target.id)
  }
});

修正后HTML代码

<form method="get" id="myForm">
  <div>
    <input type="text" class="form-control" id="fname" name="fname">
  </div>
  <div>
    <input type="text" class="form-control" id="lname" name="lname">
  </div>
  <button type="submit" name="send">send</button>
</form>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:57:02