input type="month" 是唯一原生支持年月选择的 HTML5 方式,值格式为 YYYY-MM 字符串,需严格补零且不含日,跨浏览器兼容性有限,老浏览器需降级为 text + pattern 校验。
HTML5 本身没有“格式化显示年月”的独立属性,input 元素通过 type="month" 原生提供年月选择界面和值格式(如 "2025-07"),这是浏览器直接支持、无需 JS 拼接的最简方案。
常见误区是试图用 type="date" + pattern 或 min/max 限制来模拟年月——这无法阻止用户选择具体日期,也不能保证提交值只含年月。
type="month" 在 Chrome、Edge、Safari(≥15.4)、Firefox(≥57)中可用;iOS Safari 支持但 UI 显示为年+月滚轮YYYY-MM 格式字符串(如 "2025-07"),不带日,符合后端常见解析预期value 写错格式会导致浏览器不渲染默认值,甚至在部分版本中触发 ValidityState.badInput === true。不是“自动截取”或“容错填充”。
value="2025/07"、value="2025-7"(月份未补零)、value="2025-07-15"(含日)String(date.getFullYear()) + "-" + String(date.getMonth() + 1).padStart(2, "0")
无论用户怎么选,input.value 返回的永远是类似 "2025-07" 的字符串,不是 Date 对象,也不带时区信息。这点常被前端忽略,导致用 new Date(input.value) 得到错误时间(如变成当月 1 日 00:00 UTC)。
立即学习“前端免费学习笔记(深入)”;
new Date(input.value + "-01")
YYYY-MM 切分解析,避免因语言差异(如 Python 的 datetime.fromisoformat() 不支持纯年月)出错IE 完全不支持,旧版 Android WebView 也常失效。降级方案不是“加 polyfill”,而是务实处理:用 type="text" + pattern="\d{4}-\d{2}" + inputmode="numeric",并辅以 JS 校验。
input 事件实时过滤非数
maxlength="7" 限制长度,防止输长inputmode="numeric" 在多数安卓机上会唤出数字键盘,但 iOS 需配合 pattern="[0-9]*" 才更可靠"2025-7"),前端直接赋值就导致 input 空白;又或者在表单 reset 后未重置 value,造成状态残留。这些细节比语法本身更影响交付稳定性。