
本文介绍一种健壮、语义化且符合 HTML5 表单验证规范的方式,解决多 Tab 表单中“提交时无法自动定位到含空必填项的 Tab”问题,避免 invalid form control is not focusable 报错,并实现错误 Tab 的高亮与自动切换。
本文介绍一种健壮、语义化且符合 html5 表单验证规范的方式,解决多 tab 表单中“提交时无法自动定位到含空必填项的 tab”问题,避免 `invalid form control is not focusable` 报错,并实现错误 tab 的高亮与自动切换。
在含多个 Tab 的模态窗表单中(如客户信息录入),若部分 Tab 内存在 required 字段但未填写,用户点击「提交」时浏览器会触发原生验证,但因非激活 Tab 中的 或
你当前的 JavaScript 逻辑试图遍历所有 Tab 对应的 DOM 容器(divs[i]),筛选其中 required 且值为空的字段,再通过 tabs[onglet].click() 切换 Tab。但结果却总返回 onglet = 0 —— 根本原因在于:divs 数组存储的是 href 属性值(如 "#block_add_client_adr_comm"),而 for...in 遍历对象属性名(即字符串索引 "0", "1", "2"),但 divs[i] 在循环中被当作 CSS 选择器使用时,i 是字符串而非数字,且 $(divs[i] + " input,textarea,select") 实际匹配的是第一个 Tab 容器内所有 required 字段(因为 divs[0] 永远是第一个 href),而后续 i="1" 时 divs["1"] 才是第二个,但你的 for...in 顺序和 tabs 索引映射关系已错乱,且未做 i 类型转换,导致逻辑失效。
更关键的是:该方案绕过了浏览器原生 invalid 事件机制,手动模拟验证,既冗余又易出错。
✅ 推荐采用 事件驱动 + 语义化结构 的现代解法:
✅ 正确思路:监听 invalid 事件,动态标记并跳转
利用 HTML5 表单的 invalid 事件(冒泡阶段捕获),配合 preventDefault() 阻止默认报错行为,精准定位首个无效字段所属的 Tab 容器(如