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


249

我正在使用jQuery Tools Validator,该工具通过jQuery实现HTML5验证。到目前为止,除了一件事之外,它一直都很棒。在HTML5规范中,输入类型“数字”可以同时具有整数和浮点数。这似乎是非常短视的,因为它仅在数据库字段为带符号浮点数时才是有用的验证器(对于无符号int,您将不得不使用“模式”验证,从而失去诸如向上和向下的额外功能)支持它的浏览器的箭头)。是否存在另一种输入类型或可能将输入限制为无符号整数的属性?我找不到任何东西,谢谢。

编辑

好的,伙计们,我感谢您的时间和帮助,但是我发现许多不受欢迎的:D正在进行投票。将步长设置为1并不是答案,因为它不会限制输入。您仍然可以在文本框中输入一个负浮点数。另外,我知道模式验证(我在原始帖子中提到过),但这不是问题的一部分。我想知道HTML5是否允许将“数字”类型的输入限制为正整数值。对于这个问题,答案似乎是“不,不是”。我不想使用模式验证,因为使用jQuery Tools验证时​​这会导致一些缺点,但是现在看来,该规范不允许采用更简洁的方式来执行此操作。


3
从2019年开始(我不知道从何时开始),number输入(至少在FF / Chrome / Safari中)现在默认情况下仅接受整数,除非您为step允许十进制值的attr 设置了显式值;例如:step="0.01"在此处记录了MDN。有两种想法,因为我认为这是明智的默认设置,但又是一个重大更改(是的,它影响了我编写的某些代码)。
Darragh Enright

Answers:


326

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

仅HTML可以实现的最佳效果

<input type="number" min="0" step="1"/>


6
你应该设置min1他想要的正数(不是非负数)。
马丁·托马

1
@pwdst,我将其第二。<input type="number" min="0" step="1"/>是该问题的最正确答案。无论如何,同时拥有step="1"和有pattern="\d+"什么意义?在两种情况下,我都无法输入浮点数。
2014年

27
在最新版的chrome上,这不适用于我。它不允许键入字母,但允许插入特殊字符。
马拉沃斯

2
为什么我可以键入e
授予sun

3
@grantsun为指数数字,例如10e20。
sn3ll

180

step属性设置为1

<input type="number" step="1" />

目前,这在Chrome浏览器中似乎有点问题,因此目前可能不是最佳解决方案。

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

<input type="text" pattern="\d*" />

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


2
正如JayPea所了解的那样,并不是所有的浏览器都支持所有HTML5元素,所以最好像您所建议的那样提供优美的降级效果。
DOK 2012年

6
@Zut HTML5验证不会阻止您输入这些键。它只是防止表单与这些字符一起发送。如果您提交的表单的输入类型number包含其他字符,则Chrome会显示一条错误消息。
js-coder

2
@dotweb-我明白你的意思了。两者之间的区别在于,通过数字属性,当我取消选择输入(触发模糊)时,所有字母字符都会被自动删除。使用pattern属性时不会发生这种情况。我想这种区别仅在使用AJAX发布数据并且使用其他事件而不是submit触发发布时才重要。
Zut 2012年

6
这不符合OP的要求。仅整数 /\d*/.test(1.1) // true
vsync

2
@vsync pattern="\d*"是不一样的/\d*/pattern="\d*"等于/^(?:\d*)$/请参阅HTML5 图案属性的文档
WiktorStribiżew19年

36
<input type="text" name="Phone Number" pattern="[0-9]{10}" title="Phone number">

使用此代码,文本字段的输入限制为只能输入数字。模式是HTML 5中可用的新属性。

模式属性文档


9
根据规范pattern属性只能在输入类型为文本,搜索,URL,电话,电子邮件,密码(如此处显示为“文本”类型)的情况下使用。这意味着使用此方法时,数字输入类型的语义以及(某些情况下)某些平板电脑和电话的数字屏幕键盘的语义(重要)会丢失。
pwdst 2014年

3
在firefox 36.0上,此功能允许您键入字母和特殊字符。
马拉沃斯

它不仅将输入限制为数字,您仍然可以输入字母!
HadidAli

35

使用JavaScript的简单方法:

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

我不明白replace(/(\..*)\./g, '$1')
codyc4321

3
接受浮点数并.仅重复一次(例如123.556可以写入)非常重要。
塔雷克·卡拉吉

8
@TarekKalaji-问题指出整数而不是浮点数
vsync

移动设备呢?因为键入文字会显示所有键盘(还包含字母数字字符)
Nuri

27

模式是不错的选择,但是如果您只想使用type =“ text”将输入限制为数字,则可以使用oninput和正则表达式,如下所示:

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

我为我感激:)


请注意,这种方法可能会否定您的(更改)方法(事件处理程序),并且还会删除输入框中的默认值。
HadidAli

14

这不仅适用于html5,而且所有浏览器都可以正常工作。试试这个

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

12
这不好。在输入上尝试:Shift + Home,Shift + End,Ctrl + A,Ctrl + C,Ctrl + V。使用oninput替代
zanderwar

1
撰写此答案时,尚未发布HTML5。@zanderwar
Muhammet Can TONBUL

11

模式是始终是最好的限制,试着oninputmin从1日起仅输入号码出现1

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

这是非常有趣的解决方案。价值= $ {var}`是什么?
开发人员

该输入的@AcademyofProgrammer示例默认值
Shinigamae

最佳答案!可以粘贴,甚至可以在IE(10+)中使用,还可以通过输入的类型自由显示任何键盘,并且chrome不会在字段内显示这些讨厌的上/下箭头。
Janosch

5

您是否尝试过step像这样将属性设置为1

<input type="number" step="1" /> 


3

是的,HTML5可以。尝试以下代码(w3school):

<!DOCTYPE html>
<html>
<body>

<form action="">
  Quantity (between 1 and 5): <input type="number" name="quantity" min="1" max="5" />
  <input type="submit" />
</form>

</body>
</html>

看到最小和最大参数吗?我使用Chrome 19(有效)和Firefox 12(无效)进行了尝试。


这假定您想要一个已知范围。但是,如果您想要任何整数值,这是否仍然有效?
RandomHandle

3

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


3

即使使用html属性,我也在使用Chrome,但遇到了一些问题。我最终得到了这个js代码

$("#element").on("input", function(){
        var value = $(this).val();

        $(this).val("");
        $(this).val(parseInt(value));

        return true;
});

最后,我进行了1次小的调整,最终使用了此功能;我改变parseInt函数(值)parseInt函数(value.replace(‘’),这让我贴1.56,保持显示的数值为156,而不是1“”
codescribblr



2

step属性设置为任何浮点数,例如0.01,就可以了。


1
var valKeyDown;
var valKeyUp;


function integerOnly(e) {
    e = e || window.event;
    var code = e.which || e.keyCode;
    if (!e.ctrlKey) {
        var arrIntCodes1 = new Array(96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 8, 9, 116);   // 96 TO 105 - 0 TO 9 (Numpad)
        if (!e.shiftKey) {                          //48 to 57 - 0 to 9 
            arrIntCodes1.push(48);                  //These keys will be allowed only if shift key is NOT pressed
            arrIntCodes1.push(49);                  //Because, with shift key (48 to 57) events will print chars like @,#,$,%,^, etc.
            arrIntCodes1.push(50);
            arrIntCodes1.push(51);
            arrIntCodes1.push(52);
            arrIntCodes1.push(53);
            arrIntCodes1.push(54);
            arrIntCodes1.push(55);
            arrIntCodes1.push(56);
            arrIntCodes1.push(57);
        }
        var arrIntCodes2 = new Array(35, 36, 37, 38, 39, 40, 46);
        if ($.inArray(e.keyCode, arrIntCodes2) != -1) {
            arrIntCodes1.push(e.keyCode);
        }
        if ($.inArray(code, arrIntCodes1) == -1) {
            return false;
        }
    }
    return true;
}

$('.integerOnly').keydown(function (event) {
    valKeyDown = this.value;
    return integerOnly(event);
});

$('.integerOnly').keyup(function (event) {          //This is to protect if user copy-pastes some character value ,..
    valKeyUp = this.value;                          //In that case, pasted text is replaced with old value,
    if (!new RegExp('^[0-9]*$').test(valKeyUp)) {   //which is stored in 'valKeyDown' at keydown event.
        $(this).val(valKeyDown);                    //It is not possible to check this inside 'integerOnly' function as,
    }                                               //one cannot get the text printed by keydown event 
});                                                 //(that's why, this is checked on keyup)

$('.integerOnly').bind('input propertychange', function(e) {    //if user copy-pastes some character value using mouse
    valKeyUp = this.value;
    if (!new RegExp('^[0-9]*$').test(valKeyUp)) {
        $(this).val(valKeyDown);
    }
});

0

当前,无法阻止用户仅使用HTML在输入中写入十进制值。您必须使用javascript。



-2

在Future™(请参阅我可以使用)中,在为您提供键盘的用户代理上,您可以使用来将文本输入限制为仅数字形式input[inputmode]


inputmode通常用于手持设备,并会触发正确的键盘布局,但是对于带有键盘的“普通”计算机,它不会阻止您输入所需的内容。
vsync
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.