前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库setCustomValidity 自定义校验提示
HTML表单与输入

setCustomValidity 设置错误后,怎样恢复原生校验?

调用 setCustomValidity("错误说明") 后,控件会因自定义错误持续无效;修正输入后必须调用 setCustomValidity("") 清除。reportValidity() 可让浏览器显示当前校验提示。

前端进阶之旅 · 一题精讲更新于 2026.09.29
HTML#表单与输入#表单
先看核心答案读代码示例
理解线索

自定义错误有状态

  1. setCustomValidity()写入或清除业务校验消息
  2. customError标记当前存在自定义错误
  3. reportValidity()请求浏览器展示当前约束结果

用户把值改对了,旧错误消息也不会自动消失;脚本必须主动清空。

核心回答

先记住这个答案

当原生属性表达不了业务条件,可以用 input.setCustomValidity("具体错误")。只要消息非空,validity.customError 就为真,表单提交会被阻止。用户修改输入后,浏览器不会自动清除这条脚本写入的错误;代码要重新检查条件,正确时调用 setCustomValidity("")。需要主动展示反馈时,再调用 reportValidity()。

  • 非空消息令 customError 为真
  • 清空字符串解除自定义错误
  • 输入变化时应重新计算错误
  • reportValidity() 可显示提示

两个字段必须一致

确认密码不是单个输入框能靠 required 或 pattern 独立判断的规则,需要比较两个字段。比较失败时把错误设在确认框上,用户修改任一相关字段后重新计算。

同步校验确认字段HTML
<input id="password" type="password" required>
<input id="confirm" type="password" required>
<script>
  const a = document.querySelector('#password')
  const b = document.querySelector('#confirm')
  function validate() {
    b.setCustomValidity(b.value && a.value !== b.value ? '两次密码不一致' : '')
  }
  a.addEventListener('input', validate)
  b.addEventListener('input', validate)
</script>

两个值不一致且确认框非空时,确认框保持自定义错误;一致后写入空字符串,恢复其他原生约束的正常判断。空确认框仍由 required 处理,不需要重复写一条自定义错误。 这里的脚本只负责浏览器端即时反馈。服务端依然要核对字段,因为任何前端校验都能绕过。

展示提示与设置状态是两步

setCustomValidity() 主要改变控件的校验状态和消息,不等于每次调用都立刻弹出气泡。用户提交或代码调用 reportValidity() 时,浏览器才会按当前状态展示交互式提示。

若业务自己绘制错误文字,也应让它与当前输入同步,并在修正后清除。不要把浏览器本地化的 validationMessage 字符串拿来判断错误类型;读 validity 的具体标志更可靠。

调用 setCustomValidity('两次密码不一致') 后,即使用户后来把值改对了,只要没有再调用 setCustomValidity('') 清空,控件仍是无效状态。把设置错误与清除错误放在同一套 input 或 change 逻辑里,别只在提交失败时设置一次。validationMessage 是浏览器当前给出的本地化提示文本,可以展示给用户,但不要在代码里解析提示字符串判断是哪种错误;应看 validity 对象上的具体标志。

回答前,多想一步

容易答错的地方

值改对后忘了清空旧错误
自定义消息会一直保留,导致表单始终不能提交。正确状态必须写回空字符串。
以为设置消息就立刻显示气泡
需要提交触发校验或主动调用 reportValidity();消息本身先改变的是有效性。
试着用自己的话回答

面试官还会怎么问?

怎么判断是自定义错误?

读取 input.validity.customError,不要比较提示文本。

清空自定义错误后是否一定有效?

不一定。required、pattern 等其他原生约束仍可能失败。

应该在 input 还是 submit 时重新校验?

相关字段变化时及时更新状态,提交时再做最后检查;服务端仍应验证。

从一道题,走向一组知识

把知识连起来

表单与输入

week 输入的值为什么像 2026-W01,一年一定有 52 周吗?

week 输入仍需业务侧检查周范围或排期是否可用。

语义与文档

abbr 的 title 能解释缩写吗,为什么还要在正文说明?

<abbr> 的 title 解释缩写,不用于表单错误消息。

参考资料

  • MDN 参考文档

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 两个字段必须一致
  3. 展示提示与设置状态是两步
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑