如何获取<input type =“ number”>字段的原始值?


117

如何获得字段的“实际”价值<input type="number">


我有一个input盒子,正在使用较新的HTML5输入类型number

<input id="edQuantity" type="number">

Chrome 29最受支持:

在此处输入图片说明

我现在需要的是能够读取用户在输入框中输入的“原始”值的功能。如果用户输入了数字:

在此处输入图片说明

然后edQuantity.value = 4,一切都很好。

但是,如果用户输入无效的文本,我想将输入框涂成红色:

在此处输入图片说明

不幸的是,对于type="number"输入框,如果文本框中的值不是数字,则value返回一个空字符串:

edQuantity.value = "" (String);

(至少在Chrome 29中)

我如何获得控件的“原始”<input type="number">

我尝试浏览Chrome输入框其他属性的列表:

在此处输入图片说明

我没有看到任何类似于实际输入的内容。

我也找不到找到框“是否为空”的方法。也许我可以推断出:

value          isEmpty        Conclusion
=============  =============  ================
"4"            false          valid number
""             true           empty box; not a problem
""             false          invalid text; color it red

注意:您可以忽略水平规则之后的所有内容;它只是填补这个问题的理由。另外:不要将示例与问题混淆。人们可能会因为红色框以外的其他原因而希望得到此问题的答案(一个示例:在onBlur事件期间将文本"four"转换为拉丁"4"符号)

我如何获得控件的“原始”<input type="number">

奖励阅读


2
数字输入字段的“实际”值必须是数字。如果要允许输入除数字值之外的其他内容,那么number您不是要查找的输入类型;使用普通text输入。
robertc 2013年

7
@robertc Chrome是允许输入数字以外的内容的代理;我只需要知道他们输入的不是数字。
伊恩·博伊德

1
检查字段的validity状态 -可以,typeMismatch但是我还没有检查自己。
robertc 2013年

2
@ int32_t向下阅读第六行(即“但是,如果用户输入...”
Ian Boyd 2013年

6
我的用例...我有两个数字字段:纬度和经度。我想检测是否有人粘贴了“ lat,lon”并正确处理。当前使用type =“ number”是不可能的。由于“ lat,lon”是无效的。.无法获取“ raw”值来执行正则表达式。另一个用例:显示客户错误:“ blah是无效数字”。
布拉德·肯特

Answers:


55

根据WHATWG,除非它是有效的数字输入,否则您将无法获得该值。输入数字字段的清除算法表示,如果输入不是有效的浮点数字,则浏览器应该将值设置为空字符串。

值消毒算法如下:如果该的元素的是不是一个有效的浮点数,然后将其设置为空字符串来代替。

通过指定类型(<input type="number">),您可以要求浏览器为您完成一些工作。另一方面,如果您希望能够捕获非数字输入并对其进行处理,则必须依靠旧的尝试过的真实文本输入字段并自己解析内容。

W3还具有相同的规格,并增加了:

用户代理不得允许用户将值设置为不是有效浮点数的非空字符串。


6
如果用户代理不允许用户将值设置为不是有效浮点数的非空字符串,这将很有用。但是,如果whatwg表示无法完成;那就是答案。我当前需要的解决方法在下面添加。
伊恩·博伊德

57
通过指定类型(<input type="number">),您可以要求浏览器为您完成一些工作。就个人而言,我只是要求移动浏览器显示一个数字键盘,并获得了令人不快的验证。这些问题多数来自于这样一个事实,即type属性同时确定验证规则和有关要显示哪种输入机制的规则,但是很可能希望向移动用户显示数字键盘,而不希望将数字验证应用于桌面用户。HTML 5.1最终将至少使用inputmode属性解决此问题。
Mark Amery 2014年

4
但是当浏览器做得还不够的时候,我希望能够完成它。例如删除输入中的空格,推断小数点...
njzk2 2014年

1
另外,在各种语言中,例如法语,数字有2个字。一个用于数字作为标识符(例如信用卡号),另一个用于对数字进行计数(例如浮点数)。
njzk2 2014年

1
@MotiKorets不适用于输入浮点数,因为iPhone不会在键盘上放置小数点。不幸的是,目前,开发人员在提供不错的浮点输入UX方面已经搞砸了
Andy

50

它没有回答问题,但是有用的解决方法是检查

edQuantity.validity.valid

ValidityState对象给出关于用户输入的内容线索。考虑一个type="number"带有输入minmax一组

<input type="number" min="1" max="10">

我们一直想使用.validity.valid

其他属性仅提供奖金信息:

User's Input  .value  .valid | .badInput  .rangeUnderflow  .rangeOverflow
============  ======  ====== | =========  ===============  ==============
""            ""      true   | false      false            false  ;valid because field not marked required
"1"           "1"     true   | false      false            false  
"10"          "10"    true   | false      false            false
"0"           "0"     false  | false      true             false  ;invalid because below min
"11"          "11"    false  | false      false            true   ;invalid because above max
"q"           ""      false  | true       false            false  ;invalid because not number
"³"           ""      false  | true       false            false  ;superscript digit 3
"٣"           ""      false  | true       false            false  ;arabic digit 3
"₃"           ""      false  | true       false            false  ;subscript digit 3

您必须先确保浏览器支持HTML5验证,然后才能使用它:

function ValidateElementAsNumber(element)
{
   //Public Domain: no attribution required.
   if ((element.validity) && (!element.validity.valid))
   {
      //if html5 validation says it's bad: it's bad
      return false;
   }

   //Fallback to browsers that don't yet support html5 input validation
   //Or we maybe want to perform additional validations
   var value = StrToInt(element.value);
   if (value != null)
      return true;
   else
      return false;
}

奖金

Spudly有一个有用的答案,他删除了:

只需使用CSS :invalid选择器即可。

input[type=number]:invalid {
    background-color: #FFCCCC;
}

每当输入非数字有效值时,这将触发您的元素变为红色。

浏览器对的支持与<input type='number'>几乎相同 :invalid,因此没有问题。

:invalid 在此处了解更多信息


在Opera中不起作用。即使您输入字符串,也会显示有效
Bergi 2013年

Opera支持该.validity属性,但不能正确处理.valid?!。
伊恩·博伊德

可以,但是什么时候输入数字无效?它的作用就像输入为空。一个typeMismatch可能有意义,但这仅适用于电子邮件或url类型…
Bergi 2013年

@Bergi上表提供了一些示例,其中数字输入可能无效:“ q”,“ 11”(则最大值为10),“ 0”(当最小值为1时),“”(则元素为required
Ian博伊德2013年

1
@Bergi .badInput添加于11/20/2012。但是没有人应该badInput看输入是否有效。他们应该看看.valid。可能(正确)为.badInput假,但输入无效。.valid定义为不存在任何验证错误(例如,不匹配,上溢,下溢),其中.badInput只有一种错误。请注意上面的图表中.badInput的false,但是输入仍然无效。
伊恩·博伊德


4

根据按键代码跟踪所有按键

我想一个人可以听键盘输入事件,并根据其键控代码保留输入的所有字符的数组。但这是一个非常乏味的任务,并且可能易于出现错误。

http://unixpapa.com/js/key.html

选择输入并以字符串形式获取选择

document.querySelector('input').addEventListener('input', onInput);

function onInput(){
  this.select(); 
  console.log( window.getSelection().toString() )
}
<input type='number'>

全部归功于:int32_t


该解决方案已在其他地方尝试过,但没有用。尤其是当用户按下DeleteBackspaceCtrl+XCtrl+VRight-click-cutRight-click-paste
伊恩·博伊德

我同意您的看法,基本上OP不可能提出。但是,我提到的两种骇客(它们都是骇客,我并不否认)确实在一定程度上起作用。在某些情况下,也许它们对某人有用吗?
sandstrom 2013年

令人惊讶的是,选择的东西似乎起作用。该方法的局限性是什么?
njzk2 2014年

限制:文字是在视觉上选择的。如果用户键入内容,内容将会消失
fregante

使用现场演示进行编辑,演示了此方法的
严重性
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.