【问题标题】:How to make type="number" to positive numbers only如何仅将 type="number" 设为正数
【发布时间】:2013-10-14 12:47:04
【问题描述】:

目前我有以下代码

<input type="number" />

结果是这样的

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

我对使用type="number" 有疑问,它造成的问题比它解决的问题还多,无论如何我都会对其进行健全性检查,所以我应该回到使用type="text" 吗?

【问题讨论】:

  • 您仍然需要验证服务器上的值。任何人都可以覆盖该字段以发送他们想要的任何内容。
  • @zzzzBov 是的,我用 php 验证它,并且还使用准备语句,唯一需要担心的是大麦知道如何使用网络浏览器的用户。大声笑

标签: html


【解决方案1】:

添加a min attribute

&lt;input type="number" min="0"&gt;

【讨论】:

  • 这适用于选择器箭头,但允许输入负数
  • 在大多数情况下将属性更改为min="0.000001" 会有所帮助。超过 6 位小数,JavaScript 会将其转换为指数格式。
  • 默认情况下,这只允许整数,但不允许小数。见Allowing decimal values
  • 我试过运行这个..但是当你输入这个 98---89232-232 时失败
  • @DavidBurton 是的,这是正确的,但是单击Submit 按钮会运行验证,然后浏览器会抱怨负数并阻止提交表单。但是感谢您的评论,因为我现在明确地对其进行了测试。
【解决方案2】:

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

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

【讨论】:

  • 你不能用这个添加浮点数。此外,数字步进器在这里也不起作用。
  • oninput="validity.valid||(value='');" 阻止一个人输入数字
  • 这应该被标记为有效答案,因为它还可以防止输入“-”字符
  • 如果您像我一样只需要正整数,这非常有用。谢谢!
  • 有什么办法可以输入十进制数字吗?
【解决方案3】:

这取决于您想要的精确度。如果您只想接受整数,那么:

&lt;input type="number" min="1" step="1"&gt;

如果你想要浮点数,例如小数点后两位:

&lt;input type="number" min="0.01" step="0.01"&gt;

【讨论】:

  • 目前看来它可以在没有 step="1" 的情况下工作...我还应该添加它吗?
  • @Arian 你可以省略它,只要你不指定max 值。
  • 第一步是浏览器默认的,没问题
  • 这仍然不能阻止输入错误值 - 如果您省略 step 值,chrome 会减少输入时的验证,因此您可以输入非数字值。通过设置步长,它只允许您输入超出最小-最大范围的值 - 仍然是错误的,但更好。
  • min="1" step="1" 仍然允许我输入像 1.2 这样的浮点数我如何只能强制整数?
【解决方案4】:

您可以通过在input 标记中添加onkeypress 来强制输入仅包含正整数。

&lt;input type="number" onkeypress="return event.charCode &gt;= 48" min="1" &gt;

这里,event.charCode &gt;= 48 确保只返回大于或等于 0 的数字,而 min 标记确保您可以通过在输入栏中滚动来达到最小值 1。

【讨论】:

  • 在 Edge 上,您可以在其中输入“A”。
  • 你仍然可以粘贴负数
【解决方案5】:

您可以通过以下方式将负输入变为正数:

&lt;input type="number" onkeyup="if(this.value&lt;0){this.value= this.value * -1}"&gt;

【讨论】:

  • 完美答案。爱你,兄弟
【解决方案6】:

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

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

【讨论】:

  • 你能解释一下你的陈述是做什么的以及为什么它有帮助吗?此外,您有两个不同的 sn-ps。哪一个是正确的?
  • 通过添加 step 属性,您将输入限制为整数并添加模式确保任何使用小数部分的字段都会被标记为无效,但取决于浏览器实现(Firefox 在输入时将该字段标记为红色失去焦点,而 Chrome 不允许您输入不允许的值)。应该在服务器/客户端上验证这一点。
  • 这完全适合我,但我认为它只适用于四舍五入的数字
【解决方案7】:

试试

&lt;input type="number" pattern="^[0-9]" title='Only Number' min="1" step="1"&gt;

【讨论】:

  • 定义类型时,您需要特定的角色格式。
  • 在 chrome 中试过这个,它没有强制执行模式
  • 如果我添加 type="text" 而不是 "number" 有没有办法?
【解决方案8】:

我找不到完美的解决方案,因为有些工作用于输入但不适用于复制和粘贴,有些则相反。这个解决方案对我有用。它可以防止负数,键入“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 you can refer this answer here。我已将其提取到可以重复使用的 mixin 中。

【讨论】:

    【解决方案9】:

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

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

    【讨论】:

      【解决方案10】:

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

      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" />
      

      【讨论】:

      • 这对于不了解发生了什么的人来说真的很困惑。
      • 这样,您仍然可以在输入中粘贴任何内容,字母甚至特殊字符
      【解决方案11】:

      其他的解决方法是用Js把它设为正数(min选项可以禁用,当用户输入smth时无效)负数if不是必须的,也可以使用on('keydown')事件!

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

      【讨论】:

        【解决方案12】:

        这取决于你想要一个 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;为了解决这个问题,你可以多加一个constraint validator

        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 here.

        请注意,这些解决方案都不能完全阻止用户尝试输入无效输入,但您可以调用 checkValidity or reportValidity 来确定用户是否输入了有效输入。

        当然,您仍然应该进行服务器端验证,因为用户总是可以忽略客户端验证。

        【讨论】:

          【解决方案13】:

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

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

          【讨论】:

            【解决方案14】:

            试试这个:

            • 在 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
                          />
            

            【讨论】:

              【解决方案15】:

              我认为最好使用类型文本而不是数字,因为使用类型=数字,您将面临一些问题,例如输入字段中的箭头键和上下键的值变化。


              <input type="text" onkeypress="return event.charCode>=48 && event.charCode<=57" />
              

              【讨论】:

                【解决方案16】:

                使用这个。

                onkeypress="return (event.charCode >= 48 && event.charCode <= 57 || event.charCode == 46)" 
                

                您可以输入整数和小数。

                【讨论】:

                【解决方案17】:

                &lt;input type="number" min="1" step="1"&gt;

                【讨论】:

                  【解决方案18】:

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

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

                  【讨论】:

                    【解决方案19】:

                    (function ($) {
                      $.fn.inputFilter = function (inputFilter) {
                        return this.on('input keydown keyup mousedown mouseup select contextmenu drop', function () {
                          if (inputFilter(this.value)) {
                            this.oldValue = this.value;
                            this.oldSelectionStart = this.selectionStart;
                            this.oldSelectionEnd = this.selectionEnd;
                          } else if (this.hasOwnProperty('oldValue')) {
                            this.value = this.oldValue;
                            //this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
                          } else {
                            this.value = '';
                          }
                        });
                      };
                    })(jQuery);
                    
                    $('.positive_int').inputFilter(function (value) {
                      return /^\d*[.]?\d{0,2}$/.test(value);
                    });
                    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
                    <input type="number" class="positive_int"/>

                    以上代码适用于所有人!它还将防止插入超过 2 个小数点。如果您不需要这个,只需删除\d{0,2},或者如果需要更有限的小数点,只需更改数字 2

                    【讨论】:

                      【解决方案20】:

                      试试这个:

                      Yii2 : Validation rule 
                      
                          public function rules() {
                          return [
                      ['location_id', 'compare', 'compareValue' => 0', 'operator' => '>'],
                              ];
                      }
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-01-17
                        • 1970-01-01
                        • 1970-01-01
                        • 2015-03-22
                        • 1970-01-01
                        • 2022-11-19
                        • 2018-09-19
                        相关资源
                        最近更新 更多