如何获取不完整的datetime-local输入值

13

我在页面上有以下表单:

<input id='startDate' type='datetime-local' step=1 name='startDate'>

我使用这段代码来获取字段的值:

var start = $('#startDate').val();

我的问题是,直到每个部分都被填写(包括小时、分钟、秒和上午/下午),输入字段的值才保持未定义状态。我希望能够从表单中获取一个值,只需要选择年份即可。

我该如何做到这一点?我很乐意将没有填写的值置零,但我无法弄清楚如何获取用户填写的日期时间局部。

我知道可以使用jQuery UI日期选择器的 timepicker附加组件 来实现这一点,但我不想走这条路——我更喜欢Chrome的实现方式。


无法获取AM/PM,因为它是ISO日期格式(表示24小时制),所以您需要进行转换... - Endless
jQuery的.val()方法已经帮我完成了转换。我的问题是当日期时间没有完全限定时。 - Matthew Herbst
1个回答

4
W3C的Date State规范定义了一个清理算法:
值的清理算法如下: 如果元素的值不是有效的日期字符串,则将其替换为空字符串。
每当设置输入元素的值时,就会调用该算法,如DOM输入值规范中所定义:
获取时,它必须返回元素的当前值。在设置时,它必须将元素的值设置为新值,并将元素的脏值标志设置为true,如果元素的type属性的当前状态定义了一个,则应调用值清理算法,然后,如果元素具有文本输入光标位置,应将文本输入光标位置移动到文本字段的末尾,取消选择任何已选文本并将选择方向重置为无。
因此,当日期无效时,“value”属性将始终为空字符串。似乎没有指定“原始/脏/用户键入的文本值”属性,因为毕竟它不是文本输入。
在我看来,这是一件好事,它简化了表单验证,因为无效的日期被视为虚假值(空字符串),它还使浏览器更自由地实现日期输入的UI。

我能否在事件到达净化算法之前捕获它,以便我可以手动将其强制转换为有效的日期字符串?即使这意味着向用户显示日期时间未填充部分的默认值,我也很乐意使用onchange来执行此操作。 - Matthew Herbst
输入是本地感知的,这意味着我会看到一个24小时制的时钟,而你可能会看到一个12小时制和上午/下午选项。所以我认为最好不要去改变它。 - Endless
您可以禁用验证并自行完成,但在获取input.value时它已经是有效的。 - Endless
3
有一个有用的属性可以使用,即 input.validity,它将提供以下内容:badInput customError patternMismatch rangeOverflow rangeUnderflow stepMismatch tooLong typeMismatch valid - Endless

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接