有没有办法阻止输入类型="数字"得到负值?

Tur*_*Ali 273 html numbers input

我想只得到正值,有没有办法防止它只使用html
请不要建议验证方法

输入控件的屏幕截图

Abr*_*ham 611

使用这样的min属性:

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

  • 这将阻止使用箭头按钮/微调器输入负数.但是,用户仍然可以手动输入负数,并将该字段的值读取为负数,从而绕过min属性. (195认同)
  • @demaniak没有.当答案半答案时,这个答案如何获得如此多的赞成是一个谜 (48认同)
  • 这是[更可靠的参考源](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-min). (6认同)
  • 这不起作用,用户仍然可以手动输入负数。 (5认同)
  • 我仍然可以将粘贴负值复制到输入字段中。我会寻找另一种解决方案。这个对我来说并不完全有效。 (4认同)

Man*_*wal 116

我对@Abhrabm的答案不满意,因为:

它只是防止号从上/下箭头被输入,而用户可以从键盘键入负数.

解决方案是使用密钥代码来防止:

// Select your input element.
var number = document.getElementById('number');

// Listen for input event on numInput.
number.onkeydown = function(e) {
    if(!((e.keyCode > 95 && e.keyCode < 106)
      || (e.keyCode > 47 && e.keyCode < 58) 
      || e.keyCode == 8)) {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)
<form action="" method="post">
  <input type="number" id="number" min="0" />
  <input type="submit" value="Click me!"/>
</form>
Run Code Online (Sandbox Code Playgroud)

@Hugh Guiney提供的澄清:

正在检查哪些密钥代码:

  • 95,<106对应于Numpad 0到9;
  • 47,<58对应于Number Row上的0到9; Backspace是8.

因此,此脚本阻止在输入中输入无效密钥.

  • Upvoted但我认为这将有助于澄清正在检查的密钥代码:> 95,<106对应于Numpad 0到9; > 47,<58对应Number Number上的0到9; Backspace是8.因此,此脚本会阻止任何键,但不会输入任何键.这是彻底的,但我认为对本机支持数字输入的浏览器来说可能有点过分,这些浏览器已经过滤掉字母键(除了"e"之类的字符,这些字符可能具有数字含义).它可能足以防止189(破折号)和109(减去).然后结合`min ="0"`. (20认同)
  • @Manwal 它限制使用键盘复制和粘贴数字。并允许我使用鼠标复制粘贴负数。 (3认同)
  • 箭头键(37, 38, 39, 41)的条件也应该被放置。`|| (e.keyCode&gt;36 &amp;&amp; e.keyCode&lt;41)` 这不允许用户通过向上/向下箭头增加/减少数字以及向右/向左编辑数字。 (2认同)

小智 67

对我来说,解决方案是:

<input type="number" min="0" oninput="this.value = Math.abs(this.value)">
Run Code Online (Sandbox Code Playgroud)

  • 一旦您将 pattern 和 noformvalidate 与 angular 一起使用,这确实是最佳解决方案,因为如果模型不在范围内,则不会更新。我的情况:`&lt;input ng-model="row.myValue" type="{{row.code == 1 ? 'text' : 'number'}}" min="0" ng-pattern="... " noformvalidate oninput="if (this.type=='text') this.value=Math.abs(this.value) "&gt;` (2认同)
  • 你救了我的一天 (2认同)
  • 如果你想在填充后保持空白(例如使用退格键),你应该使用这个 `this.value = Math.abs(this.value) &gt; 0 ? Math.abs(this.value) : null` (2认同)

Chi*_*235 25

这段代码对我来说很好.你能检查一下:

<input type="number" name="test" min="0" oninput="validity.valid||(value='');">
Run Code Online (Sandbox Code Playgroud)

  • @extempl对于试图在常识表明没有负面的字段中输入负数的用户来说,这是一种公平的惩罚. (7认同)
  • 这有效,但在您尝试键入 `-` 后清空整个输入并不是一个好主意。 (3认同)
  • ```&lt;input type =“ number” name =“ test” min =“ 0” oninput =“ validity.valid ||(value = value.replace(/ \ D + / g,))”&gt;“&gt;`` -这将删除所有非数字符号 (3认同)

小智 17

简单的方法:

<input min='0' type="number" onkeypress="return (event.charCode == 8 || event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57">
Run Code Online (Sandbox Code Playgroud)

  • 好,易于。不起作用。 (5认同)
  • 很好又简单......但是仍然可以粘贴负数。 (2认同)

yka*_*ica 7

我想允许使用十进制数字,并且如果输入负数,则不清除整个输入。这至少在chrome中效果良好:

<input type="number" min="0" onkeypress="return event.charCode != 45">
Run Code Online (Sandbox Code Playgroud)

  • @PradeepSingh“返回[45,46] .indexOf(event.charCode)== -1” (3认同)

Hei*_*erg 6

这是一个 angular 2 解决方案:

创建一个类 OnlyNumber

import {Directive, ElementRef, HostListener} from '@angular/core';

@Directive({
  selector: '[OnlyNumber]'
})
export class OnlyNumber {

  // Allow decimal numbers. The \. is only allowed once to occur
  private regex: RegExp = new RegExp(/^[0-9]+(\.[0-9]*){0,1}$/g);

  // Allow key codes for special events. Reflect :
  // Backspace, tab, end, home
  private specialKeys: Array<string> = ['Backspace', 'Tab', 'End', 'Home'];

  constructor(private el: ElementRef) {
  }

  @HostListener('keydown', ['$event'])
  onKeyDown(event: KeyboardEvent) {
    // Allow Backspace, tab, end, and home keys
    if (this.specialKeys.indexOf(event.key) !== -1) {
      return;
    }

    // Do not use event.keycode this is deprecated.
    // See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
    let current: string = this.el.nativeElement.value;
    // We need this because the current value on the DOM element
    // is not yet updated with the value from this event
    let next: string = current.concat(event.key);
    if (next && !String(next).match(this.regex)) {
      event.preventDefault();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

将 OnlyNumber 添加到 app.module.ts 中的声明中,并在您的应用程序中的任何地方像这样使用它

<input OnlyNumber="true">
Run Code Online (Sandbox Code Playgroud)


Haf*_*ich 5

仅供参考:使用jQuery,您可以使用以下代码覆盖focusout上的负值:

$(document).ready(function(){
    $("body").delegate('#myInputNumber', 'focusout', function(){
        if($(this).val() < 0){
            $(this).val('0');
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

这不会取代服务器端验证!


小智 5

@Manwal答案很好,但我喜欢代码较少的代码,以提高可读性.另外我喜欢在html中使用onclick/onkeypress用法.

我建议的解决方案也是这样:添加

min="0" onkeypress="return isNumberKey(event)"
Run Code Online (Sandbox Code Playgroud)

到html输入和

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : event.keyCode;
    return !(charCode > 31 && (charCode < 48 || charCode > 57));
}
Run Code Online (Sandbox Code Playgroud)

作为一个JavaScript函数.

如上所述,它也是如此.如何解决问题只是个人偏好.


小智 5

只需使用 min="0"

<v-text-field
   v-model="abc"
   class="ml-1 rounded-0"
   outlined
   dense
   label="Number"
   type="number"
   min="0">
</v-text-field>
Run Code Online (Sandbox Code Playgroud)