required 属性仅在原生表单提交(如 type="submit" 按钮或回车)时生效,不响应 form.submit() 调用;对 select 生效需首项 value="" 且未选中;空格或零宽字符仍被判定为空;iOS Safari 中 display: none 内的 required 输入框可能无法唤起键盘。

required 属性为什么没反应
加了 常见踩坑点: 关键差异: 每新增一行就给每个 实操要点: 典型误用场景: 真正可靠的节奏是: 最易被忽略的是:所有前端校验都只是体验层,required 却不报错、不阻止提交,大概率是表单触发方式错了。它只在原生提交时生效:必须用 或回车,不能靠 form.submit() 调用;也不能写在 type="hidden" 上——这些元素压根不参与校验流程。
required 对 生效的前提是:首项 且未选中任何有值的项;如果首项写了 selected,浏览器会认为“已选空值”,直接判定失败.value.trim() === "" 仍为 true,校验照样拦住display: none 容器里渲染的 required 输入框,可能无法唤起键盘,导致用户根本输不了type="email" 和 pattern 正则校验的区别
type="email" 是浏览器内置的轻量格式检查,只验证是否含 @ 和域名结构(如 a@b.c),不保证真实存在;而 pattern 需配合正则表达式做自定义规则,比如手机号 pattern="[0-9]{11}",但注意它只对 type="text"、"tel"、"email" 等少数类型生效。
type="email" 错误提示固定,无法改文案;pattern 必须配 title 属性才能显示友好提示,例如 title="请输入正确邮箱格式"
(?),写 pattern 时得绕开
type="number" 会自动过滤非数字字符,但用户仍可粘贴字母,此时需额外用 oninput 清洗:this.value = this.value.replace(/[^0-9.]/g, '')
动态表格行内校验怎么避免监听器爆炸
绑一次 addEventListener,不仅容易漏绑,还会积累监听器引用,造成内存泄漏。更稳的做法是事件委托:把监听器挂在 上,靠 event.target.matches('input[data-field]') 判断是否目标输入框。 加 data-row-id,所有该行内 的 name 带下标,如 amount-0、email-1
oninput 只做输入净化(删非法字符),不改样式、不发请求;onblur 才跑最终校验逻辑(比如金额范围、邮箱正则)rowId,避免用全局变量或 DOM 属性存状态,否则异步插入后容易错乱setCustomValidity 和 checkValidity 怎么配合用
setCustomValidity() 是手动控制校验状态的唯一入口,但它不会自动触发 UI 反馈;checkValidity() 才真正执行校验并触发 :invalid 伪类和错误提示。两者必须配合:先设状态,再调用检查。
setCustomValidity("错误") 但没触发 checkValidity(),界面毫无变化input 事件里频繁调 setCustomValidity("") 清空,结果用户还没输完就反复切换样式,体验卡顿oninvalid 事件覆盖提示,但它只在首次校验失败时触发,第二次失败就不进了,而且无法阻止默认弹窗onblur 时校验 → 失败则 setCustomValidity("xxx") → 立即调 input.checkValidity() 触发反馈;成功则 setCustomValidity("") 并让 CSS 的 input:valid 规则接管样式。required、pattern、setCustomValidity 全部可被禁用 JS 或 curl 绕过。后端必须用相同规则二次校验,并把错误字段精确映射回前端对应 name,否则用户填对了也提交失败。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











