input type="month" 的值必须为 YYYY-MM 格式,如 "2024-03";浏览器不识别 "2024-3" 等变体;Safari 完全不支持,需降级处理;获取/设置值需严格格式匹配,解析时注意前导零与进制问题。

input type="month" 的值格式必须是 YYYY-MM
浏览器只接受 YYYY-MM 格式的字符串,比如 "2024-03"。写成 "2024-3"、"2024/03" 或 "March 2024" 都不会被识别,输入框会显示为空或 fallback 到当前月。
设置默认值时,必须用 JavaScript 赋值或直接在 HTML 中写死:
<input type="month" value="2024-03">
JavaScript 动态设置也得严格匹配:
document.querySelector('input[type="month"]').value = '2024-03';JavaScript 获取选中的月份要手动解析
input[type="month"] 的 value 是字符串,不是 Date 对象,也没有内置的年月分离方法。你得自己拆解:
立即学习“前端免费学习笔记(深入)”;
-
value为空字符串表示未选择(不是null或undefined) -
value.split('-')得到数组['2024', '03'],注意月份是带前导零的字符串 - 需要转数字时别直接
parseInt('03')—— 在旧版 JS 中可能被当八进制,稳妥写法是parseInt('03', 10)
常见错误:用 new Date(input.value) 试图构造日期 —— 这会得到 Invalid Date,因为 Date 构造函数不支持 YYYY-MM 格式。
移动端和桌面端行为差异明显
Chrome 和 Edge 桌面端会弹出简易月历控件,但 Safari 目前(截至 iOS 17 / macOS 14)**完全不支持** type="month",降级为普通文本框;Android Chrome 支持,但部分国产浏览器可能忽略该类型,渲染成 type="text"。
如果业务必须保证可用性:
- 用
Modernizr或特性检测:const supportsMonth = typeof document.createElement('input').type === 'string' && 'month' in document.createElement('input') - 不依赖原生控件时,建议搭配
select年份 +select月份,或引入轻量级日历库(如 flatpickr 的 month-only 模式)
设置 min/max 限制范围时格式不能错
min 和 max 属性同样要求 YYYY-MM 格式,且必须是合法日期(比如不能写 min="2024-13")。
常见陷阱:
-
min="2024-01"允许选中 2024 年 1 月及之后 —— 注意它不限制年份下限以外的月份(如 2023-12 不会被禁用,除非显式设min="2024-01") - 动态更新
min时,若新值格式非法(如拼接出"2024-5"),浏览器会静默忽略该属性,导致限制失效 - Safari 不支持
min/max在type="month"上生效(即使它渲染了该元素)
真实项目里,月份选择往往不是孤立需求——它常关联后续的报表周期、订阅起始时间或数据筛选。原生 type="month" 看似简单,但跨浏览器一致性和空值处理很容易漏掉边界情况。



















