第 70 篇:前端表单全解|原生 JS 表单校验、复杂联动、错误处理、防重复提交
前言表单是前端业务占比最高的模块新增、编辑、搜索弹窗全部离不开表单。很多同学只会简单判断非空复杂联动、防重复提交、多字段联动、异步校验、错误聚焦处理经常踩坑。 本篇全部基于原生 JSjQuery不依赖任何 UI 组件库。一、表单校验思路基础校验非空、长度、手机号、邮箱、数字范围联动校验A 输入框的值影响 B 输入框是否显示、是否必填异步校验输入用户名请求后端判断账号是否已存在提交前整体校验校验失败定位到第一个错误输入框常用正则工具js运行const Regs { phone:/^1[3-9]\d{9}$/, email:/^\w([.-]\w)*\w([.-]\w)*\.\w{2,}$/ }二、完整表单校验示例html预览div div label用户名/label input typetext idusername span classerror/span /div div label手机号/label input typetext idphone span classerror/span /div button idsubmitBtn提交/button /divjs运行//校验函数 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) } })三、表单高频业务场景防重复提交点击按钮加锁接口请求完成解锁防止连续点击多次发请求。联动显隐选择下拉框的值控制其他表单项显示隐藏同时动态修改是否必填。异步校验失去焦点 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))编辑回填后端返回数据循环赋值给表单注意 null、undefined 空值处理。四、表单踩坑总结input 获取值一定要 trim ()去除首尾空格。异步校验不要写在 submit 里面提交的时候只做同步校验。一定要做提交锁避免短时间多次提交。校验失败自动 focus 定位到第一个错误输入提升用户体验。面试简答Q表单防重复提交有哪些方案js 加锁按钮置灰接口增加 token 令牌后端接口做幂等处理。小结中后台系统 70% 业务都是表单把表单的各种边界处理做好业务开发能力会直接上一个台阶。

相关新闻

终极跨平台文本编辑器Notepad--:国产替代的完整解决方案

终极跨平台文本编辑器Notepad--:国产替代的完整解决方案

终极跨平台文本编辑器Notepad--:国产替代的完整解决方案 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- 在…

2026/10/17 23:07:56 阅读更多 →
Linphone Android 6.0:企业级开源VoIP通信架构深度解析

Linphone Android 6.0:企业级开源VoIP通信架构深度解析

Linphone Android 6.0:企业级开源VoIP通信架构深度解析 【免费下载链接】linphone-android Linphone.org mirror for linphone-android (https://gitlab.linphone.org/BC/public/linphone-android) 项目地址: https://gitcode.com/gh_mirrors/li/linphone-android…

2026/10/18 5:53:51 阅读更多 →
CocosCreator游戏开发框架XForge:工程化与架构设计实战指南

CocosCreator游戏开发框架XForge:工程化与架构设计实战指南

1. 项目概述:为什么我们需要一个游戏开发框架?如果你用 CocosCreator 做过几个项目,尤其是团队项目,你大概率经历过这样的场景:UI 界面越来越多,脚本依赖关系乱成一团麻,一个按钮的点击事件可能…

2026/10/19 19:56:21 阅读更多 →

最新新闻

多格式票据识别系统设计与深度学习落地实践

多格式票据识别系统设计与深度学习落地实践

发票识别这个事儿,听起来好像就是个“拍照→出结果”的小工具,但真正在业务里跑过一圈的人都知道,它是个典型的“看着简单、做起来全是坑”的工程问题。尤其是当票据来源一多——纸质发票、电子发票、PDF打印件、拍照件、扫描件、甚至带水印和…

2026/10/20 13:22:17 阅读更多 →
链接器与静态库:按需提取与命令行顺序的完整规则解析

链接器与静态库:按需提取与命令行顺序的完整规则解析

如果你写过C程序,大概率被这样的报错折磨过:代码编译全过,最后链接阶段跳出一排“undefined reference to xxx”。我的第一反应永远是“漏了个-l”,可有一次为了修复某个构建问题,把-l加了又删、删了又加,折…

2026/10/20 13:22:17 阅读更多 →
Spring Boot健康检查:用Actuator告别端口探测假死

Spring Boot健康检查:用Actuator告别端口探测假死

前言:如果还在用端口判断服务“活着”,迟早要背锅先讲一个我亲眼见过的线上事故。某天深夜,一个核心服务集群的CPU被打满,进程还挂着,端口也正常,但所有请求都卡在连接池里超时。监控面板上一切绿油油&…

2026/10/20 13:22:17 阅读更多 →
AST反混淆:精准还原JavaScript成员表达式字符串拼接

AST反混淆:精准还原JavaScript成员表达式字符串拼接

1. 项目概述:当JavaScript代码被压缩成“天书”,我们如何找回可读的逻辑?你有没有遇到过这样的场景:接手一个维护多年的前端项目,打开源码一看,满屏是_0x4a7f[\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x7…

2026/10/20 13:22:17 阅读更多 →
LiteLLM模型分层路由实战:让大模型调用成本降90%

LiteLLM模型分层路由实战:让大模型调用成本降90%

先说一件最近发生在我自己项目里的事。某天我习惯性去后台拉了一下模型调用账单,发现光是一个自动摘要功能,一个月居然烧掉了六位数(单位是分)。点开日志一看,80%的请求都是那种输入很长、输出很短、逻辑简单的“体力活…

2026/10/20 13:22:17 阅读更多 →
Linux桌面路径中文化陷阱与XDG英文目录标准化方案

Linux桌面路径中文化陷阱与XDG英文目录标准化方案

1. 项目概述:为什么Linux桌面用户总在“文档”“下载”文件夹上栽跟头?你刚装好一个主流Linux发行版,比如某国产桌面系统或某国际知名社区版,登录进去,桌面干干净净,文件管理器打开一看——左侧边栏赫然列着…

2026/10/20 13:21:15 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →