Có cách nào để ngăn chặn kiểu đầu vào = Số thứ hạng Nhận nhận giá trị âm không?


302

Tôi muốn chỉ nhận các giá trị dương, có cách nào để ngăn chặn nó chỉ bằng html
Vui lòng không đề xuất phương thức xác thực

Ảnh chụp màn hình kiểm soát đầu vào


3
Chủ đề này trả lời cùng một câu hỏi ở mức độ tốt hơn nhiều: stackoverflow.com/questions/31575496/
Khăn

Câu trả lời:


658

Sử dụng minthuộc tính như thế này:

<input type="number" min="0">


222
Điều này sẽ chặn một số âm được nhập bằng các nút mũi tên / spinner. Tuy nhiên, người dùng vẫn có thể nhập thủ công số âm và giá trị của trường đó được đọc là số âm, do đó bỏ qua thuộc tính min.
ecbrodie 14/07/2015

52
@demaniak số Và làm thế nào câu trả lời này nhận được rất nhiều upvotes khi nó nửa trả lời câu hỏi là một điều bí ẩn
goto

1
@Abraham Điều gì xảy ra nếu dữ liệu được tải với giá trị -ve trong biểu mẫu, nó không đánh dấu nó là màu đỏ.
Kamini

2
Điều này không hoạt động, người dùng vẫn có thể nhập số âm theo cách thủ công.
Altef bốn

129

Tôi không hài lòng với câu trả lời của @Abhrabm vì:

Nó chỉ ngăn không cho số âm được nhập từ mũi tên lên / xuống, trong khi người dùng có thể nhập số âm từ bàn phím.

Giải pháp là ngăn chặn bằng mã khóa :

// 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;
    }
}
<form action="" method="post">
  <input type="number" id="number" min="0" />
  <input type="submit" value="Click me!"/>
</form>

Làm rõ được cung cấp bởi @Hugh Guiney :

Những mã khóa nào đang được kiểm tra:

  • 95, <106 tương ứng với Numpad 0 đến 9;
  • 47, <58 tương ứng với 0 đến 9 trên Hàng số; và 8 là Backspace.

Vì vậy, tập lệnh này đang ngăn khóa không hợp lệ được nhập vào đầu vào.


20
Được nâng cấp nhưng tôi nghĩ sẽ giúp làm rõ những mã khóa nào đang được kiểm tra:> 95, <106 tương ứng với Numpad 0 đến 9; > 47, <58 tương ứng từ 0 đến 9 trên Hàng số; và 8 là Backspace. Vì vậy, kịch bản này đang ngăn chặn bất kỳ khóa nào nhưng những người được nhập. Thật kỹ lưỡng nhưng tôi nghĩ có thể là quá mức cần thiết cho các trình duyệt hỗ trợ đầu vào số, vốn đã lọc ra các khóa chữ cái (ngoại trừ các ký tự như "e" có thể có nghĩa là số). Nó có thể đủ để ngăn chặn 189 (dấu gạch ngang) và 109 (trừ). Và sau đó kết hợp với min="0".
Hugh Guiney

1
@Manwal Nó hạn chế sao chép và dán số bằng bàn phím. Và cho phép tôi sao chép dán số âm bằng chuột.
Beniton

1
@Beniton Cảm ơn đã cho trường hợp sử dụng này. Bạn có thể cho tôi ít ý tưởng về những gì bạn đang làm không. Dù sao tôi cũng có thể giúp bạn. Vui lòng cung cấp ít mã runnable hoặc fiddle. Bạn có thể có mẫu Gửi xác thực cấp cho mã của bạn. Mặc dù tôi luôn luôn có check in Backend nếu tôi không cho phép số âm.
Manwal

1
Chỉ cần sao chép-dán vào trường về cơ bản. Nó không thực sự là một trường hợp đặc biệt hay bất cứ điều gì. Thay vì xử lý xác thực thông qua mã khóa, có lẽ tốt hơn là thực hiện trên Thay đổi hoặc tập trung và xây dựng một chức năng xác thực nhỏ để bắt bất kỳ số âm nào.
ulisesrmzroche

1
Điều kiện cho phím mũi tên (37, 38, 39, 41) cũng nên được đặt. || (e.keyCode>36 && e.keyCode<41)Điều này không cho phép người dùng tăng / giảm số thông qua mũi tên lên / xuống và sang phải / trái để chỉnh sửa số.
vusan

86

Đối với tôi giải pháp là:

<input type="number" min="0" oninput="this.value = Math.abs(this.value)">

1
Giải pháp thực sự tốt nhất một khi bạn sử dụng mẫu và noformvalidate với góc, vì mô hình không được cập nhật nếu không nằm trong phạm vi. Trường hợp của tôi:<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) ">
sebius

điều này hoạt động tốt nhất khi người dùng biết giá trị mặc định là 0. Người dùng thông thái khác bị nhầm lẫn khi nhấn backspace tại sao trường không xóa. Ngoại trừ điều này, đó là giải pháp tốt nhất. + 1
Sâu 3015

1
bạn đã cứu ngày của tôi
stackmalux

Điều này hoạt động tốt nhất, và trong trường hợp sử dụng thập phân cũng. Tôi đã sử dụng câu trả lời khác ở trên, nó đã ngừng hoạt động khi được phép thập phân. Có cách nào chúng ta có thể chuyển câu trả lời này lên để mọi người có thể sử dụng phần lớn này không.
Subhan Ahmed

31

Mã này đang làm việc tốt cho tôi. Bạn có thể vui lòng kiểm tra:

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

2
Điều này hoạt động nhưng làm trống toàn bộ đầu vào sau khi bạn cố gắng gõ -không thực sự là một ý tưởng tốt.
extempl

9
@extempl Nghe có vẻ như một hình phạt công bằng cho người dùng đang cố gắng nhập tiêu cực vào một lĩnh vực mà ý thức chung cho thấy không có tiêu cực.
KhoPhi

3
<input type="number" name="test" min="0" oninput="validity.valid||(value=value.replace(/\D+/g, ''))">- điều này sẽ xóa tất cả các ký hiệu không có chữ số
Oleh Melnyk

@Rexford Tôi đồng ý, nhưng tôi đã đặt ra min="0"nên không có người hay nói xấu. Nếu bạn muốn giá trị âm thì loại bỏ thuộc tính này.
Chinmay235

1
Tôi đã thử điều này nhưng nó cũng ngăn các số có dấu thập phân được nhập vào.
klent

21

Phương pháp dễ dàng:

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


Đẹp và dễ dàng ... nhưng vẫn có thể dán số âm.
Ralf

10

Tôi muốn cho phép số thập phân và không xóa toàn bộ đầu vào nếu nhập âm. Điều này hoạt động tốt trong chrome ít nhất:

<input type="number" min="0" onkeypress="return event.charCode != 45">

Làm thế nào có thể thêm số ascii ở đây. ví dụ với 45 i wana thêm 46 cũng được. Làm thế nào nó có thể được thực hiện?
Pradeep Singh

3
@PradeepSingh "return [45, 46] .indexOf (event.charCode) == -1"
ykay nói Phục hồi lại

Hãy nghĩ ra khỏi hộp. Bạn có thực sự chắc chắn a keypresslà cách duy nhất người ta có thể nhập số âm vào đầu vào ...
Roko C. Buljan

6

Câu trả lời @Manwal là tốt, nhưng tôi thích mã có ít dòng mã hơn để dễ đọc hơn. Ngoài ra tôi thích sử dụng onclick / onkeypress thay thế trong html.

Giải pháp đề xuất của tôi làm tương tự: Thêm

min="0" onkeypress="return isNumberKey(event)"

đến đầu vào html và

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

như một chức năng javascript.

Như đã nói, nó làm như vậy. Đó chỉ là sở thích cá nhân về cách giải quyết vấn đề.


5

Chỉ để tham khảo: với jQuery, bạn có thể ghi đè lên các giá trị âm trên tiêu điểm với mã sau:

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

Điều này không thay thế xác nhận phía máy chủ!


Điều này hoạt động tốt NẾU người dùng tập trung ra khỏi trường đầu vào, tuy nhiên nếu họ ngay lập tức nhấn enter trong khi vẫn ở trong trường; họ vẫn có thể nhập số âm.
NemyaNation

3

Đây là một giải pháp góc 2:

tạo một lớp 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();
    }
  }
}

thêm OnlyNumber vào khai báo trong app.module.ts và sử dụng như thế này ở bất cứ đâu trong ứng dụng của bạn

<input OnlyNumber="true">

Có cách nào cho phép Paste cho việc này không? Ngoài ra, tôi đã thay đổi biểu thức chính thức thành: / ^ ^? [0-9THER + (\. [0-9 [*) / 0,1spl$ / g để cho phép các số âm, nhưng dường như nó không hoạt động?
Dave Nottage

2
oninput="this.value=(this.value   < Number(this.min) || this.value   > Number(this.max))  ? '' : this.value;"

2
Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
Sudheesh Singanamalla

Trong khi đây có thể là câu trả lời chính xác, nó thiếu đủ chi tiết. Hãy giải thích tại sao điều này hoạt động. Khi sử dụng Stack Overflow, hãy xem xét rằng đây là một nền tảng kiến ​​thức sống , câu trả lời không chia sẻ kiến ​​thức sẽ ít hữu ích hơn nhiều.
Marc LaFleur

2

Chỉ cần thêm một cách khác để làm điều này (sử dụng Angular) nếu bạn không muốn làm bẩn HTML với nhiều mã hơn:

Bạn chỉ phải đăng ký giá trị trường Thay đổi và đặt Giá trị là giá trị tuyệt đối (chú ý không phát ra sự kiện mới vì điều đó sẽ gây ra một giá trị khác Thay đổi cuộc gọi đệ quy và gây ra lỗi vượt quá kích thước cuộc gọi tối đa)

MÃ HTML

<form [formGroup]="myForm">
    <input type="number" formControlName="myInput"/>
</form>

TypeScript CODE (Bên trong thành phần của bạn)

formGroup: FormGroup;

ngOnInit() { 
    this.myInput.valueChanges 
    .subscribe(() => {
        this.myInput.setValue(Math.abs(this.myInput.value), {emitEvent: false});
    });
}

get myInput(): AbstractControl {
    return this.myForm.controls['myInput'];
}

1

<input type="number" name="credit_days" pattern="[^\-]+" 
    #credit_days="ngModel" class="form-control" 
    placeholder="{{ 'Enter credit days' | translate }}" min="0" 
    [(ngModel)]="provider.credit_days"
    onkeypress="return (event.charCode == 8 || event.charCode == 0 || 
    event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 
    57" onpaste="return false">


1

Câu trả lời cho điều này là không hữu ích. vì nó chỉ hoạt động khi bạn sử dụng phím lên / xuống, nhưng nếu bạn gõ -11 thì nó sẽ không hoạt động. Vì vậy, đây là một sửa chữa nhỏ mà tôi sử dụng

cái này cho số nguyên

  $(".integer").live("keypress keyup", function (event) {
    //    console.log('int = '+$(this).val());
    $(this).val($(this).val().replace(/[^\d].+/, ""));
    if (event.which != 8 && (event.which < 48 || event.which > 57))
    {
        event.preventDefault();
    }
   });

cái này khi bạn có số giá

        $(".numeric, .price").live("keypress keyup", function (event) {
     //    console.log('numeric = '+$(this).val());
    $(this).val($(this).val().replace(/[^0-9\,\.]/g, ''));

    if (event.which != 8 && (event.which != 44 || $(this).val().indexOf(',') != -1) && (event.which < 48 || event.which > 57)) {
        event.preventDefault();
    }
   });

0

Giải pháp này cho phép tất cả các chức năng bàn phím bao gồm sao chép dán với bàn phím. Nó ngăn chặn dán số âm với chuột. Nó hoạt động với tất cả các trình duyệt và bản demo trên codepen sử dụng bootstrap và jQuery. Điều này sẽ làm việc với các cài đặt ngôn ngữ tiếng Anh và bàn phím. Nếu trình duyệt không hỗ trợ chụp sự kiện dán (IE), trình duyệt sẽ xóa dấu âm sau khi lấy nét. Giải pháp này hoạt động như trình duyệt riêng nên với min = 0 type = number.

Đánh dấu:

<form>
  <input class="form-control positive-numeric-only" id="id-blah1" min="0" name="nm1" type="number" value="0" />
  <input class="form-control positive-numeric-only" id="id-blah2" min="0" name="nm2" type="number" value="0" />
</form>

Javascript

$(document).ready(function() {
  $("input.positive-numeric-only").on("keydown", function(e) {
    var char = e.originalEvent.key.replace(/[^0-9^.^,]/, "");
    if (char.length == 0 && !(e.originalEvent.ctrlKey || e.originalEvent.metaKey)) {
      e.preventDefault();
    }
  });

  $("input.positive-numeric-only").bind("paste", function(e) {
    var numbers = e.originalEvent.clipboardData
      .getData("text")
      .replace(/[^0-9^.^,]/g, "");
    e.preventDefault();
    var the_val = parseFloat(numbers);
    if (the_val > 0) {
      $(this).val(the_val.toFixed(2));
    }
  });

  $("input.positive-numeric-only").focusout(function(e) {
    if (!isNaN(this.value) && this.value.length != 0) {
      this.value = Math.abs(parseFloat(this.value)).toFixed(2);
    } else {
      this.value = 0;
    }
  });
});

0

Đây là một giải pháp hoạt động tốt nhất với tôi cho trường QTY chỉ cho phép số.

// Only allow numbers, backspace and left/right direction on QTY input
    if(!((e.keyCode > 95 && e.keyCode < 106) // numpad numbers
        || (e.keyCode > 47 && e.keyCode < 58) // numbers
        || [8, 9, 35, 36, 37, 39].indexOf(e.keyCode) >= 0 // backspace, tab, home, end, left arrow, right arrow
        || (e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + A
        || (e.keyCode == 67 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + C
        || (e.keyCode == 88 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + X
        || (e.keyCode == 86 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + V
    )) {
        return false;
    }

0

If Number is Negative or Positive Using ES6s Math.Sign

const num = -8;
// Old Way
num === 0 ? num : (num > 0 ? 1 : -1); // -1

// ES6 Way
Math.sign(num); // -1

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.