我理解为什么number inputs allow "e" or "E",但我很困惑为什么它允许多个小数。
如果你看一下valid floating-point numbers的规范,你会得到:
字符串是有效浮点数,如果它包含:
- 可选地," - " (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将保留显示无效输入。
当字符串变空时,它会阻止对输入进行进一步的验证检查并提供有用的用户反馈。
那么,为什么数字输入字段中允许多个小数开头,为什么它们在浏览器之间处理得如此奇怪呢?
答案 0 :(得分:2)
我做了一些挖掘工作,我预感到这可能是Chrome实现数字输入的一个错误。
Here's the changeset where they fixed which characters were allowed in an input of type number.
值得注意的是这一行:
event->setText(locale().stripInvalidNumberCharacters(event->text(), "0123456789.Ee-+"));
这意味着根据Chrome,0123456789.Ee-+
都是合法字符。其他一切都被剥夺了,但这些角色被允许通过。但是,没有检查输入的值是否是实际的实际数字,您可以输入由这些字符组成的无意义字符串,并使这些字符串仍被视为有效(例如+++111ee...
或{{1} }或++++
或类似的东西。)
在允许任何字符的号码输入问题的原始票证中,似乎这可能是作者的意图。 You can check the original issue on Chromium's issue tracker
无论哪种方式,可能值得向Chromium项目提交错误报告,让他们知道正在进行一些时髦的事情。