为什么带有"数字"类型的html输入允许在字段中输入字母"e"?

Gna*_*ale 196 html5 numbers input

我有以下html5输入元素:

<input type="number">
Run Code Online (Sandbox Code Playgroud)

为什么这个输入允许在输入字段中输入字符'e'?无法输入其他字母字符(如预期的那样)

使用chrome v.44.0.2403.107

看看我的意思:http://www.w3schools.com/html/tryit.asp?filename = tryhtml_input_number

j08*_*691 192

因为这正是规范所说的应该如何运作.数输入可以接受浮点数,包括负符号和eE字符:

浮点数由以下部分组成,完全按以下顺序排列:

  1. 可选地,第一个字符可以是" e"字符.
  2. " E" 中范围内的一个或多个字符.
  3. 可选地,以下部分,完全按以下顺序:
    1. 一个" -"字符
    2. " 0—9" 范围内的一个或多个字符
  4. 可选地,以下部分,完全按以下顺序:
    1. 一个" ."字符或" 0—9"字符
    2. 可选地," e"字符或" E"字符
    3. " -" 中范围内的一个或多个字符.

  • @Simon,使用`e`对于缩小大数字很有用,否则输入会很麻烦.作为一个简单的例子,'2e2 = 2*10 ^ 2 = 200` (8认同)
  • 我仍然对此感到困惑,首先我不是数学家,所以"e"在一个数字的背景下代表什么?第二,我不明白为什么input.value只要你在其中写一个"e"就是一个空字符串,即使有数字并允许该字符... (4认同)
  • @Anthony否,`e`代表Exponent. (4认同)
  • 啊,谢谢。我正在查看 [错误的规范](http://dev.w3.org/html5/html-author/) (3认同)
  • @Simon*"只要我写e"*,嗯,是的"4e"不是数字,而例如"4e + 0"是有效数字(4).如果你有一些"实时"客户端javascript代码使用部分用户输入,你必须给用户时间来完成他的输入编辑以提供完整的价值,而不是干扰编辑的一半.如果您从"4e + 0"输入中"未定义",请修复"到数字"解析器.问题中的示例效果很好,报告"4e + 1"为错误,"4e + 0"正确返回为"4e + 0"(即1到5之间的数字). (3认同)
  • @Ped7g 好吧,这正是问题所在!如果我想读出值以找出它是“200”,无论如何我都不能,因为只要我写了“e”,“input.value”就会返回“undefined”。 (2认同)

cod*_*eek 48

我们可以像下面这样简单

<input type="number"  onkeydown="javascript: return event.keyCode == 69 ? false : true" />
Run Code Online (Sandbox Code Playgroud)

  • 最好使用`return event.keyCode!== 69`,因为它避免了不必要的三元运算符.也不建议内联. (16认同)
  • 最终代码: onkeydown="return event.keyCode !== 69 &amp;&amp; event.keyCode !== 187 &amp;&amp; event.keyCode !== 189" 这可以防止 e、+ 和 -。 (3认同)
  • 但是,这不会阻止在字段中粘贴粘贴“ e”或“ E” (2认同)

小智 15

HTML输入数字类型允许"e/E",因为"e"代表指数,它是数字符号.

示例200000也可以写为2e5.我希望这有助于感谢您提出这个问题.


Tru*_*ker 10

<input type="number" onkeydown="return FilterInput(event)" onpaste="handlePaste(event)"  >

function FilterInput(event) {
    var keyCode = ('which' in event) ? event.which : event.keyCode;

    isNotWanted = (keyCode == 69 || keyCode == 101);
    return !isNotWanted;
};
function handlePaste (e) {
    var clipboardData, pastedData;

    // Get pasted data via clipboard API
    clipboardData = e.clipboardData || window.clipboardData;
    pastedData = clipboardData.getData('Text').toUpperCase();

    if(pastedData.indexOf('E')>-1) {
        //alert('found an E');
        e.stopPropagation();
        e.preventDefault();
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 您是否有信心这会阻止使用复制和粘贴功能插入"E"字符? (2认同)

bil*_*elz 9

valueAsNumber可以完成这项工作(复制/粘贴证明)

    <input type="number" oninput="this.value = this.valueAsNumber">
Run Code Online (Sandbox Code Playgroud)


A. *_*rel 8

强制使用仅由数字组成的数字的最佳方法:

<input type="number" onkeydown="javascript: return event.keyCode === 8 || event.keyCode === 46 ? true : !isNaN(Number(event.key))" />
Run Code Online (Sandbox Code Playgroud)

这样可以避免使用“ e”,“-”,“ +”,“。”。...所有不是数字的字符!

仅允许数字键:

isNaN(Number(event.key))

但接受“退格”(键代码:8)和“删除”(键代码:46)...

  • 请注意,这将接受空格:空格的键是 ' ',Number(' ') 等于 0 (2认同)

Rin*_*ary 8

使用角度,您可以这样做来限制输入 e,+,-,E

 <input type="number"  (keypress)="numericOnly($event)"/>


  numericOnly(event): boolean { // restrict e,+,-,E characters in  input type number
    debugger
    const charCode = (event.which) ? event.which : event.keyCode;
    if (charCode == 101 || charCode == 69 || charCode == 45 || charCode == 43) {
      return false;
    }
    return true;

  }
Run Code Online (Sandbox Code Playgroud)

  • 这将限制用户输入该字符? (2认同)

小智 8

E代表指数,用于缩短长数字。由于输入是数学输入,而指数在数学中是为了缩短大数,所以这就是为什么有 E。

显示如下:4e。

链接:12


Jel*_*lle 7

排除除整数以外的所有内容的简单解决方案

<input  
    type="number"
    min="1" 
    step="1"
    onkeypress="return event.keyCode === 8 || event.charCode >= 48 && event.charCode <= 57">
Run Code Online (Sandbox Code Playgroud)

此解决方案不会阻止复制和粘贴(包括字母“e”)。


小智 5

要隐藏字母e和减号,-只需执行以下操作:

onkeydown="return event.keyCode !== 69 && event.keyCode !== 189"
Run Code Online (Sandbox Code Playgroud)