为什么输入类型=数字允许多个小数?

时间:2016-08-03 14:49:12

标签: html html5

我理解为什么number inputs allow "e" or "E",但我很困惑为什么它允许多个小数。

如果你看一下valid floating-point numbers的规范,你会得到:

  

字符串是有效浮点数,如果它包含:

     
      
  1. 可选地," - " (U + 002D)角色。
  2.   
  3. 以下给定顺序中的一个或两个:      
        
    1. 一系列一个或多个ASCII数字。
    2.   
      1.   
      2. 单身"。" (U + 002E)字符。
      3.   
      4. 一系列一个或多个ASCII数字。
      5.   
    3.   
  4.   
  5. 任选地:      
        
    1. 要么" e" (U + 0065)字符或" E" (U + 0045)角色。
    2.   
    3. 可选地," - " (U + 002D)字符或" +" (U + 002B)字符。
    4.   
    5. 一系列一个或多个ASCII数字。
    6.   
  6.   

我在这里看到的所有内容都表明输入中只允许一个小数点,并且在指定带有" e"的指数之前必须包含,并且无论如何,只能有一个" e"

然而,允许这样的输入:

  • 1 ..... 2
  • ......
  • EEEE ........
  • 1.0.0.01.0

等等。

在IE 11中,它允许我键入任何字符串,但除非它是"有效" .value""的数字。在这种情况下,1......e有效,但eeeeee不是。如果IE确定该值无效,则在远离输入的焦点处,显示屏空白,阻止用户修改现有输入。

在Chrome 51中,它只会让我输入数字,+ / - ,e / E和"。"。当我检查带有额外小数的10.0.输入值时,它仍会返回10.0的值,但如果我输入10.0.010..,则字符串将恢复为空。 Chrome将保留显示无效输入。

当字符串变空时,它会阻止对输入进行进一步的验证检查并提供有用的用户反馈。

那么,为什么数字输入字段中允许多个小数开头,为什么它们在浏览器之间处理得如此奇怪呢?

1 个答案:

答案 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项目提交错误报告,让他们知道正在进行一些时髦的事情。