为啥此输入类型=时间在某些带有“stepMismatch”的浏览器中无效:true?

Posted

技术标签:

【中文标题】为啥此输入类型=时间在某些带有“stepMismatch”的浏览器中无效:true?【英文标题】:Why is this input type=time invalid in some browsers with a "stepMismatch": true?为什么此输入类型=时间在某些带有“stepMismatch”的浏览器中无效:true? 【发布时间】:2021-12-18 20:06:51 【问题描述】:

我有一个非常简单的input type=time,根据MDN有一个有效的时间值:

:invalid  border-color: red; 
<input type="time" value="00:00:00.750" onchange="console.log(this.validity)" />

如果我只是运行 sn-p (Safari) 并编辑值 (Firefox 93),无论我将其编辑成什么,之后输入都会被视为 无效,带有"stepMismatch": true 有效性失败原因(Safari 15、Firefox 93 和 94、MacOS 12)。

这里发生了什么? step 是如何处理这种输入类型的,以及如何摆脱无效状态?

【问题讨论】:

"valid": true 在这里工作正常 对我也很好。我编辑了这个值,一切都很好。检查您的浏览器版本。 在 chrome 中很好,我在 mac 上的 safari 中得到一个 "stepMismatch": true,,将 step="any" 添加到输入修复它 根据 MDN (1) (2) 默认步长为 1 分钟,因此即使是具有非零秒部分的值也会被视为无效。 step="1" 会给你精确到毫秒。 经过进一步测试,step 实际上基于min(如果给定),否则value。因此,将值更改为 00:01:00.750 是完全有效的,因为它与默认值相差 1 步长。但是00:00:01.750 不会,00:00:00.250 也不会,因为默认步骤是一分钟。 【参考方案1】:

根据MDN,input[type=time] 的默认step 属性等于60,以秒为单位。

这意味着在没有明确的step 属性的情况下,时间只能以一分钟的倍数进行更改。

stepmin 属性(如果存在)一起使用,否则与 value 属性一起使用,因此设置初始 value="00:00:00.750" 意味着只有超过给定分钟 750 毫秒的值才被认为是有效的,具体取决于浏览器以及它如何显示输入,这对用户来说甚至是不可能的。

设置step="1" 可以让您根据需要设置时间的秒部分,step="0.001" 还应该让您设置毫秒。 step="any" 也是一个选项,但目前还没有明确定义。我个人认为这意味着它基本上完全禁用了分辨率检查,但浏览器可能不同意。

【讨论】:

step="0.001" 有点工作,但即使值不要求,它也会导致输入显示秒和毫秒。整个 UI 元素似乎相当“不要使用” 不稳定/未完成。必须动态设置 step 以使其与分配的值相匹配,这似乎不是开发人员应该做的事情。我也不明白使用step 的默认值有多大意义。 另外,即使您将时间设置为00:00:00.000 Firefox 仍然会使其无效。考虑到step,这怎么可能是无效的?

以上是关于为啥此输入类型=时间在某些带有“stepMismatch”的浏览器中无效:true?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这种带有动态输入值的表单验证不起作用?

为啥此代码会生成类型注释警告?

为啥带有抽象的 agda 不删除某些子句?

默认情况下为啥没有设置线程化 perl(带有 usethreads)?

为啥 FireFox 会冻结我在此登录表单中的输入?

为啥某些带有双反斜杠的路径抛出找不到路径异常的一部分?