Cách tạo kiểu = số hiệu Số chỉ thành số dương


284

hiện tại tôi có đoạn mã sau

<input type="number" />

nó đi ra một cái gì đó như thế này

nhập mô tả hình ảnh ở đây

Các công cụ chọn nhỏ bên phải cho phép số đi vào âm. Làm thế nào để tôi ngăn chặn điều đó?

Tôi đang nghi ngờ về việc sử dụng type="number", nó đang gây ra nhiều vấn đề hơn là giải quyết, tôi sẽ kiểm tra nó bằng mọi cách, vậy tôi có nên quay lại sử dụng type="text"không?


4
Bạn vẫn sẽ cần xác thực giá trị trên máy chủ. Bất cứ ai cũng có thể ghi đè trường để gửi bất kỳ nội dung nào họ muốn.
zzzzBov

2
@zzzzBov Vâng, tôi xác nhận nó bằng php và cũng sử dụng các câu lệnh chuẩn bị, điều duy nhất còn lại phải lo lắng là người dùng lúa mạch biết cách sử dụng trình duyệt web. lol
Arian Faurtosh

Câu trả lời:


634

Thêm một minthuộc tính

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


35
Điều này hoạt động cho các mũi tên chọn, nhưng cho phép nhập một số âm
David Burton

2
Thay đổi thuộc tính min="0.000001"sẽ giúp trong hầu hết các trường hợp. Hơn 6 chữ số thập phân, JavaScript sẽ chuyển đổi nó sang định dạng số mũ.
MarkMYoung

Theo mặc định, điều này chỉ cho phép số nguyên chứ không cho số thập phân. Xem Cho phép giá trị thập phân .
str

118

Tôi đã tìm thấy một giải pháp khác để ngăn chặn số âm.

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

Bạn không thể thêm số nổi với điều này. Ngoài ra, bước số không làm việc ở đây là tốt.
hamzox

1
oninput="validity.valid||(value='');"ngăn một người từ số gõ phím
Xin chào vũ trụ

5
Điều này nên được đánh dấu là câu trả lời hợp lệ vì nó cũng ngăn việc gõ ký tự "-"
JanBrus

Điều này hoạt động rất tốt nếu bạn chỉ cần số nguyên, số nguyên, như tôi đã làm. Cảm ơn!
Boris

74

Nó phụ thuộc vào mức độ chính xác mà bạn muốn trở thành. Bạn muốn chỉ chấp nhận số nguyên, hơn:

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

Nếu bạn muốn nổi với, ví dụ, hai chữ số sau dấu thập phân:

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


Có vẻ như hiện tại nó hoạt động mà không có bước = "1" ... tôi có nên thêm nó không?
Arian Faurtosh

@Arian bạn có thể bỏ qua nó miễn là bạn không chỉ định maxgiá trị.
Pavlo

1
Bước 1 là mặc định của trình duyệt, bạn vẫn ổn
Stephan Muller

4
Điều này không ngăn việc nhập các giá trị xấu - nếu bạn bỏ qua giá trị bước chrome sẽ giảm xác thực khi nhập để bạn có thể nhập các giá trị không phải là số. Với bước được đặt, nó chỉ cho phép bạn nhập các giá trị ngoài phạm vi tối thiểu - vẫn sai, nhưng tốt hơn.
David Burton

min = "1" step = "1" vẫn cho phép tôi nhập các số trôi nổi như 1.2 Làm thế nào tôi chỉ có thể buộc số nguyên?
Sam

50

Bạn có thể buộc đầu vào chỉ chứa số nguyên dương bằng cách thêm vào onkeypresstrong inputthẻ.

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

Ở đây, event.charCode >= 48đảm bảo rằng chỉ các số lớn hơn hoặc bằng 0 được trả về, trong khi minthẻ đảm bảo rằng bạn có thể đạt tối thiểu 1 bằng cách cuộn trong thanh đầu vào.


3
Trên Edge bạn có thể nhập "A" vào đây.
Amy Blankenship

10
Bạn vẫn có thể dán số âm
methyl

5

Bạn chỉ có thể sử dụng các cách sau để type="number"chấp nhận các số dương:

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

2
Bạn có thể cố gắng giải thích những gì tuyên bố của bạn làm và tại sao nó giúp? Ngoài ra, bạn có hai đoạn khác nhau. Cái nào đúng?
Aenadon

2
bằng cách thêm thuộc tính bước, bạn hạn chế nhập vào số nguyên và thêm mẫu đảm bảo bất kỳ việc sử dụng phần phân đoạn nào cũng được trường đánh dấu là không hợp lệ nhưng phụ thuộc vào việc triển khai trình duyệt (Firefox đánh dấu trường là màu đỏ khi mất tiêu điểm trong khi Chrome không cho phép bạn nhập giá trị không được phép ở vị trí đầu tiên). Người ta phải xác nhận điều này trên máy chủ / máy khách.
Deepali


3

Thử

<input type="number" pattern="^[0-9]" title='Only Number' min="1" step="1">


Khi bạn xác định một loại bạn cần định dạng cụ thể cho vai trò.
Rogerio de Moraes

7
Đã thử điều này bằng chrome và nó không thực thi mô hình
David Burton

Có cách nào nếu tôi thêm type = "text" thay vì "number" không?
Kapil Verma

1

Nếu cần nhập văn bản , mẫu cũng hoạt động

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

1

Tôi không thể tìm thấy giải pháp hoàn hảo vì một số công việc để nhập nhưng không phải để sao chép và dán, một số là cách khác. Giải pháp này hiệu quả với tôi. Nó ngăn chặn số âm, gõ "e", sao chép và dán văn bản "e".

tạo một chức năng.

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

thêm các thuộc tính này vào đầu vào. điều này ngăn không cho sao chép và dán văn bản không phải số, bao gồm cả "e". bạn cần phải có cả hai cùng nhau để có hiệu lực.

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

Nếu bạn đang sử dụng Vue, bạn có thể tham khảo câu trả lời này tại đây . Tôi đã trích xuất nó thành một mixin có thể được tái sử dụng.


0

thêm mã này vào loại đầu vào của bạn;

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

ví dụ:

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

1
Điều này thực sự khó hiểu cho những ai không hiểu chuyện gì đang xảy ra.
RozzA

Bằng cách này, bạn vẫn có thể dán bất cứ thứ gì vào đầu vào, bảng chữ cái hoặc thậm chí các ký tự đặc biệt
Lê Gia Lễ

0

Giải pháp khác là sử dụng Js để làm cho nó tích cực (tùy chọn tối thiểu có thể bị vô hiệu hóa và không hợp lệ khi người dùng gõ smth) Không thể sử dụng sự kiện tiêu cực nếu không cần thiết và bật ('keydown')!

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

0

Nó phụ thuộc vào việc bạn muốn một trường int hay float. Đây là những gì hai người sẽ trông như thế nào:

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

Trường int có xác nhận chính xác được đính kèm với nó, vì min của nó là 1. Tuy nhiên, trường float chấp nhận 0; để giải quyết vấn đề này, bạn có thể thêm một trình xác nhận ràng buộc nữa :

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 ở đây.

Lưu ý rằng không có giải pháp nào trong số này hoàn toàn ngăn người dùng cố gắng nhập dữ liệu nhập không hợp lệ, nhưng bạn có thể gọi checkValidityhoặcreportValidity tìm hiểu xem người dùng đã nhập dữ liệu hợp lệ chưa.

Tất nhiên, bạn vẫn nên xác thực phía máy chủ vì người dùng luôn có thể bỏ qua xác thực phía máy khách.


0

Thử cái này:

  • Đã thử nghiệm ở góc 8
  • giá trị là tích cực
  • Mã này cũng xử lý nullnegitivegiá trị.
              <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

Nếu bạn cố gắng nhập một số âm, sự kiện onkeyup sẽ chặn điều này và nếu bạn sử dụng mũi tên trên số đầu vào, sự kiện onblur sẽ giải quyết phần đó.

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



-2

Với kiểu nhập văn bản, bạn có thể sử dụng mục này để xác thực tốt hơn,

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

-4

Thử cái này:

Yii2 : Validation rule 

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