news 2026/8/7 13:53:22

第 70 篇:前端表单全解|原生 JS 表单校验、复杂联动、错误处理、防重复提交

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第 70 篇:前端表单全解|原生 JS 表单校验、复杂联动、错误处理、防重复提交

前言

表单是前端业务占比最高的模块,新增、编辑、搜索弹窗全部离不开表单。很多同学只会简单判断非空,复杂联动、防重复提交、多字段联动、异步校验、错误聚焦处理经常踩坑。 本篇全部基于原生 JS+jQuery,不依赖任何 UI 组件库。

一、表单校验思路

  1. 基础校验:非空、长度、手机号、邮箱、数字范围
  2. 联动校验:A 输入框的值,影响 B 输入框是否显示、是否必填
  3. 异步校验:输入用户名,请求后端判断账号是否已存在
  4. 提交前整体校验,校验失败定位到第一个错误输入框
常用正则工具

js

运行

const Regs = { phone:/^1[3-9]\d{9}$/, email:/^\w+([.-]\w+)*@\w+([.-]\w+)*\.\w{2,}$/ }

二、完整表单校验示例

html

预览

<div> <div> <label>用户名</label> <input type="text" id="username"> <span class="error"></span> </div> <div> <label>手机号</label> <input type="text" id="phone"> <span class="error"></span> </div> <button id="submitBtn">提交</button> </div>

js

运行

//校验函数 function validateForm(){ let pass = true const username = $("#username").val().trim() const phone = $("#phone").val().trim() $(".error").text("") if(!username){ $(".error").eq(0).text("用户名不能为空") pass = false $("#username").focus() } if(!Regs.phone.test(phone)){ $(".error").eq(1).text("手机号格式错误") if(pass) $("#phone").focus() pass = false } return pass } //防重复提交:增加锁标记 let submitLock = false $("#submitBtn").on("click",async function(){ if(submitLock) return if(!validateForm()) return submitLock = true $(this).prop("disabled",true) try{ const params = { username:$("#username").val().trim(), phone:$("#phone").val().trim() } const res = await Request.post("/api/save",params) Component.toast("保存成功") }catch(err){ Component.toast("保存失败") }finally{ submitLock = false $(this).prop("disabled",false) } })

三、表单高频业务场景

  1. 防重复提交:点击按钮加锁,接口请求完成解锁,防止连续点击多次发请求。
  2. 联动显隐:选择下拉框的值,控制其他表单项显示隐藏,同时动态修改是否必填。
  3. 异步校验:失去焦点 blur 的时候调用接口校验,不要每输入一个字符就请求接口,配合防抖。

js

运行

$("#username").on("blur",Utils.debounce(async function(){ const val = $(this).val().trim() if(!val) return const res = await Request.get("/api/checkUser",{name:val}) if(res.code!==200){ $(".error").eq(0).text("账号已存在") } },400))
  1. 编辑回填:后端返回数据,循环赋值给表单,注意 null、undefined 空值处理。

四、表单踩坑总结

  1. input 获取值一定要 trim (),去除首尾空格。
  2. 异步校验不要写在 submit 里面,提交的时候只做同步校验。
  3. 一定要做提交锁,避免短时间多次提交。
  4. 校验失败自动 focus 定位到第一个错误输入,提升用户体验。

面试简答

Q:表单防重复提交有哪些方案?

  1. js 加锁,按钮置灰;
  2. 接口增加 token 令牌;
  3. 后端接口做幂等处理。

小结

中后台系统 70% 业务都是表单,把表单的各种边界处理做好,业务开发能力会直接上一个台阶。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/7 13:52:24

基于CAPL脚本实现LIN总线睡眠唤醒自动化测试的完整指南

1. 项目概述&#xff1a;为什么LIN总线的睡眠唤醒是测试中的“硬骨头”&#xff1f; 在汽车电子网络测试里&#xff0c;LIN总线的睡眠与唤醒机制&#xff0c;绝对算得上是一个让不少工程师又爱又恨的“经典科目”。爱它&#xff0c;是因为这套机制直接关系到车辆的静态电流和能…

作者头像 李华
网站建设 2026/8/7 13:50:57

本地AI视频生成工具影控台1.2.0部署与API集成实践

这次我们来看一个本地 AI 视频生成工具“影控台”的最新版本更新。影控台是一个专注于图生视频和文生视频的本地化部署工具&#xff0c;最新发布的 1.2.0 版本在功能、性能和用户体验上都有显著变化。对于关注 AI 视频生成、本地部署、显存占用和批量任务处理的开发者来说&…

作者头像 李华
网站建设 2026/8/7 13:50:48

JDBC外键与时间处理的实战解决方案

1. JDBC外键与时间处理的核心挑战 在Java数据库开发中&#xff0c;JDBC作为连接Java应用与关系型数据库的桥梁&#xff0c;其外键和时间处理一直是实际项目中的痛点。我见过太多团队在这两个问题上栽跟头——外键约束导致的数据操作异常、时区转换引发的时间错乱&#xff0c;这…

作者头像 李华
网站建设 2026/8/7 13:50:36

如何免费获取数千个专业3D资产?Poly Haven Assets插件终极指南

如何免费获取数千个专业3D资产&#xff1f;Poly Haven Assets插件终极指南 【免费下载链接】polyhavenassets A Blender add-on to integrate our assets natively in the asset browser 项目地址: https://gitcode.com/gh_mirrors/po/polyhavenassets 想在Blender中轻松…

作者头像 李华
网站建设 2026/8/7 13:50:17

如何快速掌握线性代数:5种矩阵分解的完整可视化指南

如何快速掌握线性代数&#xff1a;5种矩阵分解的完整可视化指南 【免费下载链接】The-Art-of-Linear-Algebra-zh-CN Graphic notes on Gilbert Strangs "Linear Algebra for Everyone", 线性代数的艺术中文版, 欢迎PR. 项目地址: https://gitcode.com/gh_mirrors/t…

作者头像 李华
网站建设 2026/8/7 13:48:37

宁乡网站建设点燃网络:从传统制造到数字营销的本地化突围与未来展望

如今,站在宁乡这片充满活力的土地上,你是否经常会有这样一种感触?那就是周围的变化太快了,快到你还没来得及细品,旧的面貌就已经被新的景象所取代。走在花明楼的大街上,你能感受到游客的热情;走在金洲大道上,你能听到机械运转的轰鸣声;而在互联网的云端,更是有一张巨…

作者头像 李华