我理解为什么数字输入允许"e"或"E",但我很困惑为什么它允许多个小数.
如果查看有效浮点数的规范,可以得到:
如果字符串包含以下内容,则该字符串是有效的浮点数:
- 可选地," - "(U + 002D)字符.
- 按给定顺序执行以下一项或两项操作:
- 一系列一个或多个ASCII数字.
- 一个单一的"." (U + 002E)字符.
- 一系列一个或多个ASCII数字.
- 可选:
- 可以是"e"(U + 0065)字符或"E"(U + 0045)字符.
- 可选地," - "(U + 002D)字符或"+"(U + 002B)字符.
- 一系列一个或多个ASCII数字.
我在这里看到的所有内容都表明输入中只允许一个小数点,并且在指定带有"e"的指数之前必须包含小数,并且无论如何都只能有一个"e".
然而,允许这样的输入:
等等.
在IE 11,这将让我在任何字符串我什么,但除非它是一个"有效"号码的类型.value是"".在这种情况下, 1......e是有效的,但eeeeee不是.如果IE确定该值无效,则在远离输入的焦点上,显示屏空白,从而阻止用户修改现有输入.
在Chrome 51中,它只会让我输入数字,+/ - ,e/E和".".当我检查输入的值,如10.0. 额外的十进制,它仍然返回值10.0,但如果我键入10.0.0或10..字符串恢复为空.Chrome将保留显示无效输入.
当字符串变空时,它会阻止对输入进行进一步的验证检查并提供有用的用户反馈.
那么,为什么在数字输入字段中允许多个小数开始,为什么它们在浏览器之间如此奇怪地处理呢?
我做了一些挖掘,我有预感这可能是 Chrome 数字输入实现中的一个错误。
值得注意的是这一行:
event->setText(locale().stripInvalidNumberCharacters(event->text(), "0123456789.Ee-+"));
Run Code Online (Sandbox Code Playgroud)
这意味着0123456789.Ee-+根据 Chrome 来说这些都是合法的字符。其他所有内容都被删除,但这些角色被允许通过。但是,不会检查输入的值是否是真正的实际数字,您可以输入由这些字符组成的无意义字符串,并使这些字符串仍然被视为有效(例如+++111ee...or ++++or...+++...+++...+++123321或类似的内容)。
在关于允许任何字符的数字输入问题的原始票证中,这似乎可能是作者的意图。您可以在 Chromium 的问题跟踪器上查看原始问题。
不管怎样,可能值得向 Chromium 项目提交一份错误报告,让他们知道正在发生一些奇怪的事情。
| 归档时间: |
|
| 查看次数: |
1104 次 |
| 最近记录: |