不能安全禁用 Firefox 中 date 输入框的键盘输入,因这违反 WCAG 2.1 可访问性要求;readonly 会禁用日历点击,onKeyDown 在 Firefox 中对原生 date 无效;应改用 min/max 约束+change 校验+setCustomValidity 实现合规控制。

不能安全地禁用 Firefox 中 input[type="date"] 的键盘输入——这不是技术限制,而是可访问性红线。
为什么 readonly 和 onkeydown 都不奏效
在 Firefox 中,readonly 会直接禁用日历图标点击,用户既不能键盘输、也不能点选日期;而 onkeydown 或 preventDefault() 在原生 date 输入上基本无效,因为 Firefox 对该类型输入的键盘事件捕获机制特殊,且不保证拦截所有路径(如粘贴、IME 输入、辅助技术操作)。
-
readonly="true"→ 日历面板不可触发,违背“所有功能必须可通过键盘完成”的 WCAG 2.1 要求 -
onkeydown={e => e.preventDefault()}→ 在 Firefox 中对 date 输入无实际拦截效果,且破坏屏幕阅读器导航 - 试图用
tabindex="-1"或blur()强制失焦 → 导致键盘焦点丢失,无法继续表单填写
真正该做的:用 min/max + change 校验守住底线
浏览器允许键盘输入是设计使然,你不需要、也不该阻止它。重点是确保非法值无法留存或提交:
- 设置
min="2026-10-21"和max="2026-12-31"(注意必须是YYYY-MM-DD格式,补零) - 监听
change事件(不是input),用new Date(e.target.value)做真实日期比较,避免字符串比大小出错 - 校验失败时调用
e.target.setCustomValidity("提示文字")+e.target.reportValidity(),触发原生无障碍错误反馈 - 必要时重置值:
e.target.value = ""或回填上一个合法值(需自行缓存)
如果业务强要求“只读但必须提交”
原生 input[type="date"] 没有可靠的“只读+可提交+禁键盘”三全方案。此时应放弃 hack,改用更可控的路径:
- 保持
disabled=false,但用min/max锁死为单日(如min="2026-10-21" max="2026-10-21"),视觉上仍可聚焦,但日历中仅剩一天可选 - 或监听
click和focus并event.preventDefault(),再配合一个隐藏存原始值——但这会切断键盘导航链,需额外处理tabindex和 ARIA - 终极解法:换 flatpickr、@mobiscroll/datetime 等库,它们能真正禁用键盘输入、保留日历、并提供完整键盘导航与语义化支持
最容易被忽略的是:Firefox 的键盘支持不是 bug,是合规刚需。强行禁用,第一个受影响的不是普通用户,而是依赖屏幕阅读器或仅用键盘操作的人。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











