HTML5:仅采用整数的数字输入类型?

Jay*_*Pea 233 validation jquery html5 jquery-tools

我正在使用jQuery Tools Validator,它通过jQuery实现HTML5验证.到目前为止它一直很好用,除了一件事.在HTML5规范中,输入类型"number"可以包含整数和浮点数.这看起来非常短视,因为当数据库字段是带符号的浮点数时,它只是一个有用的验证器(对于无符号整数,你必须回退到"模式"验证,因此松散的额外功能,如向上和向下箭头对于支持它的浏览器).是否有另一种输入类型或可能将输入限制为无符号整数的属性?我找不到任何,谢谢.

编辑

好的,我感谢您的时间和帮助,但我看到许多不值得的投票:D.将步骤设置为1不是答案,因为它不限制输入.您仍然可以在文本框中键入负浮点数.另外,我知道模式验证(我在原帖中提到过),但这不是问题的一部分.我想知道HTML5是否允许将"number"类型的输入限制为正整数值.对于这个问题,似乎答案是"不,不是".我不想使用模式验证,因为这在使用jQuery Tools验证时​​会产生一些缺点,但现在似乎规范不允许更简洁的方法来执行此操作.

Aur*_*oms 299

https://www.w3.org/wiki/HTML/Elements/input/number

只有HTML才能实现最好的效果

<input type="number" min="0" step="1"/>
Run Code Online (Sandbox Code Playgroud)

  • 在最新版本的chrome上,这对我没有用.它不允许输入字母,但它允许插入特殊字符. (22认同)
  • @grantsun 用于指数数,例如 10e20。 (7认同)
  • 如果您想“将输入限制为无符号整数”,这是不正确的。“step”属性将使用键盘箭头控制输入值的递增/递减。它不会阻止十进制输入值。 (7认同)
  • 您应该将"min"设置为"1",因为他想要正数(而不是非负数). (6认同)
  • 为什么我可以输入e (6认同)
  • 这是正确的答案,但如果您想从此输入获得正确的整数输出,则必须适当地使用 DOM API。首先,验证:`input.checkValidity()`。如果返回“false”,那么您没有整数,因此拒绝它。然后,获取数字形式的值:“input.valueAsNumber”。请注意,空输入将被视为有效,因为此输入字段是可选的。如果您不希望这样,请添加“required”属性。 (2认同)

js-*_*der 171

step属性设置为1:

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

这在Chrome浏览器中似乎有些麻烦,所以它可能不是目前最好的解决方案.

更好的解决方案是使用pattern使用正则表达式匹配输入的属性:

<input type="text" pattern="\d*" />
Run Code Online (Sandbox Code Playgroud)

\d是数字的正则表达式,*表示它接受多个数字.这是演示:http://jsfiddle.net/b8NrE/1/

  • @Zut HTML5验证不会阻止您输入这些密钥.它只是阻止表单与这些字符一起发送.如果您提交的表单中包含"number"类型的输入,其中包含其他字符,那么Chrome会向您显示错误消息. (5认同)
  • 这不符合OP的要求。**仅整数**`/\d*/.test(1.1)// true (5认同)
  • 正如JayPea所了解的那样,并非所有浏览器都支持所有HTML5元素,因此最好提供优雅的降级,正如您所提议的那样. (2认同)
  • @dotweb - 我明白你的意思了.两者之间的区别在于,使用number属性,当我取消选择(触发模糊)输入时,将自动删除所有字母字符.使用pattern属性时不会发生这种情况.我想这种区别只有在您使用AJAX发布数据时才有用,并且您使用的是"提交"以外的其他事件来触发帖子. (2认同)
  • @vsync `pattern="\d*"` 与 `/\d*/` 不同,`pattern="\d*"` 等于 `/^(?:\d*)$/`,请参阅 [HTML5 *pattern* 属性文档](https://www.w3.org/TR/2011/WD-html5-20110525/common-input-element-attributes.html#the-pattern-attribute)。 (2认同)
  • 不起作用。对此投了赞成票。然后在我的项目中进行了测试。现在不能downwote:( (2认同)

Tar*_*aji 34

使用JavaScript的简单方法:

<input type="text" oninput="this.value = this.value.replace(/[^0-9.]/g, ''); this.value = this.value.replace(/(\..*)\./g, '$1');" >
Run Code Online (Sandbox Code Playgroud)

  • @TarekKalaji - 问题状态**整数**而不是**浮点数** (6认同)
  • 这对于接受浮点数并且只重复一次`.`非常重要,例如`123.556`可以被写入. (3认同)

the*_*stv 30

<input type="text" name="Phone Number" pattern="[0-9]{10}" title="Phone number">
Run Code Online (Sandbox Code Playgroud)

使用此代码,文本字段限制的输入仅限于输入数字....模式是HTML5中可用的新属性

Patter属性doc

  • 根据[规范](http://www.w3.org/TR/html5/forms.html#the-input-element),**模式属性**只能在输入类型为Text,Search的情况下使用,URL,电话,电子邮件,密码(如此处显示"文本"类型).这意味着使用此方法时,数字输入类型的语义以及(重要的)某些平板电脑和手机的数字屏幕键盘的语义会丢失. (6认同)
  • 在firefox 36.0上,此功能允许您键入字母和特殊字符。 (3认同)
  • 它不仅限于输入数字,您仍然可以输入字母! (3认同)
  • 这不起作用 (2认同)

小智 23

模式很好但是如果你想仅使用type ="text"将输入限制为数字,你可以使用oninput和一个正则表达式,如下所示:

<input type="text" oninput="this.value=this.value.replace(/[^0-9]/g,'');" id="myId"/>
Run Code Online (Sandbox Code Playgroud)

我为我而战:)


小智 17

<input type="number" oninput="this.value = Math.round(this.value);"/>
Run Code Online (Sandbox Code Playgroud)

  • 兄弟,这个解决方案是关键!谢谢你! (4认同)
  • 像“oninput”这样的内联事件处理程序是[不好的做法](/q/11737873/4642212)。它们是一种[过时、麻烦且不直观](/a/43459991/4642212) 的监听事件的方式。始终[使用 `addEventListener`](//developer.mozilla.org/en/docs/Learn/JavaScript/Building_blocks/Events#inline_event_handlers_%E2%80%94_dont_use_these)。请永远不要建议或鼓励这些属性。最后一个仍然需要它们的浏览器在近二十年前就已经结束了生命。此外,这会擦除该值,并在每个无效输入上将其替换为“0”。可用性不好。 (2认同)

小智 14

这不仅适用于html5所有浏览器都能正常工作.试试这个

onkeyup="this.value=this.value.replace(/[^0-9]/g,'');"
Run Code Online (Sandbox Code Playgroud)

  • 这是不好的.在输入上尝试:Shift + Home,Shift + End,Ctrl + A,Ctrl + C,Ctrl + V. 请改用"oninput" (12认同)
  • 撰写此答案时,尚未发布 HTML5。@zanderwar (2认同)

Kam*_*ski 13

最短

这是R. Yaghoobi 答案的大小改进

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

我们在这里使用“OR”运算符的标准简写,例如9 | 2 = 11 二进制:0b1001 | 0b1010 = 0b1011。该运算符首先以隐式方式将数字转换为整数,然后执行 OR。但因为或与零不会改变任何东西,所以数字被转换为整数。与非数字字符串进行“或”运算得出 0。

  • 该解决方案的唯一问题是,在用户尝试输入无效字符(即小数点或字母等)后,它会在开头移动插入符号。 (3认同)
  • 杰出的!好工作!谢谢! (2认同)

Nik*_*y_R 10

 <input type="number" min="0" step="1" pattern="\d+"/>
Run Code Online (Sandbox Code Playgroud)


小智 9

对于限制,模式总是优选的,尝试oninput并且min仅从1开始输入数字1

<input type="text" min="1" oninput="this.value=this.value.replace(/[^0-9]/g,'');"
                                value=${var} >
Run Code Online (Sandbox Code Playgroud)


小智 7

只需将它放在您的输入字段中: onkeypress='return event.charCode >= 48 && event.charCode <= 57'


小智 5

你试过step像这样将属性设置为1 吗?

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