pattern仅在提交或checkvalidity()时校验,需同时满足type为text/search/tel/url/email/password、required、title三条件;正则勿加/^$/,推荐[0-9]{6}而非\d{6};title是唯一提示出口;复杂校验必须用js。

pattern 属性本身不校验、不提示、不实时响应——它只在表单提交或调用 checkValidity() 时做一次全匹配判断。想让它真正起作用,必须同时满足三个硬性条件:type 是文本类、带 required、且设了 title。
type 必须是 text/search/tel/url/email/password 之一
浏览器只对这六种 type 解析 pattern;其他类型如 number、date、range 会直接忽略该属性——因为输入值早已被转成数字或日期对象,正则根本收不到原始字符串。
-
<input type="number" pattern="[0-9]{6}">:永远不触发校验,iOS 下还可能自动删前导零 -
<input type="tel" pattern="1[3-9]\d{9}" required>:✅ 正确,tel保留字符串且唤起数字键盘 -
<input type="text" inputmode="numeric" pattern="[0-9]{6}" required>:✅ 兼顾移动端体验与格式控制
正则写法不能带 /^$/ 或斜杠修饰符
浏览器内部会自动给你的 pattern 值加上 ^ 和 $,你只需提供核心匹配逻辑。加错符号会导致静默失效,而且没有报错提示。
- ❌
pattern="/^[0-9]{6}$/":斜杠被当作文本字面量,整个表达式变成匹配/123456/ - ❌
pattern="^[0-9]{6}$":锚点冗余,旧版 Safari 可能跳过整条规则 - ❌
pattern="\d{6}":部分 Safari/IE 不识别\d,推荐写成[0-9]{6} - ✅
pattern="[a-zA-Z][a-zA-Z0-9_]{3,15}"(用户名) - ✅
pattern=".*[0-9]{6}$"(末尾六位数字,如“张三 123456”)
title 是唯一提示出口,不设等于没写规则
title 不参与校验逻辑,但它是浏览器错误气泡、hover 提示、input.validationMessage 唯一复用的内容。没设 title,Chrome/Firefox 默认文案是“请与所要求的格式匹配”,用户完全不知道要输什么。
- ❌
title="格式错误":无信息量,无法指导修正 - ✅
title="请输入6位数字,不要加空格或字母":明确、可操作 - iOS Safari 对
title支持较弱,若需强提示,得用 JS 的setCustomValidity()补充
复杂校验必须用 JavaScript 接管
pattern 天然不支持跨字段比对、动态规则、API 调用或实时反馈。以下场景它完全无能为力:
- 密码与确认密码是否一致:需要监听两个
input的值并比对 - 邮箱域名白名单(如只允许
@company.com):pattern 无法做子串判断 - 实时高亮错误(
input或blur事件中检查):pattern 只在提交时触发 - 用户名是否已存在:必须调用后端 API
真实项目里,你几乎总得补一段 JS 监听 input 或 blur,调用 new RegExp(pattern).test(value) 做实时反馈,并用 setCustomValidity() 控制提示文案——尤其是当用户改完内容后,必须手动清空错误状态,否则 validity.valid 不会自动刷新。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











