Cod*_*gue 18 javascript validation html5
使用input.validity.valid,为什么我的数字输入0.
对此方案中的值返回有效?
<input type="number" min="1" max="999" step="1" value="0." id="one" /> <!--Valid??-->
<input type="number" min="1" max="999" step="1" value="0.0" id="two" /> <!--fine-->
<input type="number" min="1" max="999" step="1" value="0" id="three" /> <!--fine-->
Run Code Online (Sandbox Code Playgroud)
Chrome 37.0.2062.103 m
编辑:
奇怪的是,任何带有句号结尾的负数也会破坏验证:
<input type="number" min="1" max="999" step="1" value="-14." id="one" />
Run Code Online (Sandbox Code Playgroud)
这里实际上有两个答案:
0.
当您在输入字段中输入/设置值时,无法正确验证值.required
.严格地说,它是第一个导致你所看到的行为,因为它阻止#2发生,但如果错误在Chrome中得到修复,那么问题就在于(即只处理初始标记,而不是任何随后的用户交互),#2将适用.
值得注意的是,#2是导致Firefox中类似(但不完全相同)行为的原因.
#1的原因是Chrome在其rangeUnderflow
检测和badInput
检测中使用了不同的解析算法.
rangeUnderflow
使用Decimal::fromString(...)
该方法返回NaN
如果输入的结束.
导致rangeUnderflow
返回false
:
if (!numericValue.isFinite())
return false;
Run Code Online (Sandbox Code Playgroud)
相反,badInput
使用StringToDoubleConverter::StringToDouble(...)
基本上忽略尾随,.
因此输入不被视为"坏".
根据规格:
如果字符串包含以下内容,则该字符串是有效的浮点数:
- 可选地,U + 002D HYPHEN-MINUS字符( - ).
- 按给定顺序执行以下一项或两项操作:
- 一系列一个或多个ASCII数字.
- 单个U + 002E FULL STOP字符(.).
- 一系列一个或多个ASCII数字.
请注意,2.2.2不是可选的 - 即如果你有一个,.
你必须有数字.
所以这badInput
是不正确的.(如果Chrome至少一致0.
认为有效,rangeUnderflow
则会检测到)
但是,如果/当他们修复Chrome中的错误时,问题中的HTML 仍会显示为有效.为什么?
例如,如果您value="aaa"
在HTML中设置.输入仍将显示为有效,即使aaa
将导致badInput
要true
.
这是因为在解析/呈现页面时,Chrome会对属性值运行值清理算法.当它看到一个不是有效浮点数的值时,它必须根据规范的要求将输入值设置为空字符串.除非输入已标记,否则空字符串被视为有效required
.这在Chrome中目前不会发生,value="0."
因为它(错误地)传递了值清理算法.但是,如果/当他们修复Chrome中的错误时,就会发生这种情况.
如果你实际键入aaa
输入,它将显示为无效,即badInput===true
.同样,在Firefox和Chrome中,如果他们修复了这个bug,如果你输入0.
字段,它会给出badInput===true
,因此valid===false
.
归档时间: |
|
查看次数: |
562 次 |
最近记录: |