如何用javascript实现表单验证【教程】
技术百科
夢幻星辰
发布时间:2026-01-28
浏览: 次 JavaScript表单验证需监听submit事件并调用preventDefault()拦截默认行为;禁用原生required等属性,改用validity对象或reportValidity()(注意兼容性);正则验证要贴合实际场景;错误提示须兼顾可访问性与用户体验;异步验证应提前触发并缓存结果。
JavaScript 表单验证不是靠 required 属性堆出来的,而是靠监听、拦截和反馈——否则用户点提交就跳转了,验证根本没机会生效。
用 addEventListener('submit') 拦住表单默认行为
HTML 的 required、type="email" 等只触发浏览器原生提示,不可控、不统一、样式难改。真要自定义逻辑,必须用 JS 拦截提交事件:
- 给
绑定submit事件,不是给按钮绑click - 第一件事是调用
event.preventDefault(),否则页面会刷新或跳转 - 验证失败时不要
return false,它在现代事件监听中无效;只靠preventDefault()就够
检查 input.reportValidity() 前先看浏览器兼容性
reportValidity() 能触发原生校验并返回布尔值,但 IE 完全不支持,Safari 10.1+ 才开始支持。实际项目中:
- 如果只要兼容 Chrome/Firefox/Edge(≥79),可放心用
input.reportValidity()或form.reportValidity() - 若需兼容 Safari ≤10 或旧版 Edge,得手动读
input.validity对象的各字段,比如input.validity.valueMissing、input.validity.typeMismatch - 注意:
reportValidity()会弹原生气泡提示,想完全自定义 UI 就别调它,直接查validity+validationMessage
手动验证邮箱、手机号等要用正则,但别信网上抄来的“万能正则”
例如邮箱验证,/^[^\s@]+@[^\s@]+\.[^\s@]+$/ 比「必须含字母+数字+特殊符号」那种更贴近真实场景,且不会误杀 me+newsletter@gmail.com 这类合法地址。
- 手机号优先按目标国家规则写:中国大陆用
^1[3-9]\d{9}$,别用带区号或座机的复杂模式 - 密码强度建议分层反馈,而不是“不通过”:分别检测长度、大小写字母、数字、特殊字符,逐条
提示
- 正则写完一定要用真实数据测:空格、中文输入法残留、粘贴带换行的内容,都可能让
.value.trim()漏掉
验证后显示错误信息,别只改 innerHTML
单纯往 里塞文字,会导致屏幕阅读器无法感知,也不利于 CSS 控制状态。
- 给对应
input加aria-invalid="true",错误信息容器加role="alert" - 用
input.setCustomValidity('用户名已存在')配合checkValidity(),能让form.checkValidity()统一返回 false - 清空错误时别忘了
input.setCustomValidity(''),否则后续验证永远失败
最常被忽略的是异步验证(比如用户名是否可用):它不能塞进 submit 事件同步执行,得提前用 blur 或 input 触发,并缓存结果、防重复请求——否则用户狂点提交,接口直接被刷崩。
# ai
# safari
# 浏览器
# css
# edge
# js
# Error
# 堆
# javascript
# java
# class
# html
# 接口
# chrome
# red
# Event
# 邮箱
# firefox
# 表单验证
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- TestNG的testng.xml配置文件怎么写
- 如何使用Golang安装依赖库_管理模块和第三方包
- 如何优化Golang内存分配与GC调度_Golan
- c++如何连接Redis c++ hiredis库
- 如何在 Go 项目开发中正确处理本地包导入与远程模
- Win11如何设置开机问候语 Win11修改登录界
- php能控制zigbee模块吗_php通过串口与c
- Win11怎么设置鼠标宏_Win11鼠标按键自定义
- Drupal 中渲染节点时出现 HTML 标签嵌套
- c++的mutex和lock_guard如何使用
- MAC如何安装Git版本控制工具_MAC开发环境配
- Win10怎样设置多显示器_Win10多显示器扩展
- 如何使用Golang sync.Map实现并发安全
- 如何使用Golang捕获测试日志_Golang t
- 如何在 Go 中调用动态链接库(.so)中的函数
- Mac怎么开启“任何来源”_Mac安装未签名应用的
- c++ std::atomic如何保证原子性 c+
- Python多线程使用规范_线程安全解析【教程】
- Win11怎么查看硬盘型号_Windows 11检
- c++中如何计算坐标系中两点间距离_c++勾股定理
- php嵌入式需要什么环境_搭建php+linux嵌
- c# 如何用c#实现一个支持优先级的任务队列
- Win11怎么退出微软账户_切换Win11为本地账
- php8.4如何调用com组件_php8.4win
- Win11怎么设置环境变量_Win11配置Path
- php订单日志怎么记录评价_php记录订单评价日志
- Windows如何使用BitLocker To G
- Python对象生命周期管理_创建销毁解析【教程】
- C++中的std::shared_from_thi
- windows如何禁用驱动程序强制签名_windo
- PythonFastAPI项目实战教程_API接口
- Mac自带的词典App怎么用_Mac添加和使用多语
- Windows怎样拦截WPS弹窗广告_Window
- php485返回数据不完整怎么办_php485数据
- Win10怎么更改用户名 Win10修改账户名称操
- 如何在同包不同文件中正确引用 Go 结构体
- php本地部署支持nodejs吗_php与node
- Windows10电脑怎么设置虚拟内存_Win10
- 手机php怎么转mp4_手机端php文件转mp4a
- 如何在 Python 中将 ISO 8601 时间
- Windows怎样关闭开始菜单广告_Windows
- Python大文件处理策略_内存优化说明【指导】
- Win11麦克风没声音怎么设置_Win11麦克风权
- Win11怎么设置任务栏大小_Windows11注
- VSC里PHP变量未定义报错怎么解决_错误抑制技巧
- php怎么下载安装后设置默认字符集_utf8配置步
- 如何使用Golang读取日志文件_Golang b
- Win11 explorer.exe频繁崩溃_修复
- Windows蓝屏错误0x00000018怎么处理
- 如何在Mac上搭建Golang开发环境_使用Hom


QQ客服