ChatGPT解决这个技术问题 Extra ChatGPT

只接受整数的数字输入类型?

我正在使用通过 jQuery 实现 HTML5 验证的 jQuery 工具 Validator

到目前为止,它一直运行良好,除了一件事。在 HTML5 规范中,input 类型 "number" 可以同时包含整数和浮点数。

这似乎非常短视,因为只有当您的数据库字段是有符号浮点数时,它才会成为有用的验证器(对于无符号整数,您将不得不回退到 pattern 验证,因此会失去像 up 和 down 这样的额外功能支持它的浏览器的箭头)。

是否有另一种输入类型或可能将输入限制为无符号整数的属性?

我找不到任何东西。

将 step 设置为 1 不是答案,因为它不限制输入。您仍然可以在文本框中键入负浮点数。

另外,我知道模式验证(我在原始帖子中提到过),但这不是问题的一部分。

我想知道 HTML5 是否允许将“数字”类型的输入限制为正整数值。对于这个问题,答案似乎是“不,它没有”。

我不想使用模式验证,因为这在使用 jQuery 工具验证时会导致一些缺点,但现在看来规范不允许使用更简洁的方法来执行此操作。

截至 2019 年——我不知道从什么时候开始——number 输入(至少在 FF/Chrome/Safari 中)现在默认只接受整数,除非您为 { 3} attr 允许十进制值;例如:step="0.01"Documented MDN here。对此有两种看法,因为我认为这是一个明智的默认设置,但也是一个重大更改(是的,它影响了我编写的一些代码)。
@DarraghEnright Chrome 87 允许在 step="1" 时输入非整数。 MDN 表示该行为取决于浏览器。

M
Mmmh mmh

仅使用 HTML 可以达到的最佳效果 (documentation):


您可能应该将 min 设置为 1,因为他想要正数(而不是非负数)。
这在最新版本的 chrome 上对我不起作用。它不允许输入字母,但允许插入特殊字符。
为什么我可以输入 e
@grantsun 用于指数数字,例如 10e20。
如果您想“将输入限制为无符号整数”,这是不对的。 “step”属性将使用键盘箭头控制输入值的递增/递减。它不会阻止十进制输入值。
e
enzo

step 属性设置为 1

这在 Chrome 中似乎有点问题,所以它可能不是目前最好的解决方案。

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

\d 是数字的正则表达式,* 表示它接受多个数字。


正如 JayPea 所了解的,并非所有浏览器都支持所有 HTML5 元素,因此最好按照您的建议提供优雅的降级。
@Zut HTML5 验证不会阻止您输入这些密钥。它只是防止表单与这些字符一起发送。如果您提交的表单的输入类型为 number,其中包含其他字符,则 Chrome 会向您显示一条错误消息。
@dotweb - 我明白你的意思。两者的区别在于,使用数字属性,当我取消选择(触发模糊)输入时,所有字母字符都会自动删除。使用模式属性时不会发生这种情况。我想这种区别仅在您使用 AJAX 发布数据并且使用 submit 之外的其他事件来触发发布时才重要。
这不符合 OP 的要求。 仅整数 /\d*/.test(1.1) // true
@vsync pattern="\d*"/\d*/ 不同,pattern="\d*" 等于 /^(?:\d*)$/,请参考 HTML5 pattern attribute documentation
T
Tarek Kalaji

使用 JavaScript 的简单方法:

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

我不明白replace(/(\..*)\./g, '$1')
这对于接受浮点数并仅重复一次 . 很重要,例如可以写入 123.556
@TarekKalaji - 问题是整数而不是浮点数
移动设备呢?因为类型文本显示所有键盘(字母数字字符也)
M
Mister Jojo
<input type="text" name="PhoneNumber" pattern="[0-9]{10}" title="Phone number">

使用此代码,文本字段的输入仅限于输入数字。 Pattern 是 HTML 5 中可用的新属性。

Pattern attribute doc


根据 the specificationpattern 属性 只能用于输入类型为文本、搜索、URL、电话、电子邮件、密码(如此处显示的“文本”类型)的情况。这意味着数字输入类型的语义以及因此(重要的是)某些平板电脑和手机的数字屏幕键盘在使用此方法时会丢失。
Firefox 36.0 上的此功能允许您输入字母和特殊字符。
它不仅限于输入数字,您仍然可以输入字母!
V
Viktor Karpyuk

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

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

我为我而战:)


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


兄弟,这个解决方案是关键!谢谢!
最好的解决方案。
2
2 revs, 2 users 60%

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

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

这是不好的。在输入时尝试:Shift+Home、Shift+End、Ctrl+A、Ctrl+C、Ctrl+V。请改用 oninput
编写此答案时,尚未发布 HTML5。 @zanderwar
我现在试了一下,它可以工作了!谢谢你。
d
dippas

模式总是更适合限制,尝试 oninputmin 出现 1 只输入从 1 开始的数字

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

这是非常有趣的解决方案。 `value=${var}` 是什么?
@AcademyofProgrammer 该输入的示例默认值
最佳答案!适用于粘贴,甚至在 IE (10+) 中也适用,让您可以自由地通过输入类型显示任何键盘,并且不会让 chrome 在字段内显示这些讨厌的向上/向下箭头。
当用户输入一个错误的字符时,此解决方案将重置整个输入。该解决方案确实很酷,但对用户不太友好
K
Kamil Kiełczewski

最短的

这是 R. Yaghoobi answer 的尺寸改进

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


Kielczewski 这是哪个运营商?
杰出的!好工作!谢谢!
这是迄今为止最好的答案。不仅以简短、简单的方式处理问题;它还处理大多数其他答案没有的本地化问题(例如 100,5 与 100.5,具体取决于您来自哪个国家/地区)。
你可以加一个点
i
illeas

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


也许你还有其他问题。
不。当我只是将值粘贴到该字段时,您的提案不处理大小写。它仅处理我逐位输入值的情况。
a
a.valchev

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

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

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

        return true;
});

我最终也使用了它,并进行了 1 次小调整;我将 parseInt(value) 更改为 parseInt(value.replace('.', '')。这允许我粘贴 1.56 并将显示的值保持在 156 而不是 1。
d
dippas

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


d
dippas

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

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

L
Luca Fagioli

也许它不适合每个用例,但是

<input type="range" min="0" max="10" />

可以做得很好:fiddle

检查 documentation


@ViacheslavDobromyslov 不确定您在寻找什么,但我提醒您 OP 问题:“是否有另一种输入类型或可能将输入限制为无符号整数的属性?”如果它完全符合 OP 的要求,你为什么将这个答案定为“不起作用”?
因为使用建议的范围输入控件几乎不可能从约 9 万亿个整数中输入一个值。
@ViacheslavDobromyslov 这 9 个千万亿的要求来自哪里? OP没有问这个。这个答案回答了 OP 问题,没有你的想法。
他没有要求连续 10 个数字的解决方案。您的解决方案不适用于任何范围。
@ViacheslavDobromyslov 它做得很好,尤其是短距离。试一试,我相信它很适合你的必需品。
d
deltragon

这是一个老问题,但可访问的(现在大多数浏览器都支持)版本是:

<input type="text" inputmode="numeric" pattern="[0-9]*">

请参阅https://technology.blog.gov.uk/2020/02/24/why-the-gov-uk-design-system-team-changed-the-input-type-for-numbers/


您使用的模式只允许 0 到 9 之间的整数。它不允许负数或大于 9 的值
@Ted 模式中的 * 表示 0 次或多次重复,例如。也允许使用 10 或 2134。此外,该问题特别要求无符号数字,即。没有负数 - 如果您想允许负数,模式将是 pattern="-?[0-9]*"
可能是这样,但是在使用验证器时它仍然无法正常工作。它不允许大于 9 的值。我用 pattern="\d*" 替换了模式,现在它工作正常
V
Valentin Despa

是的,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(无效)进行了尝试。


这假设您想要一个已知范围。但是如果你想要任何整数值,这仍然有效吗?
d
E
Eric Aya

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


S
Sarthak
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);
    }
});

d
dippas

From the specs

step="any" 或正浮点数 指定元素值的值粒度。

因此,您可以简单地将其设置为 1


我已经尝试过了,但问题是您仍然可以在文本框中键入浮点数。
那么,您需要阻止用户输入小数点的代码吗?
N
Nitish Jha

发布它,如果将来有人需要它

const negativeValuePrevent = (e) => {
    const charCode = e.which ? e.which : e.keyCode;
    if(charCode > 31 && (charCode < 48 || charCode > 57) 
    && charCode !== 46){
      if(charCode < 96 || charCode > 105){
        e.preventDefault();
        return false;
      }
    }
    return true;
  };

T
Ted

大多数答案都已过时。

以下不再起作用:

<!-- It doesn't invalidate decimals when using validators -->
<input type="number" min="0" step="1" />

以下解决方案更加优雅和直接,并且适用于截至 2022 年初的所有最新浏览器。

<!-- It DOES invalidate decimals when using validators -->
<input type="number" pattern="\d*" />

K
Kamil Kiełczewski

简短且用户友好

该解决方案以直观的方式支持制表符、退格、回车、减号

但是它不允许将已经输入的数字更改为减号,也不允许处理复制粘贴的情况。

作为替代方案,您可以使用基于 R. Yaghoobi answer 的解决方案,该解决方案允许放置减号并处理复制粘贴大小写,但当用户键入禁止字符时它会删除整数


F
Farhan

整数输入意味着它只能接受正数、0 和负数。这就是我能够使用 Javascript 按键实现这一目标的方式。

<input type="number" (keypress)="keypress($event, $event.target.value)" >

keypress(evt, value){
  
    if (evt.charCode >= 48 && evt.charCode <= 57 || (value=="" && evt.charCode == 45))       
    {  
      return true;
    }
    return false;
}

给定的代码不允许用户在运行时输入字母或小数,只能输入正负整数值。


w
weston

在 Future™(参见 Can I Use)中,在向您提供键盘的用户代理上,您可以使用 input[inputmode] 将文本输入限制为仅数字。


inputmode 主要用于手持设备,会触发正确的键盘布局,但对于带有键盘的“普通”计算机,它不会阻止输入您想要的任何内容。