如何使type =“ number”仅变为正数


283

目前我有以下代码

<input type="number" />

出来像这样

在此处输入图片说明

右边的小选择器项使数字变为负数。我该如何预防?

我对使用有疑问type="number",它引起的问题多于解决的问题,无论如何我都要进行理智检查,所以我应该回到使用状态type="text"吗?


4
您仍然需要验证服务器上的值。任何人都可以覆盖该字段以发送他们想要的任何内容。
zzzzBov

2
@zzzzBov是的,我使用php对其进行了验证,并且还使用了prepare语句,唯一需要担心的是大麦知道如何使用Web浏览器的用户。哈哈
Arian Faurtosh

Answers:



118

我找到了另一种防止负数的解决方案。

<input type="number" name="test_name" min="0" oninput="validity.valid||(value='');">

您不能为此添加浮点数。此外,数字步进器在这里也无法正常工作。
hamzox

1
oninput="validity.valid||(value='');"停止从一个打字-VE数
你好宇宙

5
应该将其标记为有效答案,因为它还会阻止键入“-”字符
JanBrus

如果您像我一样只需要正整数就可以了。谢谢!
鲍里斯(Boris)

74

这取决于您要达到的精度。您只想接受整数,而不是:

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

例如,如果要使用小数点后两位数字进行浮点运算:

<input type="number" min="0.01" step="0.01">


似乎目前没有step =“ 1” ...,我是否仍可以添加它?
Arian Faurtosh

@Arian,只要您不指定max值,就可以忽略它。
2013年

1
第1步是浏览器默认情况下,你的罚款
斯蒂芬·穆勒

4
这并不会阻止您仍然输入错误的值-如果您省略了步骤值,则chrome会减少键入时的验证,因此您可以输入非数字值。使用step set时,它仅允许您输入超出最小-最大范围的值-仍然是错误的,但是更好。
大卫·伯顿

min =“ 1” step =“ 1”仍然允许我输入像1.2这样的浮点数。我该如何仅强制整数?
山姆

50

您可以通过onkeypressinput标记内添加来强制输入仅包含正整数。

<input type="number" onkeypress="return event.charCode >= 48" min="1" >

在此,请event.charCode >= 48确保仅返回大于或等于0的数字,而min标记可确保通过在输入栏中滚动来使您的数字最小为1。


3
在Edge上,您可以在其中输入“ A”。
艾米·布兰肯希

10
您仍然可以粘贴负数
甲基

5

您可以使用以下命令type="number"仅接受正数:

input type="number" step="1" pattern="\d+"

2
您能解释一下您的陈述是什么以及为什么有帮助吗?另外,您有两个不同的代码段。哪一个是正确的?
Aenadon

2
通过添加step属性,您可以将输入限制为整数,并添加模式可确保对分数的任何使用都会将字段标记为无效,但取决于浏览器的实现(Firefox在输入失去焦点时将字段标记为红色,而Chrome不允许您首先输入不允许的值)。应该在服务器/客户端上对此进行验证。
Deepali



1

如果需要输入文字,该模式也可以使用

<input type="text" pattern="\d+">

1

我找不到理想的解决方案,因为有些输入工作而不是复制粘贴,有些则相反。这个解决方案对我有用。它可以防止输入负数,键入“ e”,复制并粘贴“ e”文本。

创建一个功能。

<script language="JavaScript">

  // this prevents from typing non-number text, including "e".
  function isNumber(evt) {
    evt = (evt) ? evt : window.event;
    let charCode = (evt.which) ? evt.which : evt.keyCode;
    if ((charCode > 31 && (charCode < 48 || charCode > 57)) && charCode !== 46) {
      evt.preventDefault();
    } else {
      return true;
    }
  }
</script>

将这些属性添加到输入中。这两个防止复制和粘贴非数字文本,包括“ e”。您需要同时使它们同时生效。

<input type="number" oninput="validity.valid||(value='');" onpress="isNumber(event)" />

如果您使用的是Vue ,则可以在此处参考此答案。我已经将其提取到可以重复使用的mixin中。


0

在您的输入类型中添加此代码;

onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57"

例如:

<input type="text" name="age" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" />

1
对于任何不了解正在发生的事情的人来说,这确实令人困惑。
RozzA

通过这种方式,你仍然可以粘贴输入,拼音,甚至特殊字符什么
Lê乐嘉

0

其他解决方案是使用Js使其为正(当用户键入smth时,可以禁用min选项,并且该选项无效)。也可以使用负(如果不需要)和on('keydown')事件!

let $numberInput =  $('#whatEverId');
$numberInput.on('change', function(){
    let numberInputText = $numberInput.val();
    if(numberInputText.includes('-')){
        $numberInput.val(Math.abs($numberInput.val()));
    }
});

0

这取决于您要的是int还是float字段。这是两者的外观:

<input type="number" name="int-field" id="int-field" placeholder="positive int" min="1" step="1">
<input type="number" name="float-field" id="float-field" placeholder="positive float" min="0">

因为int字段的最小值为1,所以它附加有正确的验证。但是float字段接受0;但是,float字段接受0。为了解决这个问题,您可以再添加一个约束验证器

function checkIsPositive(e) {
  const value = parseFloat(e.target.value);
  if (e.target.value === "" || value > 0) {
    e.target.setCustomValidity("");
  } else {
    e.target.setCustomValidity("Please select a value that is greater than 0.");
  }
}

document.getElementById("float-field").addEventListener("input", checkIsPositive, false);

JSFiddle在这里。

请注意,这些解决方案都不能完全阻止用户尝试输入无效的输入,但是您可以呼叫checkValidityreportValidity弄清楚用户是否输入了有效的输入。

当然,您仍应具有服务器端验证,因为用户始终可以忽略客户端验证。


0

尝试这个:

  • 在Angular 8中测试
  • 值是正的
  • 该代码还处理nullnegitive值。
              <input
                type="number"
                min="0"
                (input)="funcCall()" -- Optional
                oninput="value == '' ? value = 0 : value < 0 ? value = value * -1 : false"
                formControlName="RateQty"
                [(value)]="some.variable" -- Optional
              />

0

如果尝试输入负数,则onkeyup事件会阻止此事件,如果您在输入数字上使用箭头,则onblur事件会解析该部分。

<input type="number" 
    onkeyup="if(this.value<0)this.value=1"
    onblur="if(this.value<0)this.value=1"
>



-2

使用文本类型的输入,您可以使用它进行更好的验证,

return (event.keyCode? (event.keyCode == 69 ? false : event.keyCode >= 48 && event.keyCode <= 57) : (event.charCode >= 48 && event.charCode <= 57))? true : event.preventDefault();

-4

尝试这个:

Yii2 : Validation rule 

    public function rules() {
    return [
['location_id', 'compare', 'compareValue' => 0', 'operator' => '>'],
        ];
}
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.