input type="time" 的 disabled 是布尔属性,存在即禁用,不存在即启用;readonly 对其无效,禁用时表单不提交该值,需用隐藏域等方案补救。

input type="time" 支持原生 disabled 属性,直接加即可禁用,但要注意它和 readonly 的行为差异远比视觉上更关键。
为什么不能只写 disabled="false" 或删掉属性?
HTML 中 disabled 是布尔属性:存在即禁用,不存在即启用。写成 disabled="false"、disabled="0" 甚至 disabled="" 都等效于禁用——浏览器只看属性是否在标签里,不解析值。
- 正确静态写法:
<input type="time" disabled> - JS 动态启用:
el.disabled = false(不是removeAttribute('disabled'),后者在旧 Safari 有兼容问题) - JS 动态禁用:
el.disabled = true(别用setAttribute('disabled', 'true'),语义错且冗余) - 检查状态统一用:
if (el.disabled) { ... },返回布尔值,可靠
disabled 和 readonly 在 type="time" 上根本不能互换
readonly 对 input type="time" 无效——规范只允许 text、search、tel、url、email、number、password 和 textarea 支持该属性。给 time 输入框加 readonly,浏览器会忽略,输入仍可编辑。
- 想“锁住时间但后端还要收到值” → 只能用
disabled = false+ 其他手段(如隐藏域存值、CSS +pointer-events: none模拟禁用) - 想“彻底禁用且不提交” → 用
disabled = true,提交时该字段不会出现在FormData或 URL 查询串中 - 误用
disabled导致后端收不到时间值,是调试中最常漏查的点
移动端和屏幕阅读器的隐藏坑
Chrome / Firefox 桌面端对 disabled type="time" 有较明显灰度样式,但 iOS Safari 默认几乎无视觉反馈,用户可能误以为还能点开时间选择器。
- 建议补 CSS:
input[type="time"]:disabled { background: #f5f5f5; cursor: not-allowed; opacity: 0.7; } - 屏幕阅读器会播报 “disabled”,但不会读出当前时间值;如果该时间对用户关键(比如预约截止时间),得额外加
aria-label或旁白说明 - 禁用后,
el.value仍可读取(返回字符串如"14:30"),但表单序列化时被跳过——这点常被误认为 JS 读不到值
真正难处理的不是怎么加 disabled,而是业务上需要“显示时间、不可改、必须传值”时,type="time" 原生不支持 readonly,只能退到降级方案:用 type="text" + 自定义时间格式校验,或保留 type="time" 但配合隐藏域同步值。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











